码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2016-08-19 09:51:47      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:

早上一个同事资讯怎么获取到建表语句而且是不带存储那种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等相关属性,所以截取的时候直接截取错了,如图:

技术分享

技术分享

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

思路:
1.先设置关闭存储、表空间、以及一些其他段的属性
2.再用get_ddl来获取建表语句
3.最后做一些小的处理

函数如下:

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;

 

使用如图:

技术分享

技术分享

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

标签:

原文地址:http://www.cnblogs.com/suredandan/p/5740659.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!