2011-09-13 42 views
7

是否可以使用Oracle 10/11捆綁的使用sqlldr的完全合格的TNS條目?Oracle sqlldr是否可以接受TNS條目作爲Oracle 10和11中的實例修飾符?

例如,在sqlplus:

sqlplus user/[email protected](description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) @script.sql 

但是用SQLLDR(SQL裝載機)也似乎與直接使用TNS條目的問題。具體做法是:

sqlldr user/[email protected](description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) bad='bad_file.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true' 

這裏是所產生的錯誤消息:

LRM-00116: syntax error at 'address' following '(' 

    SQL*Loader: Release 11.2.0.1.0 - Production on Tue Sep 13 15:41:54 2011 

    Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 

    SQL*Loader-100: Syntax error on command-line 

試圖封裝在引號中TNS條目產生相同的誤差。

看看sqlldr文檔,並試圖使用'userid'命令行參數無濟於事。具體做法是:

sqlldr userid='user/[email protected](description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))' bad='bad.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true' 
LRM-00116: syntax error at '[email protected](' following '=' 

SQL*Loader: Release 11.2.0.1.0 - Production on Tue Sep 13 15:44:17 2011 

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 

SQL*Loader-100: Syntax error on command-line 

這是有道理的,甲骨文會希望給用戶強迫到本地實例,以減輕推送數據到遠程主機的I/O。但支持語法的偏差並不那麼直觀。其他人遇到類似的問題?

回答

1

你還可以嘗試:

sqlldr user/[email protected]:(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) bad='bad_file.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true' 
+0

我得到同樣的錯誤作爲無「TNS :「 – leo

3

看起來你需要逃避像字符(,)和=用轉義字符\如here

6

fwiw,這傢伙poste d這個問題

http://www.simplemancomplexmachine.com/2011/10/sqlldr-one-liner-to-remote-database.html

Yes there is a one-line solution and you can use a TNS connect string to do this from the command line. The key is formatting the connection string a little different as it must be quoted. Additionally the quotes and parentheses must be escaped (backslashes):

sqlldr [email protected]\"\(description=\(address=\(host=remote.db.com\)\(protocol=tcp\)\(port=1521\)\)\(connect_data=\(sid=dbsid\)\)\)\"/dbpass control=controlfilename.ctl data=data.csv 

注意一種解決方案,在原來的博客文章他在「/ DBPASS」前面的空間。這將導致SQLLDR給錯誤:

LRM-00112:不允許參數「用戶ID」

+0

我也逃過了'='字符,它工作。沒有在上面的示例中沒有轉義'='的測試... – Wouter

0

只爲我工作的事多值是採用兩種報價:

sqlldr user/[email protected]'"(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))"' bad='bad_file.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true'

+0

沒有爲我工作,同樣的錯誤... – Wouter

-1

開爾文是100%正確的。它的工作對我來說

你可以執行SQL裝載機指令低於未做TNS條目

SQLLDR用戶名/密碼@ //主機:端口/ SERVICE_NAME壞= '/ PATH/FILENAME.bad' 控制=」 /PATH/FILENAME.ctl'data ='/ PATH/FILENAME.csv'log ='/ PATH/FILENAME。日誌」直接=‘真’

0

單報價整體不那麼EZCONNECT在DOS批處理腳本和命令行上爲我工作:

sqlldr 'user/[email protected](description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))' control='control.ctl' data='data.txt'