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

jaql4c8m  于 2023-02-15  发布在  Oracle
关注(0)|答案(8)|浏览(213)

是否可以使用与Oracle 10/11捆绑在一起的sqlldr来使用完全限定的TNS条目?
例如,在SQLPlus中:

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

但是使用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'

下面是生成的错误消息:

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/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

Oracle希望强制用户使用本地示例以减轻将数据推送到远程主机时的I/O,这是有道理的,但支持的语法中的偏差并不那么直观。

zzoitvuj

zzoitvuj1#

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

请注意,在最初的博客文章中,他在'/dbpass'前面有一个空格,这导致sqlldr给予错误:
LRM-00112:参数'userid'不允许有多个值

kwvwclae

kwvwclae2#

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

sqlldr user/password@//localhost:1521/orcl bad='bad_file.txt' control='control.ctl' data='data.txt' log='log.txt' direct='true'

参见:http://www.orafaq.com/wiki/EZCONNECT

pqwbnv8z

pqwbnv8z3#

看起来您需要使用转义字符“\”(即反斜杠)对“(”、“)”和“=”等字符进行转义,如here中所述。

klsxnrf1

klsxnrf14#

您也可以尝试:

sqlldr user/password@TNS:(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'
vyu0f0g1

vyu0f0g15#

凯尔文是100%正确的,对我很有效
您可以使用以下命令执行sql loader,而无需创建tns条目
sqlldr userid/password@//host:port/SERVICE_NAME bad='/PATH/FILENAME.bad' control='/PATH/FILENAME.ctl' data='/PATH/FILENAME.csv' log='/PATH/FILENAME.log' direct='true'

xsuvu9jc

xsuvu9jc6#

唯一对我有效的方法是使用两种引语:
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'

fdbelqdn

fdbelqdn7#

在DOS批处理脚本和命令行中,我可以用单引号将整个not-so-ezconnect引起来:

sqlldr 'user/password@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))' control='control.ctl' data='data.txt'
w8biq8rn

w8biq8rn8#

我可以通过在连接字符串中使用no spaces并在Windows Server中的正常**命令提示符(CMD)**中使用'作为转义字符来运行相同的命令来修复此问题。
powershell中的相同命令仍抛出错误
仅为powershell/CMD用户发布

相关问题