0

创建包主体时,我无法从包主体内的另一个数据库链接中进行选择?因此,我不知道之前的 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);

你怎么能在包体内有这些值?

4

1 回答 1

4

如果您在编译时不知道数据库链接的名称,则需要使用动态 SQL。但是,无论您使用的是动态 SQL 还是静态 SQL,一个过程都不​​能只运行一条 SQL 语句。它必须与结果有关。您可以将 asys_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;
于 2014-04-02T21:10:58.920 回答