来自变量的Oracle动态数据库链接

时间:2014-09-15 17:16:05

标签: database oracle dynamic hyperlink

我有3个oracle数据库:db1,db2,db3。 我创建了从db1到db2和db3的数据库链接,称为db002link和db003link。 现在我有一个过程,它将日期作为输入,并根据该输入对表执行不同的操作。其中一个虽然需要连接到db2或db3数据库之一。在执行程序之前,我不知道哪一个程序,因为它取决于程序本身在前面的步骤中收集的数据。 所以我需要连接一些变量来创建db链接,然后通过它连接。

我有变量v_dbnumber,它是varchar(3)并且看起来像'003',并且是从表中选择的结果。我尝试过以下方法:

v_dbconn := 'db'||v_dbnumber||'link'

但是下一步,select * from s1.t1@v_dbconn会得到程序的编译错误:ORA-04052,ORA-00604,ORA-02019指的是不存在的连接。但该对象显示为: @v_dbconn而不是@ db003link。

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:2)

如果您需要语句是动态的,则需要使用动态SQL。

如果您只想使用动态生成的SQL语句打开游标,可以执行类似

的操作
DECLARE
  l_sql_stmt varchar2(1000);
  l_dblink   varchar2(100) := 'db002link';
  l_rc       sys_refcursor;
BEGIN
  l_sql := 'select * from s1.t1@' || l_dblink;
  open l_rc for l_sql;
END;

但是,通常情况下,您正在使用您选择的数据执行某些操作。这通常涉及使用dbms_sqlEXECUTE IMMEDIATE来执行语句并将数据提取到某个局部变量或集合中。假设每个数据库中的表定义相同,您可以执行类似

的操作
EXECUTE IMMEDIATE l_sql
   BULK COLLECT INTO <<some appropriate collection>>

答案 1 :(得分:0)

我的解决方案与Justin非常相似,不过我使用的是带有动态sql的程序。

APPS@tst> CREATE OR REPLACE PROCEDURE test_dblink(
  2      db_link VARCHAR2 )
  3  AS
  4    v_sql VARCHAR2(500);
  5    v_test dual.dummy%TYPE;
  6  BEGIN
  7    v_sql := 'select dummy from dual@'|| db_link;
  8    EXECUTE IMMEDIATE v_sql INTO v_test;
  9    DBMS_OUTPUT.PUT_LINE(v_test);
 10  END;
 11  /

Procedure created.

APPS@tst> commit;

Commit complete.

APPS@tst> 
APPS@tst> 
APPS@tst> 
APPS@tst> begin
  2  test_dblink('db003link');
  3  end;
  4  /
X

PL/SQL procedure successfully completed.

这没有错误处理,它假设将返回一条记录(通常不是一个好的假设)。