Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

ORA-04091: mutating, trigger/function may not see it

Estas en el tema de ORA-04091: mutating, trigger/function may not see it en el foro de Oracle en Foros del Web. Buenas Tardes Amigos Tengo una tabla que se llena mediante un archivo .ctl este archivo llene una cantidad (X) de campo pero la tabla tiene ...
  #1 (permalink)  
Antiguo 29/04/2011, 14:08
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 2
Antigüedad: 15 años, 8 meses
Puntos: 0
Información ORA-04091: mutating, trigger/function may not see it

Buenas Tardes Amigos

Tengo una tabla que se llena mediante un archivo .ctl este archivo llene una cantidad (X) de campo pero la tabla tiene mas (ya que tiene cmpos con valores por defaut, uno de esos campos es el campo estado que al llenarse la tabla, ese campo por defecto tooma el valor 'NEW', que definio al definir la creacion de la tabla)

existen dos campos que si estan definidos en el CTL llamados dirfactura y dirpedido... a veces estos dos campos me vienen vacio.

lo que quiero es que si alguno de los dos de estos campos me viene vacio inmediatamente hacerle un update a la tabla en el campo Estado (que por defecto viene 'NEW') colocarle el valor 'ERROR'

yo intente hacerlo con un tigger pero me da un ORA-04091: table XXVE.IC_ENCABEZADO_PEDIDO_SYSGOLD is mutating, trigger/function may not see it ... entendi que esto sucede porque estoy haciendo un update a una misma tabla que estoy consultando....

luego para solucionar hice dos tigger en el primero los valores vacion encontrados los inserte en una tabla temporal para guardarlos... en el segundo tiguer hago el update validando mi tabla base con la temporal de los valores encontrados en el tigger uno...perote cuento que me da el mismo error.... ya no se que hacer

la otra solucion es programar el ctl para que al momento del llenado valide todo esto comentado. Pero el problema es que no se .. y a demas el Ctl no tiene definido l campo Estado que es el que quiero actualizar (ya que no lo colocan porque esta definido en la tabla pordefecto como 'NEW')...

se que en un CTL puedo colocar una funcion llamada NVL que evalua campos nulos, pero eso lo hace son su mismo campo y yo quiero es que modifique otro campo, no asi mismo.

Disculpaen la mala redacción pero trate de explicartelo coloquialmente y puedas entenderme..
  #2 (permalink)  
Antiguo 10/05/2011, 05:10
 
Fecha de Ingreso: agosto-2006
Mensajes: 174
Antigüedad: 17 años, 8 meses
Puntos: 2
Respuesta: ORA-04091: mutating, trigger/function may not see it

Buenas,


Efectivamente, ese error sale cuando dentro de un trigger se esta haciendo una operacion sobre la propia tabla sobre la cual se está lanzando dicho disparador.

Una de las soluciones es usar la clausula de TRANSACCIONES AUTONOMAS. Esto es, marcamos el subprograma para que se comporte como transacción diferente a la del proceso principal, llevando el control de COMMIT o ROLLBACK independiente. Como se puede ver en el ejemplo, que es similar a tu caso:


SQL> CREATE OR REPLACE TRIGGER tbi_short
2 BEFORE INSERT
3 ON x_short
4 REFERENCING NEW AS NEW OLD AS OLD
5 FOR EACH ROW
6 declare
7 pragma autonomous_transaction;
8 begin
9 -- if creating a new default then set all other default(s) false
10 if (:new.b_default = -1) then
11 update x_short set b_default = 0 where b_default = -1;
12 commit;
13 end if;
14
15 -- generate pk
16 if :new.pk is null then
17 execute immediate 'select sys_op_guid() from dual ' into :new.pk;
18 end if;
19
20 End;
21 /

Saludos
  #3 (permalink)  
Antiguo 10/05/2011, 15:40
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: ORA-04091: mutating, trigger/function may not see it

Como bien dices, puedes utilizar la función NVL dentro del .CTL, y también asignar el valor de un campo en función de otro, por ejemplo:

Código:
SQL> create table t1 (id1 number(8), id2 number(8));

Tabla creada.

SQL> exit
Dentro del .CTL

Código:
LOAD DATA
 INFILE *
 REPLACE
 INTO TABLE T1
 FIELDS TERMINATED BY ","
 (  ID1,
    ID2 "NVL(:ID1,100)"
 )
BEGINDATA
1,2
,2
Llamada al SQL*Loader

Código:
C:\Temp>sqlldr user/pass@sid control=1.ctl
Finalmente el resultado de la tabla es ID2=100 cuando ID1 es NULL

Código:
SQL> select * from t1;

       ID1        ID2
---------- ----------
         1          1
                  100
Saludos

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:36.