【问题标题】:Oracle dynamic database link from variables来自变量的 Oracle 动态数据库链接
【发布时间】:2014-09-15 17:16:04
【问题描述】:

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

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: database oracle dynamic hyperlink


    【解决方案1】:

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

    【讨论】:

    • 感谢您的指导。解决了。​​
    【解决方案2】:

    我的解决方案与贾斯汀的解决方案非常相似,尽管我使用的是带有动态 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.
    

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

    【讨论】:

    • 谢谢,我采用了同样的方法,实现了一个过程。
    猜你喜欢
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    相关资源
    最近更新 更多