使用SQL Developer等工具可以方便/快速地生成一个表的SQL语句(DDL语句),其实我们也可以用SQL生成一个表的DDL相关语句。这里分享一个这样的SQL,如下所示:
/*-***********************************************************************************************
--ScriptName : get_table_ddl.sql
--Author : 潇湘隐者
--CreateDate : 2018-06-15
--Description : 输出表、表的注释、表的索引、约束、对象权限的DDL语句.
**************************************************************************************************
--Parameters : 参数说明
**************************************************************************************************
TABLE_OWNER 表的OWNER
TABLE_NAME 表名
**************************************************************************************************
注意事项:
DBMS_METADATA.SET_TRANSFORM_PARAM中的STORAGE,SEGMENT_ATTRIBUTES,TABLESPACE等属性设置会
影响脚本的输出,根据实际需求调整这些参数。
**************************************************************************************************
Modified Date Modified User Version Modified Reason
**************************************************************************************************
2018-06-15 潇湘隐者 V1.0 新建此脚本
2022-05-02 潇湘隐者 V1.1 增加TRIM函数,防止用户输入时,带入空格导致
查询结果不正确;另外,添加部分英文注释
**************************************************************************************************/
set echo off
SET LONG 20000 LONGCHUNKSIZE 20000 PAGESIZE 0 LINESIZE 1000 FEEDBACK OFF VERIFY OFF TRIMSPOOL ON SERVEROUTPUT ON
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR', true);
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',true);
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',true);
--用于生成间隔分区表的,默认间隔分区表不生成自动创建的分区
EXECUTE dbms_metadata.set_transform_param(dbms_metadata.SESSION_TRANSFORM,'EXPORT',true);
SELECT 'the current host_name is ' || host_name || '. the instance_name is ' || instance_name
FROM V$INSTANCE;
SHOW USER;
ACCEPT TABLE_OWNER CHAR PROMPT 'Enter Table Owner : '
ACCEPT TABLE_NAME CHAR PROMPT 'Enter Table Name : '
--table definition
SELECT '--table''s definition ...' FROM DUAL;
SELECT DBMS_METADATA.GET_DDL ('TABLE', OBJECT_NAME, OWNER)
FROM DBA_OBJECTS
WHERE owner = UPPER (TRIM('&TABLE_OWNER'))
AND object_name = UPPER (TRIM('&TABLE_NAME'))
AND object_type = 'TABLE';
--table comment and column comment
SELECT '--table''s comment and column''s comment...' FROM DUAL;
SELECT DBMS_METADATA.GET_DEPENDENT_DDL ('COMMENT', TABLE_NAME, OWNER)
FROM (SELECT table_name, owner
FROM DBA_COL_COMMENTS
WHERE owner = UPPER (TRIM('&TABLE_OWNER'))
AND table_name = UPPER (TRIM('&TABLE_NAME'))
AND comments IS NOT NULL
UNION
SELECT table_name, owner
FROM DBA_TAB_COMMENTS
WHERE owner = UPPER (TRIM('&TABLE_OWNER'))
AND table_name = UPPER (TRIM('&TABLE_NAME'))
AND comments IS NOT NULL);
--index definition
SELECT '--table''s index definition...' FROM DUAL;
SELECT DBMS_METADATA.GET_DEPENDENT_DDL ('INDEX', TABLE_NAME, TABLE_OWNER)
FROM (SELECT table_name, table_owner
FROM Dba_indexes
WHERE table_owner = UPPER (TRIM('&TABLE_OWNER'))
AND table_name = UPPER (TRIM('&TABLE_NAME'))
AND index_name NOT IN
(SELECT constraint_name
FROM DBA_CONSTRAINTS
WHERE table_name = table_name
AND constraint_type = 'P')
AND ROWNUM = 1);
--trigger definition
SELECT '--table''s trigger definition....' FROM DUAL;
SELECT DBMS_METADATA.GET_DDL ('TRIGGER', trigger_name, owner)
FROM Dba_triggers
WHERE table_owner = UPPER (TRIM('&TABLE_OWNER'))
AND table_name = UPPER (TRIM('&TABLE_NAME'));
--referenced contraint definition
SELECT '--table''s referenced contraint definition....' FROM DUAL;
SELECT DBMS_METADATA.GET_DEPENDENT_DDL ('REF_CONSTRAINT', table_name, OWNER)
FROM DBA_CONSTRAINTS
WHERE owner = UPPER (TRIM('&TABLE_OWNER'))
AND table_name = UPPER (TRIM('&TABLE_NAME'))
AND CONSTRAINT_TYPE = 'R'
AND ROWNUM = 1;
--table constraint definition
SELECT '--table''s constraint definition....' FROM DUAL;
SELECT DBMS_METADATA.GET_DEPENDENT_DDL ('CONSTRAINT', TABLE_NAME, OWNER)
FROM DBA_CONSTRAINTS
WHERE owner = UPPER (TRIM('&TABLE_OWNER'))
AND table_name = UPPER (TRIM('&TABLE_NAME'))
AND CONSTRAINT_TYPE <> 'R'
AND ROWNUM = 1;
--table's grant definition
SELECT '--table''s grant right definition....' FROM DUAL;
SELECT DBMS_METADATA.get_dependent_ddl ('OBJECT_GRANT', TABLE_NAME, OWNER)
FROM DBA_TAB_PRIVS
WHERE owner = UPPER (TRIM('&TABLE_OWNER'))
AND table_name = UPPER (TRIM('&TABLE_NAME'))
AND ROWNUM = 1;
--table's synonym definition
SELECT '--table''s synonym definition....' FROM DUAL;
SELECT DBMS_METADATA.GET_DDL ('SYNONYM', synonym_name, owner)
FROM dba_synonyms
WHERE table_owner = UPPER (TRIM('&TABLE_OWNER'))
AND table_name = UPPER (TRIM('&TABLE_NAME'));
/
undefine TABLE_OWNER;
undefine TABLE_NAME;
在SQL*Plus中调用get_table_ddl.sql,执行后,输入&table_owner,&table_name两个参数,就可以得到一个表的DDL相关语句。
原文始发于微信公众号(DBA闲思杂想录):Oracle脚本分享:get_table_ddl.sql
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/227969.html