Oracle

如何避免在包主體中硬編碼數據庫連結名稱

  • August 4, 2018

我有一個 PL/SQL 包,它使用數據庫連結從遠端 DB2 數據庫複製數據。為了保持包配置獨立,我將遠端表包裝在一個視圖中。但是單個表中的單個欄位讓我很頭疼。它是一個 char(1) 欄位,用作位向量。因為編碼不同,它會被重新編碼和加擾,所以我必須使用 DBMS_HS_PASSTHROUGH 更新它:

C := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@remotedb1;
DBMS_HS_PASSTHROUGH.PARSE@remotedb1(C, 'SELECT PKEY, HEX(FLAGS) FROM TABLE1' ) ;
LOOP
  NR := DBMS_HS_PASSTHROUGH.FETCH_ROW@remotedb1(C);
  EXIT WHEN NR = 0;

  DBMS_HS_PASSTHROUGH.GET_VALUE@remotedb1(C, 1, M_PKEY);
  DBMS_HS_PASSTHROUGH.GET_VALUE@remotedb1(C, 2, M_FLAGS);

  UPDATE TABLE1
  SET FLAGS = M_FLAGS
  WHERE PKEY = M_PKEY;

END LOOP;
DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@remotedb1(C);

現在,我的包主體中有一個特定的 db-link 名稱,remotedb1而我需要經常將其重新定位到另一個 db-link。我嘗試為 db-link 創建同義詞,但這不起作用。&&variable除了使用 a並從原始碼重新編譯之外,還有其他方法嗎?將每個電話包裝在EXECUTE IMMEDIATE工作中嗎?

將 DBMS_HS_PASSTHROUGH 組件的每次呼叫更改為動態 sql 語句(立即執行)是可能的,但我更喜歡以下方法。

  • 對於遠端數據庫的視圖,可以在包裝該對象的本地數據庫上創建視圖。
  • 對於函式過程,可以在本地數據庫上創建包裝這些對象的包、函式和過程。

您已經通過為遠端表創建視圖來實現此方法。 從概念上講,dbms_hs_passthrough包是遠端數據庫上的一個包。因此,它的組件被呼叫時附加了數據庫連結,而不是作為字元串參數提供的數據庫連結。因此,您應該為 dbms_hs_passthrough 包編寫一個包裝器包。dbms_hs_passthrough-components 的定義可以在Database PL/SQL Packages and Types Reference中找到,或者您可以從數據庫字典中獲得它(例如,通過在sqlplus 中發出describe 命令)。如果您更改數據庫連結名稱,您只需更改您的視圖和包裝器包的小主體。

也許您可以為遠端包創建一個同義詞,並在您想要指向另一個包時將其切換出來?

SQL> execute dbms_workload_repository.create_snapshot@test;

PL/SQL procedure successfully completed.

SQL> create synonym testp for dbms_workload_repository@test;

Synonym created.

SQL> execute testp.create_snapshot;

PL/SQL procedure successfully completed.

您提到了連結的同義詞,但是遠端包的同義詞呢?

引用自:https://dba.stackexchange.com/questions/69130