Выберите из ссылки на БД внутри тела пакета
При создании тела пакета я не могу иметь выбор из другой ссылки БД внутри тела пакета? Я не знаю значение имени dblink из ранее, поэтому
Create or replace package body sth as
procedure getvalues(linkname in char)
is
begin
select col1 from table1@linkname;
end getvalues;
end sth;
Когда я создаю это, я получаю, что таблица или представление не существует.. Имя ссылки, из которого я не знаю его, перед этим его параметр in, который будет использоваться как:
getvalues(linkname => dbname);
Как вы можете иметь эти значения внутри тела пакета?
1 ответ
Если вы не знаете имя ссылки на базу данных во время компиляции, вам нужно использовать динамический SQL. Независимо от того, используете ли вы динамический SQL или статический SQL, процедура не может просто выполнить оператор SQL. Это должно было бы сделать что-то с результатами. Вы могли бы открыть sys_refcursor
либо как локальная переменная, либо как OUT
параметр. Вы можете перебирать результаты, извлекать данные и что-то делать с результатами. Тот факт, что вы объявили процедуру, а не функцию, подразумевает, что вы хотите как-то изменить состояние базы данных, а не просто возвращать sys_refcursor
, Но название процедуры подразумевает, что, возможно, вы действительно хотите функцию, которая возвращает sys_refcursor
,
Если вы действительно хотите функцию, которая возвращает sys_refcursor
CREATE OR REPLACE FUNCTION getValues( p_dblink IN VARCHAR2 )
RETURN SYS_REFCURSOR
IS
l_rc SYS_REFCURSOR;
BEGIN
OPEN l_rc FOR 'SELECT col1 FROM table1@' || p_dblink;
RETURN l_rc;
END;