0

我有一个包装 Oracles SQLLoader 实用程序的小程序。SQLLoader 采用的数据库地址参数似乎是一个 TNS 样式的地址,如下所示:

username/password@schemaname

我的程序还使用 JDBC 访问数据库并执行加载后诊断。不幸的是,目前您还需要提供地址,如下所示:

jdbc:oracle:thin:username/password@172.17.125.131:1521:EE

反正有没有转换成这些?即,如果给定 JDBC url,则转换为 SQLLoader 将采用的 TNS 地址,反之亦然。

4

2 回答 2

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 可执行文件等。最简单的方法可能是分别获取元素并以不同方式连接它们,但取决于您的方式重新调用它。

于 2012-02-28T09:12:48.433 回答
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;

顺便说一句,将登录凭据放入连接字符串不是一个好习惯,因为缺乏可读性,您可以将它们添加为参数。

于 2015-11-12T19:01:05.287 回答