dbms_metadata.get_ddl输出格式美化
1 问题
当批量生成建表或建索引ddl的时侯,dbartisan工具还是力不从心,特别是量级上万,而oracle的dbms_metadata.get_ddl输出的结果又不够美观。所以想想办法美化输出。本文的例是做的是索引,其它请自行调整脚本。
2 使用pl/sql批量生成建索引的ddl
1) metadata_regis表结构
SQL> desc metadata_regis
Name Null? Type
———————– ——– —————–
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(100)
MD CLOB
2) 生成创建索引的pl/sql
–指定生成语句带分号(;)结尾
execute DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,’SQLTERMINATOR’,true);
–去掉存储选项
execute DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,’STORAGE’,false);
set linesize 200
set pagesize 0
set long 1000000
DECLARE
IV_SQL CHAR(1000);
V_N NUMBER;
CURSOR C1 IS
SELECT OWNER, INDEX_NAME
FROM DBA_INDEXES
WHERE OWNER = ‘REGIS’
AND TABLE_NAME IN (SELECT TNAME FROM REGIS_TABLES)
AND INDEX_TYPE <> ‘LOB’
ORDER BY TABLE_NAME;
L_C1 C1%ROWTYPE;
DOC CLOB;
BEGIN
EXECUTE IMMEDIATE ‘truncate table qiuyb.metadata_regis’;
OPEN C1;
LOOP
FETCH C1
INTO L_C1;
EXIT WHEN C1%NOTFOUND;
DOC := DBMS_METADATA.GET_DDL(‘INDEX’, L_C1.INDEX_NAME, L_C1.OWNER);
INSERT INTO METADATA_REGIS (owner,OBJECT_NAME,MD) VALUES (l_c1.owner,l_c1.index_name,DOC);
— dbms_output.put_line(iv_sql);
— EXECUTE IMMEDIATE IV_SQL;
COMMIT;
END LOOP;
CLOSE C1;
END;
3 把表里的数据spool 到文本文件
set linesize 200
set pagesize 0
spool gg.txt
select md from metadata_regis;
spool off
gg.txt内容类似如下:
SQL> select md from metadata_regis;
CREATE INDEX “REGIS”.”IDX_ADDRESS_CREATED_DT_1301″ ON “REGIS”.”ADDRESS_1301″ (“CREATED_DT”)
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
TABLESPACE “TBS_DATACENTER” ;
CREATE INDEX “REGIS”.”IDX_ADDRESS_SPELL_1301″ ON “REGIS”.”ADDRESS_1301″ (“SIMPLE_SPELL”)
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
TABLESPACE “TBS_DATACENTER” ;
CREATE INDEX “REGIS”.”IDX_ADDRESS_NAME_1301″ ON “REGIS”.”ADDRESS_1301″ (“NAME”)
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
TABLESPACE “TBS_DATACENTER” ;
把第一行去掉
4 用python格式化gg.txt,脚本名:fmtsqlfile.py
1)python脚本如下:
#!/usr/bin/python
# coding=utf-8
import sys
import re
def fmtsqlfile(s,t):
file_s = open(s,”r”)
file_t = open(t,”w”)
while True:
line = file_s.readline()
if not line:
break
if (line[:2]==’ ‘ or line==’\n’):
file_t.write(‘\n’)
line = line.strip()
if (re.search(‘COMPUTE STATISTICS’,line)):
file_t.write(‘online parallel 8’)
else:
file_t.write(line)
file_t.write(‘\n’)
file_s.close()
file_t.close()
if __name__ == ‘__main__’:
if len(sys.argv) == 3:
fmtsqlfile(sys.argv[1],sys.argv[2])
else:
print(‘Command format:fmtsqlfile.py source_filename target_filename’)
2)格式
./fmtsqlfile.py gg.txt cr_regis_dsg_index.sql
python版本2.6.6
5 结果
生成的结果已经很美观了,乱换行的去除了
CREATE INDEX “REGIS”.”IDX_ADDRESS_CREATED_DT_1301″ ON “REGIS”.”ADDRESS_1301″ (“CREATED_DT”)
online parallel 8
TABLESPACE “TBS_DATACENTER” ;
CREATE INDEX “REGIS”.”IDX_ADDRESS_SPELL_1301″ ON “REGIS”.”ADDRESS_1301″ (“SIMPLE_SPELL”)
online parallel 8
TABLESPACE “TBS_DATACENTER” ;
… …
近期评论