DBMS_METADATE.GET_DDL 使用,dbmsmetadata

來源:互聯網
上載者:User

DBMS_METADATE.GET_DDL 使用,dbmsmetadata

當我們想要查看某個表或者是資料表空間的DDL的時候,可以利用 dbms_metadata.get_ddl 這個包來查看。


dbms_metadata包中的get_ddl函數詳細參數:

GET_DDL函數返回建立對象的原資料的DDL語句,詳細參數如下
-- object_type      --- 需要返回原資料的DDL語句的物件類型
-- name               --- 對象名稱
-- schema           --- 對象所在的Schema,預設為目前使用者所在所Schema
-- version            --- 對象原資料的版本
-- model              --- 原資料的類型預設為ORACLE
-- transform.        --- XSL-T transform. to be applied.
-- RETURNS          --- 對象的原資料預設以CLOB類型返回


dbms_metadata包中的get_ddl函數定義:

FUNCTION get_ddl ( 

object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform. IN VARCHAR2 DEFAULT 'DDL'

) RETURN CLOB; 


注意:如果使用sqlplus需要進行下列格式化,特別需要對long進行設定,否則無法顯示完整的SQL

set linesize 120    
set pages 1000
set long 10000 


---------------------------------------------------------------------------------------


查看建立使用者表的SQL

查看目前使用者表的SQL: 

SELECT DBMS_METADATA.GET_DDL('TABLE','EMP') FROM DUAL;

查看其他使用者表的SQL:

SELECT DBMS_METADATA.GET_DDL('TABLE','DEPT','SCOTT') FROM DUAL;


查看建立使用者索引的SQL 

查看所需表的索引:

SELECT INDEX_NAME,INDEX_TYPE,TABLE_NAME FROM user_indexes WHERE table_name='EMP'; 

查看目前使用者索引的SQL:

SELECT DBMS_METADATA.GET_DDL ('INDEX','PK_DEPT') FROM DUAL;

查看其他使用者索引的SQL:

SELECT DBMS_METADATA.GET_DDL ('INDEX','PK_DEPT','SCOTT') FROM DUAL;


查看建立主鍵的SQL 

查看所需表的約束:

SELECT OWNER,TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE

FROM user_constraints WHERE TABLE_NAME='EMP';

查看建立主鍵的SQL:

SELECT DBMS_METADATA.GET_DDL('CONSTRAINT','EMP_PK') FROM DUAL; 

查看建立外鍵的SQL:

SELECT DBMS_METADATA.GET_DDL('REF_CONSTRAINT','EMP_FK_DEPT') FROM DUAL; 


查看建立VIEW的語句 

查看目前使用者視圖的SQL:

SELECT DBMS_METADATA.GET_DDL('VIEW', 'MY_TABLES') FROM DUAL; 

查看其他使用者視圖的SQL:

SELECT DBMS_METADATA.GET_DDL('VIEW', 'MY_TABLES','SCOTT') FROM DUAL; 

查看建立視圖的SQL也可以:

SELECT TEXT FROM user_views WHERE view_name='VIEW_NAME';


---------------------------------------------------------------------------


DBMS_METADATA.GET_DDL的一些提示 

得到一個使用者下的所有表,索引,預存程序,函數的ddl語句:

SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, U.OBJECT_NAME)
FROM USER_OBJECTS U
WHERE U.OBJECT_TYPE IN ('TABLE','INDEX','PROCEDURE','FUNCTION'); 

得到所有資料表空間的ddl語句:

SELECT DBMS_METADATA.GET_DDL('TABLESPACE',TS.tablespace_name)
FROM DBA_TABLESPACES TS; 

得到所有建立使用者的ddl語句:

SELECT DBMS_METADATA.GET_DDL('USER',U.username)
FROM DBA_USERS U; 

---------------------------------------------------------------------------


利用DBMS_METADATA.GET_DDL包得到資料庫的對象的ddl指令碼

擷取單個的建表、視圖和建索引的文法:

SET PAGESIZE 1000

SET LINESIZE 120

SET NEWPAGE 0

SET ECHO OFF  /* 顯示檔案中的命令,只顯示執行結果 */

/* SET ECHO ON   顯示檔案中的每條命令及執行結果 */

SET LONG 10000

SPOOL spool/dept.sql

select dbms_metadata.get_ddl('TABLE','TABLE_NAME','SCOTT') from dual; 
select dbms_metadata.get_ddl('VIEW','VIEW_NAME','SCOTT') from dual; 
select dbms_metadata.get_ddl('INDEX','INDEX_NAME','SCOTT') from dual;

SPOOL OFF;


擷取一個SCHEMA下的所有建表、視圖和建索引的文法,以scott為例:

SET PAGESIZE 1000

SET LINESIZE 120

SET NEWPAGE 0

SET ECHO OFF

SET LONG 10000

SPOOL spool/schema.sql

connect scott/tiger;
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u;
SELECT DBMS_METADATA.GET_DDL('VIEW',u.VIEW_name) FROM USER_VIEWS u;
SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name) FROM USER_INDEXES u;

SPOOL OFF;


擷取某個SCHEMA的建全部預存程序的文法:

SET PAGESIZE 1000

SET LINESIZE 120

SET NEWPAGE 0

SET ECHO OFF

SET LONG 10000

SPOOL spool/procedure.sql

SELECT DBMS_METADATA.GET_DDL('PROCEDURE',u.object_name) 

FROM user_objects u WHERE object_type='PROCEDURE';

SPOOL OFF;


擷取某個SCHEMA的建全部函數的文法:

SET PAGESIZE 1000

SET LINESIZE 120

SET NEWPAGE 0

SET ECHO OFF

SET LONG 10000

SPOOL spool/function.sql

SELECT DBMS_METADATA.GET_DDL('FUNCTION',u.object_name) 

FROM user_objects u WHERE object_type='FUNCTION';

SPOOL OFF;



---------------------------------------------------------------------------


執行DBMS_METADATA.GET_DDL報ORA-39212的解決方案


以sys登陸,執行DBMS_METADATA.get_ddl得到某個資料表空間的中繼資料報錯
select DBMS_METADATA.get_ddl('TABLESPACE','PDA') from dual;
ERROR:
ORA-39212: installation error: XSL stylesheets not loaded correctly
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_METADATA_INT", line 7428
ORA-06512: at "SYS.DBMS_METADATA_INT", line 7477
ORA-06512: at "SYS.DBMS_METADATA_INT", line 9495
ORA-06512: at "SYS.DBMS_METADATA", line 1920
ORA-06512: at "SYS.DBMS_METADATA", line 2793

.........


解決方案:
以sysdba許可權的使用者登陸執行以下語句:

SQL> exec dbms_metadata_util.load_stylesheets;

PL/SQL procedure successfully completed.


再次執行成功:

SQL> selectDBMS_METADATA.get_ddl('TABLESPACE','PDA') from dual;













相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.