Oracle - Error tabla mutante - Ejercicio

 
Vista:
sin imagen de perfil
Val: 1
Ha disminuido su posición en 7 puestos en Oracle (en relación al último mes)
Gráfica de Oracle

Error tabla mutante - Ejercicio

Publicado por RaGK (1 intervención) el 25/02/2020 11:54:06
Buenas,

Nos han planteado un problema con una función y un trigger. Pero al intentar hacer un update de el hire_date para que se actualice el salary en función del hire date me da error en tabla mutante. Dejo el código a ver si algún alma caritativa me puede echar una mano. Gracias!

CREATE OR REPLACE FUNCTION subida_sueldo_corresponde (trabajador IN NUMBER)
RETURN NUMBER IS
v_salario hr.employees.salary%type;
v_porcentaje NUMBER:=0.01;
v_ano NUMBER(2);
v_nuevo_sal NUMBER;
BEGIN
SELECT salary, FLOOR((SYSDATE - hire_date) / 365) INTO v_salario, v_ano FROM hr.employees WHERE employee_id=trabajador;
v_nuevo_sal:= v_salario + ((v_salario*v_ano)*v_porcentaje);
RETURN v_nuevo_sal;
END;


CREATE OR REPLACE TRIGGER subida_sueldo_correspondiente AFTER UPDATE OF hire_date ON hr.employees FOR EACH ROW
DECLARE
nuevo_sueldo NUMBER;
BEGIN
SELECT subida_sueldo_corresponde(:old.employee_id) INTO nuevo_sueldo from dual;
UPDATE hr.employees SET salary=nuevo_sueldo WHERE employee_id=:old.employee_id;
END;
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
Imágen de perfil de gilman
Val: 117
Bronce
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Error tabla mutante - Ejercicio

Publicado por gilman (52 intervenciones) el 26/02/2020 08:43:03
El problema es que la función subida_sueldo_corresponde hace una consulta sobre la tabla en la cual se produce el trigger (tabla mutante), y eso no se puede hacer, el cálculo se debe realizar integramente en el trigger, usando las columnas :New....
por otro lado y por el mismo motivo la sentencia UPDATE fallará.
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