examples - select index oracle
índice de caída de oráculo si existe (5)
En Oracle, no puede mezclar DDL y DML. Para hacerlo, debe trabajar con la instrucción EXECUTE INMEDIATO .
Entonces, primero verifique la existencia del índice.
Segundo, suelte el índice a través de la declaración EJECUTAR INMEDIATO.
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;
Este código está fuera de mi cabeza y es posible que tengas que arreglarlo un poco, pero esto da una idea.
¡Espero que esto ayude! =)
¿Cómo se puede soltar un índice solo si existe?
Parece simple, pero encontré algo en la red. La idea es soltarlo solo si existe, porque si no, tendré un error y mi proceso se detendrá.
Encontré esto para encontrar si el índice existe:
select index_name
from user_indexes
where table_name = ''myTable''
and index_name=''myIndexName''
Pero no sé cómo armarlo con
DROP INDEX myIndexName
Espero que esto sea de ayuda. Es una combinación de todas las soluciones :) Por cierto, ¡gracias por la ayuda!
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;
Hice un procedimiento para que pueda ser llamado varias veces:
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 ;
Ahora se puede llamar más de una vez:
CALL ClearIndex(''employees_no_index'',''employees'');
CALL ClearIndex(''salaries_no_index'',''salaries'');
CALL ClearIndex(''titles_no_index'',''titles'');
No verifique la existencia. Intenta soltar y capturar la excepción si es necesario ...
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;
/
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;
/