Выберите из ссылки на БД внутри тела пакета

При создании тела пакета я не могу иметь выбор из другой ссылки БД внутри тела пакета? Я не знаю значение имени 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;
Другие вопросы по тегам