Ayuda con un trigger

Hola,
Por favor, he hecho un trigger para controlar que cuando alguien haga un insert sobre una tabla y viole una clave única, la excepción de "dup_val_on_index" se capture en el trigger y en lugar de insertar se actualice la información del registro que ya había. El trigger el "before insert" "for each row" ...
Pero resulta que me salta a excepción de unicidad y el trigger no hace nada.
¿Alguien puede ayudarme?.
Gracias.

1 Respuesta

Respuesta
1
No te compliques tanto la vida
y en vez de contolar las excepcion dup_al_on_index haz un selct count(*) into variable
Y según el valor numérico de la variable haces el update o no
En primer lugar, darte las gracias por tu interés y respuesta.
La cuestión es que la tabla tiene 300 millones de registros, y yo quería que el control de unicidad lo hiciera oracle ya que yo supongo (puedo estar equivocado) que siempre será más rápido que el "select count(*) ..." que propones. ¿Estoy equivocado al respecto?.
Gracias.
Efectivamente es mucho más rapido pero yo que tu no contaría mucho con las excepciones de oracle, busca siempre otra alternativa. Por ejemplo el uso de paguetes, funciones y procedimientos. Pero si siques queriendo utilizar excepciones pues utiliaras. Ademas en un trigger puedes utilizar el seLect count y trabajar con el
create or replace trigger
"INFOTECK"."TR_INS_DETALLE" BEFORE
INSERT ON "INFOTECK"."DETALLE"
FOR EACH ROW
DECLARE
CANT NUMBER;
TIEND NUMBER(5);
BEGIN
SELECT COUNT(*) INTO CANT
FROM INFOTECK.DETALLE;
IF CANT=0 THEN
:NEW.ID_LIN_DET:=1+CANT;
ELSE
SELECT MAX(ID_LIN_DET)+1 INTO :NEW.ID_LIN_DET
FROM INFOTECK.DETALLE;
END IF;
:NEW.ID_EMPLEADO:=PK_USUARIOS.usuario_actual;
SELECT ID_TIENDA INTO TIEND
FROM INFOTECK.PEDIDOS
WHERE SERIE=:NEW.SERIE
AND NUMERO=:NEW.NUMERO;
UPDATE INFOTECK.ARTICULOS_TIENDA
SET CANTIDAD=CANTIDAD-:NEW.CANTIDAD
WHERE ID_ARTICULO= :NEW.ID_ARTICULO
AND ID_TIENDA=TIEND;
END;
OK! Muchas gracias. Me sigue pareciendo demasiado select count para una tabla enorme y con 3 ó 4 inserciones por segundo. Pero en cualquier caso y no encontrando otra alternativa a la que tu propones intentaré encaminarlo de esa manera.
Muchas gracias.
Javi.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas