如何通過DBLINK取remote DB的DDL
今天在寫一個資料庫結構同步小工具,需要用到dbms_metadata.get_ddl這個包取物件的DDL。這個包取本地物件的DDL是沒有問題的,但在這個工具中,需要通過DBLINK方式取遠端資料庫的DDL,經過一番資料查詢,找到了解決方法。
[@more@]首先嚐試直接在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;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-1035144/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【DBLINK】DBLINK域名問題及與global_name和db_domian的關係
- 通過dblink,資料泵expdp遠端跨版本導庫
- 如何在 12.2.0.1 透過 dblink 線上複製 PDB
- 如何通過WinDbg獲取方法引數值
- ORACLE通過透明閘道器建dblink連線Postgresql的幾個問題OracleSQL
- 如何通過Restful API的方式讀取SAP Commerce Cloud的Product ReferenceRESTAPICloud
- 獲取表空間DDL
- 如何通過Restful API的方式讀取SAP Commerce Cloud的Product圖片RESTAPICloud
- PostgreSQL 函式獲取表DDLSQL函式
- 通過用shellcode獲取shell
- 通過HTTP Header控制快取HTTPHeader快取
- Oracle中獲取TABLE的DDL語句的方法Oracle
- powerbuildr中如何使用dblink連線的表UI
- 達夢DBlink叢集之間通訊搭建
- Grails通過sessionId獲取session物件AISession物件
- JavaScript 通過class獲取元素物件JavaScript物件
- select通過onchange獲取每次改變的值
- DB2 獲取當前DB連線的application id, application handleDB2APP
- 如何通過SQL隱碼攻擊盜取資料庫資訊SQL資料庫
- [Oracle-> MySQL] Oracle通過dblink連線MySQL--Oracle 19c連線到MySQL 5.7OracleMySql
- Oracle DBLink連線數過多的問題(Ora-02020)Oracle
- 通過這次聯合 (union) 查詢瞭解 Laravel DB 的資料繫結Laravel
- 使用Java通過POI讀取EXCEL中的資料JavaExcel
- Java記憶體快取-通過Google Guava建立快取Java記憶體快取GoGuava
- 如何通過注入SQL語句盜取網站管理許可權AHSQL網站
- DB 中興通訊面試面試
- 建立dblink
- MogDB/openGauss學習筆記-獲取物件DDL筆記物件
- Android 通過名稱獲取資源IDAndroid
- 通過反射獲取私有內部類物件反射物件
- kubectl技巧之通過jsonpath擷取屬性JSON
- 通過web url獲取檔案資訊Web
- Unity通過子物件獲取父物件例子Unity物件
- android通過MediaProjection獲取螢幕內容AndroidProject
- MySQL 中如何定位 DDL 被阻塞的問題MySql
- Golang 如何操作DB2的?GolangDB2
- 一款不打擦邊球的後宮遊戲,如何通過製造“反差”取勝?遊戲
- Java記憶體快取-通過Map定製簡單快取Java記憶體快取