利用dbms_metadata.get_ddl查看DDL语句

当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看。

dbms_metadata包中的get_ddl函数详细参数
dT'Vx!g&y9cA0GET_DDL函数返回创建对象的原数据的DDL语句,详细参数如下
f#fT g&j0-- object_type ---需要返回原数据的DDL语句的对象类型
u d5b`{i }F0-- name --- 对象名称
7jj x(R }zq0-- schema ---对象所在的Schema,默认为当前用户所在所SchemaITPUB个人空间@ v6FO `+d!W*N
-- version ---对象原数据的版本ITPUB个人空间q y]YH[z
-- model ---原数据的类型默认为ORACLE
[a'p`qa0-- transform. - XSL-T transform. to be applied.
!Q8fX aT nX|0-- RETURNS: 对象的原数据默认以CLOB类型返回

dbms_metadata包中的get_ddl函数定义ITPUB个人空间 IT*Qh&tgbk^'d7_
FUNCTION get_ddl ( object_type IN VARCHAR2,
mw ^&D%m?tR`0name IN VARCHAR2,
F*Vp aO p9u0schema IN VARCHAR2 DEFAULT NULL,ITPUB个人空间G7aG h&yg2T;M
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
)_F%j*X"Nz8D:|W_0model IN VARCHAR2 DEFAULT 'ORACLE',
b7q0k(o)F.bY&H0transform. IN VARCHAR2 DEFAULT 'DDL') RETURN CLOB;
ITPUB个人空间Ri*rX'h'x4_

注意如果使用sqlplus需要进行下列格式化,特别需要对long进行设置,否则无法显示完整的SQL

set linesize 180ITPUB个人空间#AMIi HY
set pages 999
2viG4YT0n ~&T0set long 90000

查看创建用户表的SQL

查看当前用户表的SQLITPUB个人空间3Is gS)RP!b8}
select dbms_metadata.get_ddl('TABLE','EMPLOYEES') from dual;
8dUz&eBe0查看其他用表或索引的SQL

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

查看创建用户索引的SQLITPUB个人空间n-~cpr P"Pe2Z9A
查看所需表的索引
G#@R(FI j1y_0
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME from user_indexes WHERE table_name='EMP';ITPUB个人空间+n t n;D2d~!R]Xq0P
查看当前用户索引的SQL
8Q5^7C:F;M$wt0
select dbms_metadata.get_ddl('INDEX','PK_DEPT') from dual;

查看其他用户索引的SQLITPUB个人空间P4Q#\5e!W;RL.H&S
select dbms_metadata.get_ddl('INDEX','PK_DEPT','SCOTT‘) from dual;ITPUB个人空间9G8B,D9x9\,B`h
查看创建主键的SQLITPUB个人空间:|&DbOm(Nv ~ Nt
查看所需表的约束ITPUB个人空间hoK L0E&F#~
SQL> select owner, table_name, constraint_name, constraint_type from user_constraints where table_name='EMP';ITPUB个人空间 S*[+Z;G.y8v7V
查看创建主键的SQL
*hW GC,P5Mr0
SELECT DBMS_METADATA.GET_DDL('CONSTRAINT','EMP_PK') FROM DUAL;
Nj _V ~p:P kH0查看创建外键的SQLITPUB个人空间Z5E'Zm3T(b Rp
SQL> SELECT DBMS_METADATA.GET_DDL('REF_CONSTRAINT','EMP_FK_DEPT') FROM DUAL;
#BT*XCp"d^V0查看创建VIEW的语句
ITPUB个人空间!U.H [d)tHP
查看当前用户视图的SQLITPUB个人空间&G"K7b\0wl
SQL> SELECT dbms_metadata.get_ddl('VIEW', 'MY_TABLES')

查看其他用户视图的SQLITPUB个人空间a*coJ L
SQL> SELECT dbms_metadata.get_ddl('VIEW', 'MY_TABLES','SCOTT‘) FROM DUAL;ITPUB个人空间~ED `W
查看创建视图的SQL也可以
/Ac%[b3Y&uN^%X*^0
SQL> select text from user_views where view_name=upper('&view_name');
J8Ax5oqp"w"W0
DBMS_METADATA.GET_DDL的一些使用技巧ITPUB个人空间!V-JZ sk ]9U
1、得到一个用户下的所有表,索引,存储过程,函数的ddl

4k~S4YD/B0SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, u.object_name)ITPUB个人空间1Z%C#UZAz$_$]1P
FROM USER_OBJECTS uITPUB个人空间IdL MUC^n L~8?!E,^
where U.OBJECT_TYPE IN ('TABLE','INDEX','PROCEDURE','FUNCTION‘);

i3t:jg Vs_y02、得到所有表空间的ddl语句
ITPUB个人空间6^Z4g!A k,nC9ZX
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name)ITPUB个人空间2A&f?NOX`^
FROM DBA_TABLESPACES TS;
ITPUB个人空间 ?7xhVY-c8N,H/U
3、得到所有创建用户的ddl

4PH4DMsP S0SELECT DBMS_METADATA.GET_DDL('USER',U.username)
)a*B+YU MLEO!R0FROM DBA_USERS U;
ITPUB个人空间JoVRBDV}
4、去除storage等多余参数

7\ VWOd6V0EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);

|%\t1["w0?F6l+Z0

常见错误

SQL> select dbms_metadata.get_ddl('TABLE','PC','SCOTT') from dual;
L8}p4L``?jL8lM0ERROR:
3GU%x9q.U+e? vD0ORA-19206: Invalid value for query or REF CURSOR parameterITPUB个人空间*v;r_]3|s
ORA-06512: at "SYS.DBMS_XMLGEN", line 83ITPUB个人空间dGDi5J8t!JgR
ORA-06512: at "SYS.DBMS_METADATA", line 345ITPUB个人空间K+|WVD
ORA-06512: at "SYS.DBMS_METADATA", line 410
,T j.|#e1m/\Gl0ORA-06512: at "SYS.DBMS_METADATA", line 449
$l!A)K`IFP @ ZN:a0ORA-06512: at "SYS.DBMS_METADATA", line 615
7L |"~&[ _*h3Y3~$Z;T.`t0ORA-06512: at "SYS.DBMS_METADATA", line 1221
^ q rGi Sb$gT.R0ORA-06512: at line 1

no rows selected

解决办法:运行$ORACLE_HOME/rdbms/admin/catmeta.sql


你可能感兴趣的:(oracle,sql,schema,user,table,constraints)