我有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。
有人可以帮帮我吗?
答案 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_sql
或EXECUTE 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.
这没有错误处理,它假设将返回一条记录(通常不是一个好的假设)。