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ローダー)を使用すると、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

はい、1行の解決策があり、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

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

于 2011-09-14T09:46:21.693 に答える
4

hereで説明されているように、「(」、「)」や「=」などの文字をエスケープ文字「\」(バックスラッシュ) でエスケープする必要があるようです

于 2011-09-20T02:00:48.407 に答える
1

ケルビンは 100 % 正しいです。それは私のために働いた

tns エントリを作成せずに、以下のコマンドで sql loader を実行できます。

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 に答える
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 に答える
0

私にとってうまくいったのは、2種類の引用符を使用することだけでした。

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

DOS バッチ スクリプトとコマンド ラインで、それほど ezconnect ではない全体を単一引用符で囲むと、次のように機能しました。

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 に答える