簡體   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