SQL - funcion sql

 
Vista:

funcion sql

Publicado por GEMA (6 intervenciones) el 21/04/2019 12:31:08
Hola!!!
Tengo que crear una función capaz de subir el sueldo a todos sus empleados el próximo año. El sueldo subirá un 1% por cada año completo trabajado. En el esquema HR utilizando como varibale de entrada employees_id.

He creado la siguiente función

Create or replace function subida_corresponde (v_employees_id number) RETURN NUMBER AS
v_num number;
begin
UPDATE EMPLOYEES SET salary=salary*1.01*((sysdate-hire_date)/365) into v_num where v_employees_id=employee_id;
return v_num;
end subida_corresponde;
/
pero me da el siguiente fallo
-------- -----------------------------------------------------------------
4/1 PL/SQL: SQL Statement ignored
4/67 PL/SQL: ORA-00933: SQL command not properly ended

¿Alguien me puede ayudar?

Gracias
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: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

funcion sql

Publicado por gilman (103 intervenciones) el 22/04/2019 08:37:48
El problema es que tienes que ejecutar la sentencia update en dos pasos:

primero
1
UPDATE EMPLOYEES SET salary=salary*1.01*((sysdate-hire_date)/365) where v_employees_id=employee_id;
y luego
1
SELECT salary into v_num where v_employees_id=employee_id;
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

funcion sql

Publicado por GEMA (6 intervenciones) el 22/04/2019 17:02:50
Muchas gracias, ya me funciona

el siguiente paso y el último que tengo que hacer es crear un trigger de forma que cada vez que se cambie el hire_date, se aplique la función en el salario.
Esto es lo que tengo:


1
2
3
4
5
6
7
8
9
10
11
12
Create or replace trigger tgr_employees
after insert or update on employees
 for each row
begin
if inserting then
:new.salary := subida_sueldo_corresponde;
end if;
if updating then
:new.salary := subida_sueldo_corresponde;
end if;
end;
/


pero el trigger se me crea con los siguientes errores:

LINE/COL ERROR
-------- -----------------------------------------------------------------
3/1 PL/SQL: Statement ignored
3/16 PLS-00306: wrong number or types of arguments in call to
'SUBIDA_SUELDO_CORRESPONDE'

6/1 PL/SQL: Statement ignored
6/16 PLS-00306: wrong number or types of arguments in call to
'SUBIDA_SUELDO_CORRESPONDE'

¿Alguien me ayuda?


Gracias
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
Imágen de perfil de gilman
Val: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

funcion sql

Publicado por gilman (103 intervenciones) el 23/04/2019 08:40:59
El error es debido a que no le estás pasando el argumento a la función, debería quedar:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Create or replace trigger tgr_employees
after insert or update on employees
 for each row
begin
 
if inserting then
	:new.salary := subida_sueldo_corresponde (:new.employee_id);
end if;
 
if updating then
	:new.salary := subida_sueldo_corresponde(:new.employee_id);
end if;
 
end;
 
/
Pero no funcionará ya que la función subida_sueldo_corresponde accede a la tabla employees y desde un trigger no se puede acceder a la tabla mutante.
De todas formas, revisa lo que quieres hacer, ¿de verdad que cada vez que se actualice un dato de un empleado vas a subirle el sueldo?
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

funcion sql

Publicado por GEMA (6 intervenciones) el 23/04/2019 12:10:13
Muchas gracias por la ayuda, pero lo he probado pero me da error por introducir mal la variable, employee_id.
No sería cada vez que se actualice un dato de un empleado, si no que cuando cambie la fecha hire_date se actualice el sueldo según lo establecido en la función, no sé si me he explicado bien.
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
Imágen de perfil de gilman
Val: 184
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

funcion sql

Publicado por gilman (103 intervenciones) el 24/04/2019 08:28:27
1.- El trigger se dispara independientemente del campo actualizado. Así que subiría el sueldo con cada cambio en la tabla.
2.- El código que te pasé debería compilar correctamente.

A pesar de todo, como te dije en el otro post, no debería funcionar, ya que la función hace uso de la tabla que ha disparado el trigger y eso no se puede hacer.
El cálculo debe hacerse integramente dentro del trigger y sin necesidad de hacer consultas sobre la tabla.
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