Страницы

Поиск по вопросам

вторник, 13 ноября 2018 г.

Динамическое подключение к другой Oracle БД из PL/SQL или SQL

Надо организовать динамическое подключение к любой из удаленных БД, данные о которых есть в таблице средствами PL/SQL кода.
Можно ли имея таблицу с настроечными параметрами (имя, пароль, TNS), в зависимости от переданного в процедуру параметра (ключа этой таблицы), в коде менять подключение и использовать один и тот же запрос для выборки из одинаковых структур то одной, то другой удаленной БД?


Ответ

TL;DR: Нельзя. Подключение к БД (connect) невозможно выполнить динамически:
exec execute immediate 'connect user/pass@localhost/oradb'; --ORA-00900: invalid SQL statement
так, как это недействительное SQL выражение.

Для выполнения запросов или хранимых функций на удалённой БД используются линки (database links). Например, для задачи как в вопросе:
create database link loopback1 connect to user identified by pass using 'localhost/pdb1'; create database link loopback2 connect to user identified by pass using 'localhost/pdb1'; create database link loopback3 connect to user identified by pass using 'localhost/pdb1';
set serveroutput on size unlimited declare function printRemoteData (dbLink varchar2) return varchar2 is dummy char (1); begin execute immediate 'select dummy from dual@'||dbLink into dummy; -- do something with remote data return 'remote connection using @'||dbLink; end; begin for r in ( select * from user_db_links where regexp_like (db_link, 'loopback\d', 'i')) loop dbms_output.put_line (printRemoteData (r.db_link)); end loop; end; /
Вывод:
remote connection using @LOOPBACK1 remote connection using @LOOPBACK3 remote connection using @LOOPBACK2
Пример решения более реальной задачи см. также по ссылке спроси Тома любезно предоставленной @MaxU.

Комментариев нет:

Отправить комментарий