Oracle - problemas con trigger

 
Vista:

problemas con trigger

Publicado por jackjack1982 (4 intervenciones) el 18/04/2007 15:20:26
Hola a todos.
tengo un problema con un trigger y es el siguiente:
yo tengo una tabla A que tiene un trigger y necesito que ese disparador inserte en dos tablas distintas B y C. Coloco dos sentencias insert (una para cada tabla) en el mismo cuerpo del trigger y todo bien.
El problema es que tengo que tengo que prever que si ya existe esa llave en vez de insert haga un update para cualquiera de las dos, entonces si cada insert dispara una excepcion de tipo dup_val_on_index mando a realizar un update en el que la disparo.
Pero sintacticamente parece que en el cuerpo de un trigger no se puede tener dos captura de excepciones y me da error.
Pongo un ejemplo para ilustrar:

CREATE TRIGGER Esquema.nombre
AFTER INSERT
ON Esquema.A
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
INSERT INTO Esquema.B
(B.b1,
B.b2)
VALUES(:NEW.ID,
:NEW.Valor)
EXCEPTION when dup_val_on_index THEN
UPDATE Esquema.B
SET (B.b2 = B.b2 + :NEW.Valor)
WHERE (B.b1 = :NEW.ID)

INSERT INTO Esquema.C
(C.c1,
C.c2)
VALUES(:NEW.ID,
:NEW.Valor)
EXCEPTION when dup_val_on_index THEN
UPDATE Esquema.C
SET (C.c2 = C.c2 - :NEW.Valor)
WHERE (C.c1 = :NEW.ID)
END;

El error me lo dice en el segundo Exceptio del segundo insert y les cito el error:
PLS-00103: Encontrado o símbolo "EXCEPTION" quando um dos seguintes símbolos era esperado:

begin case declare end exit for goto if loop mod null pragma
raise return select update when while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge
<a single-quoted SQL string> pipe
(Line: 113 Col: 6)

Alguna sugerencia?
muchas gracias de antemano y saludos a todos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:problemas con trigger

Publicado por jackjack1982 (4 intervenciones) el 18/04/2007 18:41:12
Hola a todos
la respuesta al problema anterior es la siguiente:
se debe poner entre begin...end cada bloque de insert...exception

espero le sirva a alguien por si tiene el mismo problema,
saludos a todos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problemas con trigger

Publicado por BNQ (3 intervenciones) el 19/04/2007 01:28:48
Hola... Utiliza Merge, a traves de el puedes determinar la insercion o actualizacion del registro.

MERGE INTO bonuses B
USING (
SELECT employee_id, salary
FROM employee
WHERE dept_no =20) E
ON (B.employee_id = E.employee_id)
WHEN MATCHED THEN
UPDATE SET B.bonus = E.salary * 0.1
WHEN NOT MATCHED THEN
INSERT (B.employee_id, B.bonus)
VALUES (E.employee_id, E.salary * 0.05);

Salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar