2012-02-28 4 views
0

Oracles SQLLoader 유틸리티를 랩핑하는 작은 프로그램이 있습니다. SQLLoader 걸리는 데이터베이스 주소 매개 변수는 TNS 스타일 주소과 같이 보인다 :TNS : Listener to JDBC Url

username/[email protected] 

내 프로그램은 또한 데이터베이스에 액세스 및 사후 부하 진단을 수행하기 위해 JDBC를 사용합니다. 불행히도 현재로서는 다음과 같이 주소를 제공해야합니다.

jdbc:oracle:thin:username/[email protected]:1521:EE 

어쨌든 변환 할 수 있습니까? 나는. JDBC URL이 주어지면 SQLLoader가 취할 TNS 주소로 변환하고 그 반대의 경우도 마찬가지입니다.

답변

0

SQL * Loader 연결에서 TNS 별칭을 사용하고 있습니다 (따라서 schemaname은 일반적으로 적합하지 않지만 실제로 발생할 수 있습니다). 이를 JDBC 문자열과 같은 것으로 변환하는 것은 tnsnames.ora 파일에서 데이터를 파싱하는 것입니다. 이는 수행 할 수는 있지만 사소하지는 않습니다 (그러나 필자는 awk-fu가 좋은 사람이 동의하지 않을 것이라고 확신하지만). 이 파일을 보면 JDBC 값에 해당하는 주소 값이있는 항목을 볼 수 있습니다.

sqlldr username/[email protected]:1521/EE control=... 

당신이 볼 수 있듯이,이 거의입니다 : 다른 길을가는

당신이 TNS 별칭의 장소에서 SQL * 로더 명령 '쉽게 연결'구문을 사용할 수 있습니다만큼 간단합니다 jdbc:oracle:thin: 부분을 추가 (또는 제거)해야하기 때문에 JDBC 주소로 변환 (또는 변환)하는 것이 간단합니다. 단, 최종 분리 문자는 /에서 :으로 변경됩니다. 어떻게 당신이 래퍼 프로그램에 따라 달라집니다 - Windows 배치 파일, * nix 셸 스크립트, C 실행 파일 등. 가장 간단한 방법은 요소를 별도로 가져 와서 다르게 연결하는 것이지만, 그것을 다시 부르는 것.

0

일단 연결되면 (그리고 sysadmin없이) 필요한 데이터베이스를 데이터베이스에서 만들 수 있습니다.

아마도 어리석은 것처럼 보일지 모르지만 유틸리티에서 동일한 매개 변수를 쿼리하면 프로그램하는 데 오랜 시간이 걸릴 것입니다.

SELECT 
    USER 
    ||'/******@' 
    || sys_context('userenv','db_name') as simpleconnection 
    ,'jdbc:oracle:thin:' 
     ||USER 
     ||'/******@' 
     || sys_context('userenv', 'server_host') --host 
     || ':' 
     || sys_context('USERENV', 'SID') --port 
     || ':' 
     || sys_context('userenv','db_name') AS "Oracle Eight" --SID 
    ,'jdbc:oracle:thin:' 
     ||USER 
     ||'/******@' 
     ||sys_context('userenv', 'server_host') --host 
     ||':' 
     ||sys_context('USERENV', 'SID') --port 
     ||'/' 
     || sys_context('userenv','service_name') AS "host form" 
    ,'jdbc:oracle:thin:' 
     ||USER 
     ||'/******@' 
     ||sys_context('userenv', 'ip_address') --ip 
     ||':' 
     ||sys_context('USERENV', 'SID') --port 
     ||'/' 
     || sys_context('userenv','service_name') AS "IP form" 
    ,'jdbc:oracle:thin:' 
     ||USER 
     ||'/******@(description=(address=(host=' 
     ||sys_context('userenv', 'server_host') --host 
     ||')(protocol=' 
     ||sys_context('userenv', 'network_protocol') --protocol 
     ||')(port=' 
     ||sys_context('USERENV', 'SID') --port 
     ||'))(connect_data=(service_name=' 
     || sys_context('userenv','service_name') --service name 
     ||')(server=' 
     ||sys_context('userenv','host') --name of the machine 
     ||')))' AS "TNS form" 
FROM dual d; 

은 BTW 그것은 일기 좋게의 부족, 당신은 매개 변수로 추가 할 수 있기 때문에 연결 문자열에 로그인 자격 증명을 넣어하는 것이 좋습니다 간주 아니에요.