Oracle 查询当前用户下所有索引(Index)并拼接创建脚本

 Oracle 查询当前用户下所有索引(Index,PK)并拼接创建脚本【不包含FUNCTION-BASED基于函数的索引】

SELECT T.TABLE_NAME, --表名
       T.INDEX_NAME, --索引名
       I.UNIQUENESS, --是否非空
       I.INDEX_TYPE, --索引类型
       C.CONSTRAINT_TYPE, --键类型
       WM_CONCAT(T.COLUMN_NAME) COLS,
       (CASE
         WHEN C.CONSTRAINT_TYPE = 'P' OR C.CONSTRAINT_TYPE = 'R' THEN --主键和外键创建脚本拼接
          'ALTER TABLE ' || T.TABLE_NAME || ' ADD CONSTRAINT ' ||
          T.INDEX_NAME || (CASE
            WHEN C.CONSTRAINT_TYPE = 'P' THEN
             ' PRIMARY KEY ('
            ELSE
             ' FOREIGN KEY ('
          END) || WM_CONCAT(T.COLUMN_NAME) || ');'
         ELSE --索引创建脚本拼接
          'CREATE ' || (CASE
            WHEN I.UNIQUENESS = 'UNIQUE' THEN
             I.UNIQUENESS || ' '
            ELSE
             CASE
               WHEN I.INDEX_TYPE = 'NORMAL' THEN
                ''
               ELSE
                I.INDEX_TYPE || ' '
             END
          END) || 'INDEX ' || T.INDEX_NAME || ' ON ' || T.TABLE_NAME || '(' ||
          WM_CONCAT(COLUMN_NAME) || ');'
       END) SQL_CMD --拼接创建脚本
  FROM USER_IND_COLUMNS T, USER_INDEXES I, USER_CONSTRAINTS C
 WHERE T.INDEX_NAME = I.INDEX_NAME
   AND T.INDEX_NAME = C.CONSTRAINT_NAME(+)
   AND T.TABLE_NAME LIKE 'TB_%' --自建表规则(只查询自己创建的表【我的建表规则以TB_开头】,排除系统表)
   AND I.INDEX_TYPE != 'FUNCTION-BASED NORMAL' --排除基于函数的索引
 GROUP BY T.TABLE_NAME,
          T.INDEX_NAME,
          I.UNIQUENESS,
          I.INDEX_TYPE,
          C.CONSTRAINT_TYPE;

 

你可能感兴趣的:(Oracle)