Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

oracle drop index if exists

How do you drop an index only if it exists?

It seems simple but I did found anything on the net. The idea is to drop it only if it exists, because if not, I will have an error and my process stops.

I found this to find if the index exists:

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

But I don't know how to put it together with

DROP INDEX myIndexName
like image 563
CC. Avatar asked Apr 27 '10 15:04

CC.


People also ask

Can we drop unique index in Oracle?

The index must be in your own schema or you must have the DROP ANY INDEX system privilege. Specify the schema containing the index. If you omit schema , then Oracle Database assumes the index is in your own schema. Specify the name of the index to be dropped.

How do you check if an index exists in Oracle?

You can find out the column_name and column_position of related index as follows. select table_name, index_name,column_name,column_position from dba_ind_columns where table_name='TABLE_NAME' and table_owner='TABLE_OWNER'; You can use the following Oracle views which gives you details about Indexes.


3 Answers

Don't check for existence. Try to drop, and capture the exception if necessary...

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;
/
like image 76
Samuel Avatar answered Oct 21 '22 17:10

Samuel


DECLARE
   COUNT_INDEXES   INTEGER;
BEGIN
   SELECT COUNT ( * )
     INTO COUNT_INDEXES
     FROM USER_INDEXES
    WHERE INDEX_NAME = 'myIndexName';
   -- Edited by UltraCommit, October 1st, 2019
   -- Accepted answer has a race condition.
   -- The index could have been dropped between the line that checks the count
   -- and the execute immediate
   IF COUNT_INDEXES > 0
   THEN
      EXECUTE IMMEDIATE 'DROP INDEX myIndexName';
   END IF;
END;
/
like image 38
UltraCommit Avatar answered Oct 21 '22 15:10

UltraCommit


In Oracle, you can't mix both DDL and DML. In order to do so, you need to work it around with the EXECUTE IMMEDIATE statement.

So, first check for the existence of the index.

Second, drop the index through the EXECUTE IMMEDIATE statement.

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;

This code is out the top of my head and you may need to fix it up a little, but this gives an idea.

Hope this helps! =)

like image 2
Will Marcouiller Avatar answered Oct 21 '22 16:10

Will Marcouiller