早上一个同事资讯怎么获取到建表语句并且是不带存储那种SQL。
Oracle本身提供了一个函数DBMS_METADATA.GET_DDL,可是获取到的建表语句含有存储、表空间、以及一些其余段的属性。
如图:函数
看到这个获取到的ddl语句,想经过利用Oracle函数来截取的方式获取建表语句。spa
思路为:
1.经过get_ddl获取建表语句 abc
2.将abc中的pctfree'替换成';'
3.计算';'的位置
4.用substr来截取abc,从开头到';'的长度3d
SQL以下:code
SELECT SUBSTR(REPLACE(DBMS_METADATA.GET_DDL('TABLE', 'SALES', 'SH'), 'PCTFREE', ';'), 1, INSTR(REPLACE(DBMS_METADATA.GET_DDL('TABLE', 'SALES', 'SH'), 'PCTFREE', ';'), ';', 1)) FROM DUAL;
刚开始也确实觉得解决了问题,如图:blog
可是当语句中含有索引的属性的时候,会出现问题,由于索引本身也有pctfree等相关属性,因此截取的时候直接截取错了,如图:索引
最后没办法,仍是老老实实用函数来解决吧。get
思路:
1.先设置关闭存储、表空间、以及一些其余段的属性
2.再用get_ddl来获取建表语句
3.最后作一些小的处理class
函数以下:bfc
CREATE OR REPLACE FUNCTION FUN_GET_TABLE_DDL(P_SCHEMA IN VARCHAR2, P_TABLE_NAME IN VARCHAR2) RETURN CLOB IS V_CLOB CLOB; BEGIN DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', FALSE); DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'TABLESPACE', FALSE); DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', FALSE); SELECT DBMS_METADATA.GET_DDL('TABLE', P_TABLE_NAME, P_SCHEMA) INTO V_CLOB FROM DUAL; V_CLOB := REPLACE(V_CLOB, '"'); IF INSTR(V_CLOB, 'PRIMARY KEY', 1, 1) <> 0 THEN V_CLOB := REPLACE(V_CLOB, ';', ');'); END IF; RETURN V_CLOB; EXCEPTION WHEN OTHERS THEN RAISE; END;
使用如图:im