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;

 

使用如圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM