创建包体时,我无法从包体内的另一个数据库链接中进行选择?我不知道之前的数据库链接名称的值,因此
Create or replace package body sth as
procedure getvalues(linkname in char)
is
begin
select col1 from table1@linkname;
end getvalues;
end sth;
当我创建它时,我得到该表或视图不存在。链接名称我之前不知道它的参数,它将用作:
getvalues(linkname => dbname);
如何在包体内包含这些值?
如果在编译时不知道数据库链接的名称,则需要使用动态 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;