我有一个包含Oracles SQLLoader实用程序的小程序。 SQLLoader采用的数据库地址参数似乎是一个TNS样式的地址,如下所示:
username/password@schemaname
我的程序还使用JDBC访问数据库并执行后加载诊断。不幸的是,您现在需要提供地址:
jdbc:oracle:thin:username/password@172.17.125.131:1521:EE
无论如何转换到这些转换?即如果给出了JDBC url,则转换为SQLLoader将采用的TNS地址,反之亦然。
答案 0 :(得分:0)
您的SQL * Loader连接正在使用TNS别名(因此schemaname
通常不太正确,但可能恰好适合您)。从那里转换成类似于JDBC字符串的东西将涉及从tnsnames.ora
文件解析数据,这是可行的但不是微不足道的(虽然我确信有比我更好的awk-fu的人会不同意)。如果您查看该文件,您应该看到一个条目,其地址值对应于JDBC值。
另一种方式更简单,因为您可以在SQL * Loader命令中使用“easy connect”语法代替TNS别名:
sqlldr username/password@172.17.125.131:1521/EE control=...
正如您所看到的,这只是几乎无法转换为(或来自)JDBC地址,因为您只需要添加(或删除)jdbc:oracle:thin:
部分。但是,最终分隔符从/
更改为:
。你如何改变它将取决于你的包装程序 - 无论是Windows批处理文件,* nix shell脚本,C可执行文件等。最简单的方法可能是分别获取元素并以不同方式连接它们,但取决于你的方式也称之为。
答案 1 :(得分: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;
顺便说一下,将登录凭据放入连接字符串并不是一个好习惯,因为缺少可读性,您可以将它们添加为参数。