基于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; 

 
原文地址:https://www.cnblogs.com/heyt/p/11582056.html