10

是否可以使用与 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 是有道理的。但是支持的语法的偏差并不是那么直观。还有其他人遇到类似的问题吗?

4

7 回答 7

14

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' 不允许有多个值

于 2012-07-11T15:48:52.043 回答
4

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

例如:

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

于 2011-09-14T09:46:21.693 回答
4

看起来您需要使用转义字符 '\' (即反斜杠)来转义 '(', ')' 和 '=' 等字符,如此所述。

于 2011-09-20T02:00:48.407 回答
1

你也可以试试:

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'
于 2011-09-15T15:07:13.613 回答
1

开尔文是 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'

于 2015-11-15T15:57:34.023 回答
0

唯一对我有用的是使用两种引号:

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'

于 2015-01-26T14:13:03.873 回答
0

单引用整个 not-so-ezconnect 在 DOS 批处理脚本和命令行中为我工作:

sqlldr 'user/password@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))' control='control.ctl' data='data.txt'
于 2017-01-16T09:43:34.907 回答