2009-03-12 21 views
14

Estoy escribiendo un script de actualización de esquema para un producto que depende de una base de datos Oracle. En un área, necesito crear un índice en una tabla, si ese índice aún no existe. ¿Hay alguna manera fácil de verificar la existencia de un índice que conozco en un script de Oracle?Cómo verificar un índice en Oracle

Sería similar a esta en SQL Server: SI NO EXISTE (SELECT * FROM SYSINDEXES WHERE NOMBRE = 'MyIndex') // A continuación, cree mi MyIndex

Respuesta

30

select count (*) desde donde user_indexes index_name = 'myIndex'

sqlplus no admitirá IF ..., sin embargo, por lo que tendrá que usar bloques PL/SQL anónimos, lo que significa EJECUTAR INMEDIATO para hacer DDL.

DECLARE 
    i INTEGER; 
BEGIN 
    SELECT COUNT(*) INTO i FROM user_indexes WHERE index_name = 'MYINDEX'; 
    IF i = 0 THEN 
     EXECUTE IMMEDIATE 'CREATE INDEX myIndex ...'; 
    END IF; 
END; 
/

Editar: como se señaló, Oracle almacena nombres de objetos sin comillas en mayúsculas.

+1

A menos que los cites, los objetos de la base de datos (incluidos los índices) se almacenan en mayúsculas. Entonces, si usted hace un índice MITIO CREAR ÍNDICE, entonces en USER_INDEXES se almacenará como MYINDEX. Y Oracle (por defecto) no hará coincidencias que no distingan entre mayúsculas y minúsculas. –

+1

, además de esta respuesta: si necesita verificar si un índice existe en otro esquema, consulte ALL_INDEXES en lugar de usar USER_INDEXES. Verificando USER_INDEXES no funciona con un "ALTER SESSION SET CURRENT_SCHEMA = XYZ", aún consultaría los índices para el usuario actualmente conectado. – SaschaM78

Cuestiones relacionadas