2012-02-28 61 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值的條目。

走另一條路是更簡單,因爲你可以在地方TNS別名使用您的SQL * Loader的命令「易連接」的語法:

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

正如你所看到的,這是幾乎因爲您只需添加(或刪除)jdbc:oracle:thin:部件就可以將其轉換爲(或來自)JDBC地址。除了最後的分隔符從/更改爲:。你如何改變這將取決於你的包裝程序 - 無論是Windows批處理文件,* nix shell腳本,C可執行文件等。最簡單的方法可能是單獨獲取元素並將它們連接成不同的方式,但取決於你如何「重新調用它。

0

一旦連接(並且不是系統管理員),您可以從數據庫創建所需的所需字符串。

也許看起來很愚蠢,但從任何實用程序查詢相同的參數將花費很長時間進行編程。

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它不被認爲是很好的做法,把登錄憑據到連接字符串,因爲缺乏可讀性,你可以將其添加爲參數。