Error en Trigger con procedimiento
Hola.
Tengo una trigger asociado a una tabla, dicho trigger debe saltar cuanodo se inserta o se elimina un registro.
El trigger llama a un procedimiento crea (con dbms_sql) una vista dependiendo de los datos de la tabla inicial.
Al insertar un registro, este es el error que me da:
ORA-04092: no se ha podido COMMIT en un disparador
ORA-06512: en "SYS.DBMS_SYS_SQL", lÃnea 491
ORA-06512: en "SYS.DBMS_SQL", lÃnea 32
ORA-06512: en "ZARAGOZA.CREARVIEWTOTAL", lÃnea 61
ORA-06512: en "ZARAGOZA.TRG_CAMBIO_VIEW", lÃnea 6
ORA-04088: error durante la ejecución del disparador 'ZARAGOZA.TRG_CAMBIO_VIEW'
¿alguna sugerencia?
Muchas gracias
Tengo una trigger asociado a una tabla, dicho trigger debe saltar cuanodo se inserta o se elimina un registro.
El trigger llama a un procedimiento crea (con dbms_sql) una vista dependiendo de los datos de la tabla inicial.
Al insertar un registro, este es el error que me da:
ORA-04092: no se ha podido COMMIT en un disparador
ORA-06512: en "SYS.DBMS_SYS_SQL", lÃnea 491
ORA-06512: en "SYS.DBMS_SQL", lÃnea 32
ORA-06512: en "ZARAGOZA.CREARVIEWTOTAL", lÃnea 61
ORA-06512: en "ZARAGOZA.TRG_CAMBIO_VIEW", lÃnea 6
ORA-04088: error durante la ejecución del disparador 'ZARAGOZA.TRG_CAMBIO_VIEW'
¿alguna sugerencia?
Muchas gracias
No he puesto commit en el procedimiento.
De hecho el procedimiento hace una lectura mediante un cursor de la tabla en la que ha saltado el trigger y con los datos que obtiene crea una vista.
De hecho el procedimiento hace una lectura mediante un cursor de la tabla en la que ha saltado el trigger y con los datos que obtiene crea una vista.
Gracias.
El trigger tan sólo hace una llamada a un procedimiento. Este es el código:
CREATE OR REPLACE TRIGGER TRG_CAMBIO_VIEW
AFTER INSERT OR DELETE ON GRL_PID
BEGIN
CREARVIEWTOTAL();
EXCEPTION
WHEN OTHERS THEN
Null;
END TRG_CAMBIO_VIEW;
/
Saludos
El trigger tan sólo hace una llamada a un procedimiento. Este es el código:
CREATE OR REPLACE TRIGGER TRG_CAMBIO_VIEW
AFTER INSERT OR DELETE ON GRL_PID
BEGIN
CREARVIEWTOTAL();
EXCEPTION
WHEN OTHERS THEN
Null;
END TRG_CAMBIO_VIEW;
/
Saludos
Ah!! la excepción la tengo comentada de momento para que salte el error.
No hay peor ciego que el que no quiere ver.
El commit no tiene que estár necesariamente en el trigger.
Si en el trigger haces una llamada a un procedimiento y este hace commit, te saltará el error. Es como si el commit estuviera dentro del trigger.
NO SE PUEDE ¡ ¡ ¡ ¡
El commit no tiene que estár necesariamente en el trigger.
Si en el trigger haces una llamada a un procedimiento y este hace commit, te saltará el error. Es como si el commit estuviera dentro del trigger.
NO SE PUEDE ¡ ¡ ¡ ¡
Hola, podrias mandar el CrearViewTotal sobre todo la parte de la linea 61
saludos
saludos
Gracias.
Te mando las últimas lineas del procedimiento
cursorDin:=DBMS_SQL.OPEN_CURSOR;
dbms_sql.parse(cursorDin,cadenaTotal,dbms_sql.v7);
aux:=dbms_sql.execute(cursorDin);
dbms_sql.close_cursor(cursorDin);
En cadenaTotal está la sentencia "CREATE OR REPLACE VIEW VIEWTOTAL ...."
cursorDin y Aux son enteros
Saludos
Te mando las últimas lineas del procedimiento
cursorDin:=DBMS_SQL.OPEN_CURSOR;
dbms_sql.parse(cursorDin,cadenaTotal,dbms_sql.v7);
aux:=dbms_sql.execute(cursorDin);
dbms_sql.close_cursor(cursorDin);
En cadenaTotal está la sentencia "CREATE OR REPLACE VIEW VIEWTOTAL ...."
cursorDin y Aux son enteros
Saludos
Hola, despues de haberte hecho la pregunta mire una cosa en el manual...
El problema que tienes es que todas las sentencias de creacion de tablas, vistas.. tiene el COMMIT implicito y por eso te dice que no puedes hacer COMMIT en el trigger.
La solucion es que indiques que ese procedimiento es una transación autonoma y no interfiere con la otra.
En la parte de declaracion del procedimiento lo siguiente:
PRAGMA AUTONOMOUS_TRANSACTION;
Un saludo
El problema que tienes es que todas las sentencias de creacion de tablas, vistas.. tiene el COMMIT implicito y por eso te dice que no puedes hacer COMMIT en el trigger.
La solucion es que indiques que ese procedimiento es una transación autonoma y no interfiere con la otra.
En la parte de declaracion del procedimiento lo siguiente:
PRAGMA AUTONOMOUS_TRANSACTION;
Un saludo