早上一個同事資訊怎么獲取到建表語句而且是不帶存儲那種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;
使用如圖: