繁体   English   中英

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

[英]Oracle dynamic database link from variables

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

我有变量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。

有人可以帮我吗?

如果您需要该语句是动态的,则需要使用动态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>>

我的解决方案与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.

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM