TNS: слушатель JDBC Url - PullRequest
       21

TNS: слушатель JDBC Url

0 голосов
/ 28 февраля 2012

У меня есть небольшая программа для переноса утилит Oracles SQLLoader. Параметр адреса базы данных, который принимает SQLLoader, выглядит как адрес в стиле TNS, например:

username/password@schemaname

Моя программа также использует JDBC для доступа к базе данных и выполнения диагностики после загрузки. К сожалению, на данный момент вам также необходимо указать адрес:

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

Есть ли способ конвертировать в и из них? То есть если задан URL-адрес JDBC, преобразовать его в TNS-адрес будет SQLLoader, и наоборот.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2015

Вы можете создать нужные вам строки из базы данных после подключения (и без участия системного администратора).

Возможно, это кажется глупым, но запрос одинаковых параметров из любой утилиты займет у вас очень много времени для программирования.

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;

Кстати, не рекомендуется помещать учетные данные для входа в строку подключения, поскольку из-за недостаточной читаемости вы можете добавить их в качестве параметров.

0 голосов
/ 28 февраля 2012

В вашем соединении SQL * Loader используется псевдоним TNS (поэтому schemaname в общем-то не совсем правильно, но может оказаться верным для вас). Преобразование из этого в нечто вроде строки JDBC потребовало бы анализа данных из файла tnsnames.ora, что выполнимо, но не тривиально (хотя я уверен, что кто-то с лучшим awk-fu, чем я, не согласится). Если вы посмотрите в этот файл, вы должны увидеть запись со значениями адреса, соответствующими значениям JDBC.

Переходить в другую сторону намного проще, так как вы можете использовать синтаксис 'easy connect' в вашей команде SQL * Loader вместо псевдонима TNS:

sqlldr username/password@172.17.125.131:1521/EE control=...

Как видите, это почти тривиально для преобразования в (или из) адреса JDBC, так как вам просто нужно добавить (или удалить) часть jdbc:oracle:thin:. За исключением того, что конечный разделитель изменяется с / на :. Как вы это измените, будет зависеть от вашей программы-оболочки - будь то пакетный файл Windows, сценарий оболочки * nix, исполняемый файл C и т. Д. Самый простой способ - получить элементы по отдельности и объединить их по-разному, но это зависит от того, как вы Вы это тоже называете.

...