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
25
demandé sur Darko Z 2010-04-27 19:38:37

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;
/
28
répondu UltraCommit 2012-01-30 09:11:27

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;
/
58
répondu Samuel 2010-04-27 16:06:22

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! =)

2
répondu Will Marcouiller 2010-04-27 15:51:10

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');
0
répondu Theis 2012-10-09 09:56:32

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;
0
répondu Sofiane 2014-06-02 09:52:16