zoukankan      html  css  js  c++  java
  • Oracle获取干净的建表DDL语句,不含其它存储、表空间、段属性

    早上一个同事资讯怎么获取到建表语句而且是不带存储那种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;

    使用如图:

  • 相关阅读:
    默认使用什么序列化框架,你知道的还有哪些?
    一般使用什么注册中心?还有别的选择吗?
    Dubbo 的整体架构设计有哪些分层?
    Java 中是如何支持正则表达式操作的?
    Dubbo 集群容错有几种方案?
    Dubbo 推荐用什么协议?
    说说核心的配置有哪些?
    Dubbo 如何优雅停机?
    Dubbo 必须依赖的包有哪些?
    服务上线怎么兼容旧版本?
  • 原文地址:https://www.cnblogs.com/nazeebodan/p/5740659.html
Copyright © 2011-2022 走看看