Как передать ссылку на базу данных в качестве переменной в хранимой процедуре - PullRequest
0 голосов
/ 31 января 2019

У меня есть форма на столе.Записи в форме будут определять ссылку для использования в запросе.Чтобы это работало, мне нужно создать запрос, который будет выбирать таблицу и, следовательно, генерировать ссылку для использования.Это не тот SQL, который я буду использовать, но принцип тот же.Я перепробовал все виды баров и кавычек, но я не могу заставить оракула скомпилировать процедуру и использовать строку в таблице для выполнения запроса по ссылке.Вы можете помочь?

--Insert the name of a db_link here, in this case
--All that the table contains is "DEV01"

create table LINK_NAME
(LINK_NAME VARCHAR2(20));

--Now create a procedure to test selecting from the link
--Just using the string in the table to get its name:

create or replace procedure TEST_LINK is
v_link_name varchar2(10);
v_blah varchar2(10);
v_link varchar2(10);

--This passes the string "DEV01" into variable v_link:
cursor c1 is select link_name into v_link from link_name;

--This works, directly referencing the link name:
--cursor c2 is select name into v_blah from v$database@DEV01;

--This doesn't work, when I reference the link using the variable I've passed.
cursor c2 is select name into v_blah from v$database@||v_link;
--How can I get oracle to accept the variable to define the name of the link?

begin
open c1;
loop
fetch c1 into v_link;
EXIT WHEN c1%NOTFOUND;
end loop;

open c2;
loop
fetch c2 into v_blah;
EXIT WHEN c2%NOTFOUND;
end loop;
--This just lets you check the database is doing the right thing:
select distinct link_name into v_link_name from pdu.link_name;
dbms_output.put_line(v_link_name||' and '||v_blah);
end ;

1 Ответ

0 голосов
/ 31 января 2019

Использование курсора для получения одной строки ... Просто попытайтесь избежать.

 create or replace procedure TEST_LINK 
 is
   v_blah      varchar2(10);
   v_link      varchar2(10);
 begin

 select link_name
 into   v_link
 from   link_name;

 execute immediate 'select count(1) from v$database@'||v_link
 into  v_blah;

 dbms_output.put_line(v_link||' and '||v_blah);
 end test_link;
...