从包体内的db链接中选择

时间:2014-04-02 20:55:42

标签: oracle packages database-link

创建包体时,我无法从包体内的另一个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);

如何在包体内包含这些值?

1 个答案:

答案 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;