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
'sourcecode' 카테고리의 다른 글
nuget 'packages' 요소가 경고로 선언되지 않았습니다. (0) | 2023.10.16 |
---|---|
워드프레스 대시보드가 로드되지 않음 (0) | 2023.10.16 |
jQuery로 선택 요소를 재설정하는 방법 (0) | 2023.10.16 |
ssp 심플 클래스에서 UNION ALL을 사용하는 방법? (0) | 2023.10.16 |
프로세스 리눅스(C 코드)에 대한 열린 파일 설명자 찾기? (0) | 2023.10.16 |