Oracle drop index s'il existe
Comment supprimer un index uniquement s'il existe?
Cela semble simple mais j'ai trouvé quelque chose sur le net. L'idée est de le laisser tomber seulement s'il existe, parce que sinon, j'aurai une erreur et mon processus s'arrêtera.
J'ai trouvé ceci pour trouver si l'index existe:
select index_name
from user_indexes
where table_name = 'myTable'
and index_name='myIndexName'
Mais je ne sais pas comment le mettre ensemble avec
DROP INDEX myIndexName
5 réponses
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;
/
Ne vérifie pas l'existence. Essayez de supprimer et de capturer l'exception si nécessaire...
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;
/
Dans Oracle, vous ne pouvez pas mélanger à la fois DDL et DML. Pour ce faire, vous devez le contourner avec l'instructionEXECUTE IMMEDIATE .
Donc, vérifiez d'abord l'existence de l'index.
Deuxièmement, déposez l'index dans L'instruction 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;
Ce code est en haut de ma tête et vous devrez peut-être le réparer un peu, mais cela donne une idée.
Espérons que cela aide! =)
J'ai fait une procédure pour qu'elle puisse être appelée plusieurs fois:
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 ;
Maintenant, il peut être appelé plus d'une fois:
CALL ClearIndex('employees_no_index','employees');
CALL ClearIndex('salaries_no_index','salaries');
CALL ClearIndex('titles_no_index','titles');
J'espère que cela aidera. C'est une combinaison de toutes les solutions :) En passant merci pour l'aide !
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;