Надо организовать динамическое подключение к любой из удаленных БД, данные о которых есть в таблице средствами 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.
Комментариев нет:
Отправить комментарий