oracle drop index如果存在

时间:2010-04-27 15:38:38

标签: oracle indexing

如果索引存在,如何删除索引?

看起来很简单,但我确实在网上找到了什么。 这个想法只有在它存在的情况下才会删除它,因为如果不存在,我将会出错并且我的进程会停止。

我发现这是为了查找索引是否存在:

select index_name
from user_indexes
where table_name = 'myTable'
and index_name='myIndexName'

但我不知道怎么把它和

放在一起
DROP INDEX myIndexName

5 个答案:

答案 0 :(得分:59)

不检查是否存在。如有必要,尝试删除并捕获异常......

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

答案 1 :(得分:29)

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

答案 2 :(得分:2)

在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;

这段代码不在我的脑海中,您可能需要稍微修改一下,但这给了我一个想法。

希望这有帮助! =)

答案 3 :(得分:0)

我制作了一个程序,因此可以多次调用:

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');

答案 4 :(得分:0)

我希望这会有所帮助。这是所有解决方案的组合:) 顺便感谢你的帮助!

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;