Oracle
如何避免在包主體中硬編碼數據庫連結名稱
我有一個 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.
您提到了連結的同義詞,但是遠端包的同義詞呢?