写了个存储过程获得table的完整定义(转载)
2014-11-26 22:19
393 查看
包括create table, comment, index, trigger, object grant.不知道还缺啥?
我放在了自己常用的一个package里(dbms_ut 包,包括常用脚本)。
过程如下:
PROCEDURE get_table_ddl(
p_table_name IN VARCHAR2,
p_owner IN VARCHAR2 DEFAULT USER,
p_storage IN BOOLEAN DEFAULT TRUE,
p_segment_attributes IN BOOLEAN DEFAULT TRUE,
p_ref_constraints IN BOOLEAN DEFAULT FALSE,
p_constraints_as_alter IN BOOLEAN DEFAULT FALSE
)
IS
v_temp VARCHAR2(1024) := '';
v_table_ddl CLOB := '';
v_comment_ddl CLOB := '';
v_constraint_ddl CLOB := '';
v_ref_constraint_ddl CLOB := '';
v_index_ddl CLOB := '';
v_trigger_ddl CLOB := '';
v_object_grant_ddl CLOB := '';
BEGIN
--输出信息采用缩排或换行格式化
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'PRETTY', FALSE);
--确保每个语句都带分号
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SQLTERMINATOR', TRUE);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'TABLESPACE', TRUE);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS', TRUE);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'REF_CONSTRAINTS',
p_ref_constraints);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS_AS_ALTER',
p_constraints_as_alter);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'STORAGE', p_storage);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SEGMENT_ATTRIBUTES',
p_segment_attributes);
--get table ddl
BEGIN
SELECT REPLACE(DBMS_METADATA.get_ddl('TABLE', UPPER(p_table_name), UPPER(p_owner)), '"', '')
INTO v_table_ddl
FROM DUAL;
put_line(v_table_ddl, TRUE, FALSE);
EXCEPTION
WHEN OTHERS THEN
put_line('--no object:' || p_table_name);
v_temp := SQLERRM;
put_line(v_temp);
RETURN;
END;
--get comment ddl
BEGIN
SELECT DBMS_METADATA.get_dependent_ddl('COMMENT', UPPER(p_table_name), UPPER(p_owner))
INTO v_comment_ddl
FROM DUAL;
put_line(v_comment_ddl, TRUE, FALSE);
EXCEPTION
WHEN e_ora_31608 THEN
put_line('--no comment');
WHEN OTHERS THEN
put_line('--no comment');
put_line(SQLERRM);
END;
--get constraint ddl
BEGIN
SELECT DBMS_METADATA.get_dependent_ddl('CONSTRAINT', UPPER(p_table_name), UPPER(p_owner))
INTO v_constraint_ddl
FROM DUAL;
put_line(v_constraint_ddl, TRUE, FALSE);
SELECT DBMS_METADATA.get_dependent_ddl('REF_CONSTRAINT', UPPER(p_table_name), UPPER(p_owner))
INTO v_ref_constraint_ddl
FROM DUAL;
put_line(v_ref_constraint_ddl, TRUE, FALSE);
EXCEPTION
WHEN e_ora_31608 THEN
put_line('--no constraint');
WHEN OTHERS THEN
put_line('--no constraint');
put_line(SQLERRM);
END;
--get index ddl
BEGIN
SELECT REPLACE(
DBMS_METADATA.get_dependent_ddl('INDEX', UPPER(p_table_name), UPPER(p_owner)),
'"',
''
)
INTO v_index_ddl
FROM DUAL;
put_line(v_index_ddl, TRUE, FALSE);
EXCEPTION
WHEN e_ora_31608 THEN
put_line('--no index');
WHEN OTHERS THEN
put_line('--no index');
put_line(SQLERRM);
END;
-- get trigger ddl
BEGIN
SELECT DBMS_METADATA.get_dependent_ddl('TRIGGER', UPPER(p_table_name), UPPER(p_owner))
INTO v_trigger_ddl
FROM DUAL;
put_line(v_trigger_ddl, TRUE, FALSE);
EXCEPTION
WHEN e_ora_31608 THEN
put_line('--no trigger');
WHEN OTHERS THEN
put_line('--no trigger');
put_line(SQLERRM);
END;
-- get object grant ddl
BEGIN
SELECT REPLACE(
DBMS_METADATA.get_dependent_ddl('OBJECT_GRANT', UPPER(p_table_name), UPPER(p_owner)),
'"',
''
)
INTO v_object_grant_ddl
FROM DUAL;
put_line(v_object_grant_ddl, TRUE, TRUE);
EXCEPTION
WHEN e_ora_31608 THEN
put_line('--no object grant');
WHEN OTHERS THEN
put_line('--no object grant');
put_line(SQLERRM);
END;
END;
测试一下:
先建立测试表:
SQL> CREATE TABLE tab_test2 (col2 VARCHAR2(10) PRIMARY KEY);
Table created.
SQL> CREATE TABLE tab_test
2 (
3 col1 NUMBER(10) CONSTRAINT pk_test PRIMARY KEY,
4 col2 VARCHAR2(10) CONSTRAINT fk_test REFERENCES tab_test2 (col2),
5 col3 VARCHAR2(10) DEFAULT 'test'
6 );
Table created.
SQL> COMMENT ON TABLE tab_test IS 'table test';
Comment created.
SQL> COMMENT ON COLUMN tab_test.col1 IS 'table test col1';
Comment created.
SQL> COMMENT ON COLUMN tab_test.col2 IS 'table test col2';
Comment created.
SQL> CREATE INDEX idx_test ON tab_test(col2,col3);
Index created.
SQL> CREATE OR REPLACE TRIGGER trg_test
2 AFTER INSERT OR UPDATE OR DELETE
3 ON tab_test
4 FOR EACH ROW
5 BEGIN
6 DBMS_OUTPUT.put_line('heihei!');
7 END;
8 /
Trigger created.
SQL> GRANT SELECT,UPDATE ON tab_test TO utcore;
Grant succeeded.
执行过程获得table的完整定义:
SQL> set serverout on
SQL> exec dbms_ut.get_table_ddl('tab_test');
------------------------------------------------------------
CREATE TABLE WACOS.TAB_TEST (COL1 NUMBER(10,0), COL2 VARCHAR2(10), COL3
VARCHAR2(10) DEFAULT 'test', CONSTRAINT PK_TEST PRIMARY KEY (COL1) USING INDEX
PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576
MINEXTENTS 1 MAXEXTENTS 21474
83645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE WACOS ENABLE) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0 FREELISTS
1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE WACOS ;
------------------------------------------------------------
COMMENT ON COLUMN "WACOS"."TAB_TEST"."COL1" IS 'table test col1';
COMMENT ON COLUMN "WACOS"."TAB_TEST"."COL2" IS 'table test col2';
COMMENT
ON TABLE "WACOS"."TAB_TEST" IS 'table test';
------------------------------------------------------------
ALTER TABLE "WACOS"."TAB_TEST" ADD CONSTRAINT "PK_TEST" PRIMARY KEY ("COL1")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT
1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST
GROUPS 1 BUFFER_POOL D
EFAULT) TABLESPACE "WACOS" ENABLE;
------------------------------------------------------------
ALTER TABLE "WACOS"."TAB_TEST" ADD CONSTRAINT "FK_TEST" FOREIGN KEY ("COL2")
REFERENCES "WACOS"."TAB_TEST2" ("COL2") ENABLE;
------------------------------------------------------------
CREATE INDEX WACOS.IDX_TEST ON WACOS.TAB_TEST (COL2, COL3) PCTFREE 10
INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1
MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
DEFAULT) TABLESPACE WACOS ;
CREATE UNIQUE INDEX WACOS.PK_TEST ON WACOS.TAB_TEST (COL1) PCTFREE 10 INITRANS 2
MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE WACOS ;
------------------------------------------------------------
CREATE OR REPLACE TRIGGER "WACOS"."TRG_TEST"
AFTER INSERT OR UPDATE OR
DELETE
ON tab_test
FOR EACH ROW
BEGIN
DBMS_OUTPUT.put_line('heihei!');
END;
/
ALTER TRIGGER "WACOS"."TRG_TEST"
ENABLE;
------------------------------------------------------------
GRANT SELECT ON WACOS.TAB_TEST TO UTCORE;
GRANT UPDATE ON WACOS.TAB_TEST
TO UTCORE;
------------------------------------------------------------
PL/SQL procedure successfully completed.
SQL>
转载自:http://blog.csdn.net/cunxiyuan108/article/details/12280929 如有侵权请联系博主
我放在了自己常用的一个package里(dbms_ut 包,包括常用脚本)。
过程如下:
PROCEDURE get_table_ddl(
p_table_name IN VARCHAR2,
p_owner IN VARCHAR2 DEFAULT USER,
p_storage IN BOOLEAN DEFAULT TRUE,
p_segment_attributes IN BOOLEAN DEFAULT TRUE,
p_ref_constraints IN BOOLEAN DEFAULT FALSE,
p_constraints_as_alter IN BOOLEAN DEFAULT FALSE
)
IS
v_temp VARCHAR2(1024) := '';
v_table_ddl CLOB := '';
v_comment_ddl CLOB := '';
v_constraint_ddl CLOB := '';
v_ref_constraint_ddl CLOB := '';
v_index_ddl CLOB := '';
v_trigger_ddl CLOB := '';
v_object_grant_ddl CLOB := '';
BEGIN
--输出信息采用缩排或换行格式化
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'PRETTY', FALSE);
--确保每个语句都带分号
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SQLTERMINATOR', TRUE);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'TABLESPACE', TRUE);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS', TRUE);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'REF_CONSTRAINTS',
p_ref_constraints);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'CONSTRAINTS_AS_ALTER',
p_constraints_as_alter);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'STORAGE', p_storage);
DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SEGMENT_ATTRIBUTES',
p_segment_attributes);
--get table ddl
BEGIN
SELECT REPLACE(DBMS_METADATA.get_ddl('TABLE', UPPER(p_table_name), UPPER(p_owner)), '"', '')
INTO v_table_ddl
FROM DUAL;
put_line(v_table_ddl, TRUE, FALSE);
EXCEPTION
WHEN OTHERS THEN
put_line('--no object:' || p_table_name);
v_temp := SQLERRM;
put_line(v_temp);
RETURN;
END;
--get comment ddl
BEGIN
SELECT DBMS_METADATA.get_dependent_ddl('COMMENT', UPPER(p_table_name), UPPER(p_owner))
INTO v_comment_ddl
FROM DUAL;
put_line(v_comment_ddl, TRUE, FALSE);
EXCEPTION
WHEN e_ora_31608 THEN
put_line('--no comment');
WHEN OTHERS THEN
put_line('--no comment');
put_line(SQLERRM);
END;
--get constraint ddl
BEGIN
SELECT DBMS_METADATA.get_dependent_ddl('CONSTRAINT', UPPER(p_table_name), UPPER(p_owner))
INTO v_constraint_ddl
FROM DUAL;
put_line(v_constraint_ddl, TRUE, FALSE);
SELECT DBMS_METADATA.get_dependent_ddl('REF_CONSTRAINT', UPPER(p_table_name), UPPER(p_owner))
INTO v_ref_constraint_ddl
FROM DUAL;
put_line(v_ref_constraint_ddl, TRUE, FALSE);
EXCEPTION
WHEN e_ora_31608 THEN
put_line('--no constraint');
WHEN OTHERS THEN
put_line('--no constraint');
put_line(SQLERRM);
END;
--get index ddl
BEGIN
SELECT REPLACE(
DBMS_METADATA.get_dependent_ddl('INDEX', UPPER(p_table_name), UPPER(p_owner)),
'"',
''
)
INTO v_index_ddl
FROM DUAL;
put_line(v_index_ddl, TRUE, FALSE);
EXCEPTION
WHEN e_ora_31608 THEN
put_line('--no index');
WHEN OTHERS THEN
put_line('--no index');
put_line(SQLERRM);
END;
-- get trigger ddl
BEGIN
SELECT DBMS_METADATA.get_dependent_ddl('TRIGGER', UPPER(p_table_name), UPPER(p_owner))
INTO v_trigger_ddl
FROM DUAL;
put_line(v_trigger_ddl, TRUE, FALSE);
EXCEPTION
WHEN e_ora_31608 THEN
put_line('--no trigger');
WHEN OTHERS THEN
put_line('--no trigger');
put_line(SQLERRM);
END;
-- get object grant ddl
BEGIN
SELECT REPLACE(
DBMS_METADATA.get_dependent_ddl('OBJECT_GRANT', UPPER(p_table_name), UPPER(p_owner)),
'"',
''
)
INTO v_object_grant_ddl
FROM DUAL;
put_line(v_object_grant_ddl, TRUE, TRUE);
EXCEPTION
WHEN e_ora_31608 THEN
put_line('--no object grant');
WHEN OTHERS THEN
put_line('--no object grant');
put_line(SQLERRM);
END;
END;
测试一下:
先建立测试表:
SQL> CREATE TABLE tab_test2 (col2 VARCHAR2(10) PRIMARY KEY);
Table created.
SQL> CREATE TABLE tab_test
2 (
3 col1 NUMBER(10) CONSTRAINT pk_test PRIMARY KEY,
4 col2 VARCHAR2(10) CONSTRAINT fk_test REFERENCES tab_test2 (col2),
5 col3 VARCHAR2(10) DEFAULT 'test'
6 );
Table created.
SQL> COMMENT ON TABLE tab_test IS 'table test';
Comment created.
SQL> COMMENT ON COLUMN tab_test.col1 IS 'table test col1';
Comment created.
SQL> COMMENT ON COLUMN tab_test.col2 IS 'table test col2';
Comment created.
SQL> CREATE INDEX idx_test ON tab_test(col2,col3);
Index created.
SQL> CREATE OR REPLACE TRIGGER trg_test
2 AFTER INSERT OR UPDATE OR DELETE
3 ON tab_test
4 FOR EACH ROW
5 BEGIN
6 DBMS_OUTPUT.put_line('heihei!');
7 END;
8 /
Trigger created.
SQL> GRANT SELECT,UPDATE ON tab_test TO utcore;
Grant succeeded.
执行过程获得table的完整定义:
SQL> set serverout on
SQL> exec dbms_ut.get_table_ddl('tab_test');
------------------------------------------------------------
CREATE TABLE WACOS.TAB_TEST (COL1 NUMBER(10,0), COL2 VARCHAR2(10), COL3
VARCHAR2(10) DEFAULT 'test', CONSTRAINT PK_TEST PRIMARY KEY (COL1) USING INDEX
PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576
MINEXTENTS 1 MAXEXTENTS 21474
83645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE WACOS ENABLE) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0 FREELISTS
1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE WACOS ;
------------------------------------------------------------
COMMENT ON COLUMN "WACOS"."TAB_TEST"."COL1" IS 'table test col1';
COMMENT ON COLUMN "WACOS"."TAB_TEST"."COL2" IS 'table test col2';
COMMENT
ON TABLE "WACOS"."TAB_TEST" IS 'table test';
------------------------------------------------------------
ALTER TABLE "WACOS"."TAB_TEST" ADD CONSTRAINT "PK_TEST" PRIMARY KEY ("COL1")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT
1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST
GROUPS 1 BUFFER_POOL D
EFAULT) TABLESPACE "WACOS" ENABLE;
------------------------------------------------------------
ALTER TABLE "WACOS"."TAB_TEST" ADD CONSTRAINT "FK_TEST" FOREIGN KEY ("COL2")
REFERENCES "WACOS"."TAB_TEST2" ("COL2") ENABLE;
------------------------------------------------------------
CREATE INDEX WACOS.IDX_TEST ON WACOS.TAB_TEST (COL2, COL3) PCTFREE 10
INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1
MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL
DEFAULT) TABLESPACE WACOS ;
CREATE UNIQUE INDEX WACOS.PK_TEST ON WACOS.TAB_TEST (COL1) PCTFREE 10 INITRANS 2
MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE WACOS ;
------------------------------------------------------------
CREATE OR REPLACE TRIGGER "WACOS"."TRG_TEST"
AFTER INSERT OR UPDATE OR
DELETE
ON tab_test
FOR EACH ROW
BEGIN
DBMS_OUTPUT.put_line('heihei!');
END;
/
ALTER TRIGGER "WACOS"."TRG_TEST"
ENABLE;
------------------------------------------------------------
GRANT SELECT ON WACOS.TAB_TEST TO UTCORE;
GRANT UPDATE ON WACOS.TAB_TEST
TO UTCORE;
------------------------------------------------------------
PL/SQL procedure successfully completed.
SQL>
转载自:http://blog.csdn.net/cunxiyuan108/article/details/12280929 如有侵权请联系博主
相关文章推荐
- 写了个存储过程获得table的完整定义
- 存储过程Append 二进制 _ParameterPtr“不正常地定义参数对象。提供了不一致或不完整的信息”
- SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?
- 存储过程从入门到熟练(多个存储过程完整实例及调用方法)_AX -转载
- mysql 生成完整的存储过程定义语句
- SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?
- SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?
- 存储过程Append 二进制 _ParameterPtr“不正常地定义参数对象。提供了不一致或不完整的信息”
- SQL Server中获得EXEC后面的sql语句或者存储过程的返回值的方法(转载)
- C#完整执行存储过程的代码加实例[转载]
- SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?
- [转载] 存储过程从入门到熟练(多个存储过程完整实例及调用方
- 详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb
- 存储过程从入门到熟练(多个存储过程完整实例及调用方法)_AX
- 存储过程入门与提高[转载]
- 存储过程从入门到熟练(多个存储过程完整实例及调用方法)
- SQL Server 存储过程的分页方案比拼[转载自李洪根blogs]
- C#调用存储过程简单完整例子
- C#调用存储过程简单完整例子
- ASPNETDB 存储过程(3) 角色管理部分(转载)