Возможно ли, чтобы Oracle sqldr принимал запись TNS в качестве квалификатора экземпляра в Oracle 10 и 11?

Можно ли использовать полную запись TNS с помощью sqldr в комплекте с Oracle 10/11?

Например, в SQLPlus:

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

Но при использовании sqldr (загрузчик 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 в кавычки приводит к той же ошибке.

Просмотрел документацию sqldr и попытался использовать аргумент командной строки «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 надеется принудить пользователя к локальному экземпляру, чтобы смягчить ввод-вывод при отправке данных на удаленный хост. Но отклонение в поддерживаемом синтаксисе не так интуитивно понятно. Кто-нибудь еще испытывает подобные проблемы?


person thetwan    schedule 13.09.2011    source источник


Ответы (7)


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». Это приводит к тому, что sqldr выдает ошибку:

LRM-00112: несколько значений не разрешены для параметра 'userid'

person user331465    schedule 11.07.2012
comment
Я также экранировал символы '=', и это сработало. Не тестировал без экранирования '=', как в приведенном выше примере... - person Wouter; 14.10.2015

Вы пробовали формат ezconnect для подключения к удаленной базе данных с помощью sqldr?

e.g:

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

person Kevin Burton    schedule 14.09.2011
comment
Факт, но на вашем месте я бы поместил команду в оболочку \ пакетный файл и запросил бы там пароль :) - person Kevin Burton; 04.03.2019
comment
В итоге я использовал файл оболочки, который генерировал файл параметров и запускал SQL*Loader. Ввод пароля в параметры командной строки sqlldr показывает пароль всем в системе, кто запускает ps -ao args, поэтому я также искал способ избежать этого. - person Pluto; 06.03.2019

Похоже, вам нужно экранировать такие символы, как '(', ')' и '=' с помощью escape-символа '\' (т.е. обратной косой черты), как описано в здесь.

person Senadheera    schedule 20.09.2011

Вы также можете попробовать:

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'
person Benoit    schedule 15.09.2011

Кельвин на 100% прав. Это сработало для меня

Вы можете выполнить загрузчик sql с помощью команды ниже, не делая запись 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'

person Shiva    schedule 15.11.2015

Единственное, что сработало для меня, это использование двух видов кавычек:

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'

person Alex Schröder    schedule 26.01.2015

У меня сработало одиночное цитирование всего не очень ezconnect в пакетном сценарии DOS и в командной строке:

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