DBMS_METADATE.GET_DDL 使用

当我们想要查看某个表或者是表空间的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;













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值