web-dev-qa-db-fra.com

oracle drop index s'il existe

Comment ne supprimez-vous qu'un index s'il existe?

Cela semble simple, mais j’ai trouvé quoi que ce soit sur le réseau ... L’idée est de ne l’écarter que s’il existe, car 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 

DROP INDEX myIndexName
25
CC.
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
UltraCommit

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;
/
59
Samuel

Dans Oracle, vous ne pouvez pas mélanger à la fois DDL et DML. Pour ce faire, vous devez vous en servir avec l'instruction EXECUTE IMMEDIATE .

Alors, vérifiez d'abord l'existence de l'index.

Deuxièmement, supprimez l'index via 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 me vient à l’esprit et vous devrez peut-être le réparer un peu, mais cela donne une idée.

J'espère que cela t'aides! =)

2
Will Marcouiller

J'ai fait une procédure pour pouvoir l'appeler 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
Theis

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
Sofiane