暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle获取干净的建表DDL语句,不含其它存储、表空间、段属性

科学家的炼丹房 2016-08-05
1168

早上一个同事资讯怎么获取到建表语句而且是不带存储那种SQL。
Oracle自己提供了一个函数DBMS_METADATA.GET_DDL,但是获取到的建表语句含有存储、表空间、以及一些其他段的属性。
如图:

看到这个获取到的ddl语句,想通过利用Oracle函数来截取的方式获取建表语句。

思路为:
1.通过get_ddl获取建表语句 abc
2.将abc中的pctfree'替换成';'
3.计算';'的位置
4.用substr来截取abc,从开头到';'的长度

SQL如下:


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;
复制

刚开始也确实以为解决了问题,如图:

但是当语句中含有索引的属性的时候,会出现问题,因为索引自己也有pctfree等相关属性,所以截取的时候直接截取错了,如图:

最后没办法,还是老老实实用函数来解决吧。

函数如下:


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;
复制


使用如图:



文章转载自科学家的炼丹房,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论