2014-12-03 25 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已經回答)。這是唯一的方法。