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