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;
如果你想動態DDL看看EXECUTE IMMEDIATE – Multisync 2014-12-03 21:04:52
謝謝!根據您的建議,我設法編寫了以下程序並完成了結果。我不確定它是最佳的,但它的工作原理。 – nouklea 2014-12-04 18:38:50