如何通過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獲取遠端DDL語句
- Oracle DBLINK 抽數以及DDL、DML操作Oracle
- SQL Server通過dblink訪問Oracle資料SQLServerOracle
- 通過DBMS_METADATA.GET_DDL包獲得相關物件ddl語句物件
- 【DBLINK】不可使用 DBLINK在遠端資料庫上執行DDL類SQL資料庫SQL
- 通過flashback_transaction_query查詢最近執行過的所有DDL語句
- iOS如何讀取.db檔案iOS
- 通過dblink,資料泵expdp遠端跨版本導庫
- 【DBLINK】DBLINK域名問題及與global_name和db_domian的關係
- [原始碼]Sqlite是怎麼通過CursorWindow讀DB的原始碼SQLite
- 通過儲存過程執行通過DBLINK的查詢語句失敗-單個語句成功--ORA-00604儲存過程
- DB2 DDL操作引起的GoldenGate錯誤DB2Go
- 通過crontab shell獲取分鐘級別的oracle db time效能指標趨勢變化Oracle指標
- redhat下通過rman自動備份db!Redhat
- 如何獲取expdp出來的dmp檔案中的DDL語句
- ORACLE通過透明閘道器建dblink連線Postgresql的幾個問題OracleSQL
- 使用DBMS_METADATA.GET_DDL獲取物件的DDL指令碼物件指令碼
- 獲取物件DDL語句的方法物件
- 通過EPROCESS獲取程式名
- Mysql 通過 Mysql_install_db 建立多例項MySql
- 如何通過Restful API的方式讀取SAP Commerce Cloud的Product ReferenceRESTAPICloud
- oracle獲取ddl指令碼Oracle指令碼
- Oracle 獲取ddl語句Oracle
- 獲取建tablespace sql ddlSQL
- Oracle 不知使用者的密碼時,如何獲取dblink建立語句Oracle密碼
- 用dbms_metadata.get_ddl獲取ddl語句
- DBMS_METADATE.GET_DDL獲取物件DDL指令碼物件指令碼
- 如何通過SQL隱碼攻擊盜取資料庫資訊SQL資料庫
- 如何通過Restful API的方式讀取SAP Commerce Cloud的Product圖片RESTAPICloud
- 如何通過js和jquery獲取圖片真實的寬度和高度JSjQuery
- 刪除私有dblink的儲存過程儲存過程
- ORACLE通過透明閘道器連線DB2OracleDB2
- Oracle 10.2.0.5 RAC 通過emca 配置 DB ControlOracle
- 通過HTTP Header控制快取HTTPHeader快取
- JavaScript 通過class獲取元素物件JavaScript物件
- 通過用shellcode獲取shell
- 如何通過C#操作Access,本人親測通過C#
- js通過元素的class屬性獲取元素JS