2014-12-03 23 views
0

我创建了一个包含多个约束(主键,外键等)的表。 Oracle使用代码名称自动生成索引(例如SYS_CO12345)。我想用专有名称重新命名索引。使用嵌套选择的Oracle更改索引

我知道如何识别索引名,使用要求,如

SELECT INDEX_OWNER || '.' || INDEX_NAME 
FROM DBA_IND_COLUMNS 
WHERE INDEX_OWNER = <my owner> 
    AND TABLE_OWNER = <my table> 
    AND TABLE_NAME = <my table> 
    AND COLUMN_NAME = <my column>; 

我也知道如何重命名索引,使用要求,如

ALTER INDEX <index owner>.<index name> 
RENAME TO <index owner>.<index new name>; 

现在,我想喜欢将这两个请求合并为类似的东西:

ALTER INDEX 
(
    SELECT INDEX_OWNER || '.' || INDEX_NAME 
    FROM DBA_IND_COLUMNS 
    WHERE INDEX_OWNER = <my owner> 
    AND TABLE_OWNER = <my owner> 
    AND TABLE_NAME = <my table> 
    AND COLUMN_NAME = <my column> 
) 
RENAME TO <index owner>.<index new name>; 

但我面临以下错误消息:

00953. 00000 - "missing or invalid index name" 
*Cause: An index name of the form [ <identifier> . ] <identifier> is 
      expected but not present. If OIDINDEX clause, index name must be 
      <identifier> 
*Action: Enter an appropriate index name. 

关于如何编写正确的组合请求的任何想法?

非常感谢您的帮助!

编辑,从Multisync的建议后: 我写了下面的过程,它的工作原理。我不知道这是最佳的,但它能够完成任务......

DECLARE 
    index_owner_and_name VARCHAR2(30); 
    query2execute VARCHAR2(200); 

    CURSOR myCursor IS SELECT INDEX_OWNER || '.' || INDEX_NAME 
        FROM DBA_IND_COLUMNS 
        WHERE INDEX_OWNER = <my owner> 
         AND TABLE_OWNER = <my owner> 
         AND TABLE_NAME = <my table> 
         AND COLUMN_NAME = <my column>; 

BEGIN 
    OPEN myCursor ; 
    FETCH myCursor INTO index_owner_and_name; 
    CLOSE myCursor ; 
    query2execute := 'ALTER INDEX ' || index_owner_and_name || ' RENAME TO <new index name>'; 
    EXECUTE IMMEDIATE query2execute ; 

END; 
+4

如果你想动态DDL看看EXECUTE IMMEDIATE – Multisync 2014-12-03 21:04:52

+0

谢谢!根据您的建议,我设法编写了以下程序并完成了结果。我不确定它是最佳的,但它的工作原理。 – nouklea 2014-12-04 18:38:50

回答

0

ALTER INDEX语法不允许作为INSERT-SELECT的确从SELECT养活它的输入。 ALTER INDEX中不能有子查询。您必须单独准备每条语句并通过动态DDL运行它(如Multisync已经回答)。这是唯一的方法。