Oracle獲取乾淨的建表DDL語句,不含其它存儲、表空間、段屬性

早上一個同事資訊怎麼獲取到建表語句並且是不帶存儲那種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

相關文章
相關標籤/搜索