基于DBMS_METADATA.GET_DDL函数批量导出索引的创建语句
/* 首先要说的DBMS_METADATA.GET_DDL是个好函数呀!新项目不知道哪个缺心眼建的同构库,只是见了表结构,并没有健非主键外的索引,领导让追加一版,以前只是会用视图拼sql创建,今天有学会一招oracle-9i以上版本可以使用,导出的内容有点复杂需要用编辑器处理下并且替换一下实例名(schema),select TO_CHAR(DBMS_METADATA.GET_DDL('TABLE','T_LCPOL')) from dual; 第一个参数就是类型如index、table、function、等 第二个参数就是 typeName 出来的结果就是创建这个typeName的DDL语句了!注意大写,还有一点要注意的是务必是同一个实例(Sechema),不同所属会报错,如果是想要生成不同所属的内容需要添加第三个参数,可以添加第二个参数的Owner 例如select replace(to_char(DBMS_METADATA.GET_DDL('TABLE','DUAL','SYS')),'"','') from dual; 最下面有这个函数的具体实现*/ --以下例子是用来批量生成索引的语句,不合适的格式需文本编辑器修正下。 SELECT substr(replace(to_char(DBMS_METADATA.GET_DDL('INDEX', a.INDEX_NAME)),'"',''),0,instr(replace(to_char(DBMS_METADATA.GET_DDL('INDEX',a.INDEX_NAME)),'"',''),') ',1)) || ';' createindexsql from dba_indexes a WHERE a.TABLE_TYPE = 'TABLE' and a.TABLE_OWNER = 'GIS' and a.OWNER = 'GIS' and NOT EXISTS (SELECT 'x' FROM dba_constraints b WHERE a.OWNER = b.OWNER and a.INDEX_NAME = b.CONSTRAINT_NAME and b.CONSTRAINT_TYPE = 'P') order by 1; --单纯用视图拼接sql; 两者可一比较下哪个更适合 SELECT TABLE_OWNER,'Create index '||b.INDEX_NAME||' on '|| b.TABLE_OWNER||'.'|| b.TABLE_NAME||'('|| listagg(a.COLUMN_NAME, ',') within group(ORDER by a.TABLE_NAME)||');' FROM user_ind_columns a, user_indexes b WHERE a.INDEX_NAME = b.INDEX_NAME and NOT EXISTS (SELECT 'x' FROM user_constraints c WHERE b.INDEX_NAME = c.CONSTRAINT_NAME and c.CONSTRAINT_TYPE = 'P') --不包括主键 GROUP BY b.INDEX_NAME, b.TABLE_OWNER, b.TABLE_NAME ORDER BY 1; --DBMS_METADATA.GET_DDL函数的具体实现 FUNCTION get_ddl ( object_type IN VARCHAR2, name IN VARCHAR2, schema IN VARCHAR2 DEFAULT NULL, version IN VARCHAR2 DEFAULT 'COMPATIBLE', model IN VARCHAR2 DEFAULT 'ORACLE', transform IN VARCHAR2 DEFAULT 'DDL') RETURN CLOB;