sourcecode

Oracle 10 및 11에서 Oracle sqlldr이 TNS 항목을 인스턴스 한정자로 받아들이는 것이 가능합니까?

copyscript 2023. 10. 16. 22:00
반응형

Oracle 10 및 11에서 Oracle sqlldr이 TNS 항목을 인스턴스 한정자로 받아들이는 것이 가능합니까?

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를 완화하고자 하는 것은 당연합니다.하지만 지원되는 구문의 편차는 그리 직관적이지 않습니다.비슷한 문제를 겪은 사람이 또 있습니까?

이 남자는 이 문제에 대한 해결책을 올렸습니다.

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'에 여러 값이 허용되지 않습니다.

sqlldr을 사용하여 원격 db에 연결하기 위해 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

여기에 설명된 것처럼 탈출 캐릭터 '\'(백슬래시)로 '()', ''', '='를 탈출해야 할 것 같습니다.

다음을 시도해 볼 수도 있습니다.

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'

켈빈은 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'

저에게 도움이 된 것은 두 가지 종류의 인용문을 사용하는 것뿐이었습니다.

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'

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'

같은 명령어를 실행하여 문제를 해결할 수 있었습니다.no spaces연결 문자열 및 사용'창 서버의 일반 명령 프롬프트(CMD)에서 탈출 문자로 표시됩니다.

powershell의 동일한 명령이 여전히 throw 오류입니다.

파워셸/CMD 사용자를 위한 게시물만 제공

언급URL : https://stackoverflow.com/questions/7409503/is-it-possible-for-oracle-sqlldr-to-accept-a-tns-entry-as-an-instance-qualifier

반응형