インデックスが存在する場合にのみ、どのようにドロップしますか?
簡単に思えますが、ネット上で何かを見つけました。アイデアは、存在する場合にのみドロップすることです。存在しない場合、エラーが発生し、プロセスが停止します。
インデックスが存在するかどうかを見つけるためにこれを見つけました:
select index_name
from user_indexes
where table_name = 'myTable'
and index_name='myIndexName'
しかし、私はそれをどのように組み合わせるのかわかりません
DROP INDEX myIndexName
DECLARE
COUNT_INDEXES INTEGER;
BEGIN
SELECT COUNT(*) INTO COUNT_INDEXES
FROM USER_INDEXES
WHERE INDEX_NAME = 'myIndexName';
IF COUNT_INDEXES > 0 THEN
EXECUTE IMMEDIATE 'DROP INDEX myIndexName';
END IF;
END;
/
存在を確認しないでください。必要に応じて、例外をドロップしてキャプチャしてみてください...
declare
index_not_exists EXCEPTION;
PRAGMA EXCEPTION_INIT(index_not_exists, -1418);
begin
execute immediate 'drop index foo';
exception
when index_not_exists then null;
end;
/
Oracleでは、DDLとDMLの両方を混在させることはできません。そのためには、 EXECUTE IMMEDIATE ステートメントで回避する必要があります。
そのため、最初にインデックスの存在を確認してください。
次に、EXECUTE IMMEDIATEステートメントを使用してインデックスを削除します。
DECLARE v_Exists NUMBER;
BEGIN
v_Exists := 0;
SELECT 1 INTO v_Exists
FROM USER_INDEXES
WHERE TABLE_NAME LIKE 'myTable'
AND INDEX_NAME LIKE 'myIndexName'
IF v_Exists = 1 THEN
EXECUTE IMMEDIATE "DROP INDEX myIndexName"
ENDIF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
このコードは私の頭の一番上にあり、少し修正する必要があるかもしれませんが、これはアイデアを与えてくれます。
お役に立てれば! =)
数回呼び出せるように手順を作成しました。
DELIMITER €€
DROP PROCEDURE IF EXISTS ClearIndex€€
CREATE PROCEDURE ClearIndex(IN var_index VARCHAR(255),IN var_table VARCHAR(255))
BEGIN
SET @temp = concat('DROP INDEX ', var_index, ' ON ', var_table);
PREPARE stm1 FROM @temp;
BEGIN
DECLARE CONTINUE HANDLER FOR 1091 SELECT concat('Index ', var_index,' did not exist in ',var_table,', but was handled') AS 'INFO';
EXECUTE stm1;
END;
END €€
DELIMITER ;
これで、複数回呼び出すことができます。
CALL ClearIndex('employees_no_index','employees');
CALL ClearIndex('salaries_no_index','salaries');
CALL ClearIndex('titles_no_index','titles');
これが役立つことを願っています。それはすべてのソリューションの組み合わせです:)ところで、助けてくれてありがとう!
CREATE OR REPLACE PROCEDURE CLEAR_INDEX(INDEX_NAME IN VARCHAR2) AS
BEGIN
EXECUTE IMMEDIATE 'drop index ' || INDEX_NAME;
EXCEPTION
WHEN OTHERS THEN
NULL;
END CLEAR_INDEX;