Oracle sqlldr是否可以在Oracle 10和11中接受TNS条目作为实例限定符?

the*_*wan 9 oracle tns sqlplus sql-loader

是否可以使用与Oracle 10/11捆绑的sqlldr使用完全限定的TNS条目?

例如,在SQLPlus中:

    sqlplus user/password@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl))) @script.sql
Run Code Online (Sandbox Code Playgroud)

但是使用sqlldr(SQL Loader)似乎直接使用TNS条目存在问题.特别:

    sqlldr user/password@(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'
Run Code Online (Sandbox Code Playgroud)

这是产生的错误消息:

    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
Run Code Online (Sandbox Code Playgroud)

尝试将TNS条目封装在引号中会产生相同的错误.

看看sqlldr文档,并尝试使用'userid'命令行参数无济于事.特别:

sqlldr userid='user/password@(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 'password@(' 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
Run Code Online (Sandbox Code Playgroud)

有意义的是,Oracle希望将用户强制转移到本地实例,以减轻将数据推送到远程主机的I/O. 但支持语法的偏差并不那么直观.其他人遇到类似的问题?

use*_*465 10

fwiw,这家伙发布了这个问题的解决方案

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

是的,有一个单行解决方案,您可以使用TNS连接字符串从命令行执行此操作.关键是格式化连接字符串有点不同,因为必须引用它.此外,必须转义引号和括号(反斜杠):

sqlldr userid=dbuser@\"\(description=\(address=\(host=remote.db.com\)\(protocol=tcp\)\(port=1521\)\)\(connect_data=\(sid=dbsid\)\)\)\"/dbpass control=controlfilename.ctl data=data.csv
Run Code Online (Sandbox Code Playgroud)

请注意,在原始博客帖子中,他在'/ dbpass'前面有一个空格.这会导致sqlldr给出错误:

LRM-00112:参数'userid'不允许多个值


Kev*_*ton 4

您是否尝试过 ezconnect 格式使用 sqlldr 连接到远程数据库?

例如:

sqlldr user/password@//localhost:1521/orcl bad='bad_file.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true'   
Run Code Online (Sandbox Code Playgroud)

请参阅: http: //www.orafaq.com/wiki/EZCONNECT