Возможно ли для Oracle sqlldr принять запись TNS в качестве квалификатора экземпляра в Oracle 10 и 11? - PullRequest
9 голосов
/ 14 сентября 2011

Можно ли использовать полностью квалифицированную запись TNS, используя sqlldr в комплекте с Oracle 10/11?

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

Ответы [ 7 ]

10 голосов
/ 11 июля 2012

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'

3 голосов
/ 20 сентября 2011

Похоже, вам нужно экранировать символы, такие как (,) и = с экранирующим символом \, как объяснено в здесь

3 голосов
/ 14 сентября 2011

Вы пробовали формат 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

1 голос
/ 15 ноября 2015

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

ВЫ МОЖЕТЕ ВЫПОЛНИТЬ ПОГРУЗЧИК SQL С НИЖЕ КОМАНДЫ БЕЗ ЗАПИСИ TNS

sqlldr ID пользователя / пароль @ // хост: порт / SERVICE_NAME bad = '/ PATH / FILENAME.bad'control =' / PATH / FILENAME.ctl 'data =' / PATH / FILENAME.csv 'log =' / PATH / FILENAME.log 'direct =' true '

1 голос
/ 15 сентября 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'
0 голосов
/ 16 января 2017

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

sqlldr 'user/password@(description=(address=(host=localhost)(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))' control='control.ctl' data='data.txt'
0 голосов
/ 26 января 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'

...