如何通过DBLINK取REMOTE DB的DDL
今天在寫一個數據庫結構同步小工具,需要用到dbms_metadata.get_ddl這個包取對象的DDL。這個包取本地對象的DDL是沒有問題的,但在這個工具中,需要通過DBLINK方式取遠端數據庫的DDL,經過一番資料查找,找到了解決方法。
首先嘗試直接在dual用dblink,結果出錯:
SQL> SELECT (DBMS_METADATA.GET_DDL('TABLE', 'NEW_A', 'ADMIN')) FROM DUAL@DB230;
SELECT (DBMS_METADATA.GET_DDL('TABLE', 'NEW_A', 'ADMIN')) FROM DUAL@DB230
ORA-31603: object "NEW_A" of type TABLE not found in schema "ADMIN"
ORA-06512: at "SYS.DBMS_METADATA", line 1548
ORA-06512: at "SYS.DBMS_METADATA", line 1585
ORA-06512: at "SYS.DBMS_METADATA", line 1902
ORA-06512: at "SYS.DBMS_METADATA", line 2793
ORA-06512: at "SYS.DBMS_METADATA", line 4333
ORA-06512: at line 1
ADMIN.NEW_A在DB230是存在的,從這個錯誤可以看出,直接在dual表加dblink是沒有意義的,dbms_metadata還是會從本地數據庫查看表是否存在。
接著修改一下SQL,在dbms_metadata也加上dblink,看看結果如何:
SQL> SELECT DBMS_METADATA.GET_DDL@DB230('TABLE', 'NEW_A', 'ADMIN') FROM DUAL@DB230;
SELECT DBMS_METADATA.GET_DDL@DB230('TABLE', 'NEW_A', 'ADMIN') FROM DUAL@DB230
ORA-22992: cannot use LOB locators selected from remote tables
現在錯誤變了,說明在dbms_metadata上加dblink奏效了。新的錯誤很明顯,在SQL方式下,不能直接通過dblink傳送lob,所以需要想辦法把lob轉換為其他類型再傳送:
SQL> SELECT DBMS_LOB.SUBSTR@DB230(DBMS_METADATA.GET_DDL@DB230('TABLE', 'NEW_A', 'ADMIN')) FROM DUAL@DB230;
DBMS_LOB.SUBSTR@DB230(DBMS_MET
--------------------------------------------------------------------------------
CREATE TABLE "ADMIN"."NEW_A"
( "TABLE_NAME" VARCHAR2(32),
"D" DATE,
"BYTES" NUMBER
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "ADMIN_TS"
可以看到,此時遠端數據庫的DDL已經被成功取過來。注意dbms_lob也要加上dblink,表名在遠端數據庫執行這個函數。
最后簡單總結一下:
1.函數和表都可以加dblink,函數加上dblink表示在遠端數據庫執行該函數,表加上dblink表示從遠端數據庫讀取表。
2. 從遠端數據庫取DDL,所有函數及表(dbms_metadata/dbms_lob/dual)都要加上dblink,否則會失敗
3. 此種方法最多返回32767個字節,如果對象的DDL長度大于32767,則只能部分返回。在處理里需特別處理(如分段取DDL)。
4. 如果是在PL/SQL中取遠端數據庫對象的DDL,則可以不用dbms_lob,通過變量賦值的方式不需要dbms_lob截斷,如:
BEGIN
SELECT DBMS_METADATA.GET_DDL@DB230('TABLE','NEW_A','ADMIN') into V FROM DUAL@DB230;
END;
總結
以上是生活随笔為你收集整理的如何通过DBLINK取REMOTE DB的DDL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SPLIT 分区的简单研究
- 下一篇: 一次坏块的处理过程