[英]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_sql
或EXECUTE 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.