创建包体时,我无法从包体内的另一个db链接中进行选择?我不知道之前的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);
如何在包体内包含这些值?
答案 0 :(得分:4)
如果您在编译时不知道数据库链接的名称,则需要使用动态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;