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

Funcion que me devuelva el Salario Anual

Estas en el tema de Funcion que me devuelva el Salario Anual en el foro de Oracle en Foros del Web. Hola, Estoy intentando crear una funcion en oracle que me devuelva el salario anual cuando le pase un cliente de la tabla clientes, pero no ...
  #1 (permalink)  
Antiguo 18/05/2008, 04:37
Avatar de jmfp26  
Fecha de Ingreso: diciembre-2003
Mensajes: 162
Antigüedad: 20 años, 4 meses
Puntos: 2
Funcion que me devuelva el Salario Anual

Hola,

Estoy intentando crear una funcion en oracle que me devuelva el salario anual cuando le pase un cliente de la tabla clientes, pero no consigo dar con la tecla.

Si alguien me puede ayudar se lo agradeceria.

Mi codigo es el siguiente:

CREATE FUNCTION SALARIO_ANUAL RETURN
number
as
SALARIO_TOTAL NUMBER;
begin
SELECT nombre, codigo, ((salario*12)+comision) "Compensación Anual" FROM EMPLEADOS;
RETURN SALARIO_TOTAL;
END SALARIO_ANUAL;

Un Saludo
  #2 (permalink)  
Antiguo 18/05/2008, 16:46
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 1 mes
Puntos: 7
Respuesta: Funcion que me devuelva el Salario Anual

no dices el error pero a tu funcion la hace falta el into, quedaria algo como

SELECT ((salario*12)+comision) "Compensación Anual" into SALARIO_TOTAL FROM EMPLEADOS;
__________________
Blogzote.com :-) Mi blog
  #3 (permalink)  
Antiguo 19/05/2008, 08:37
Avatar de jmfp26  
Fecha de Ingreso: diciembre-2003
Mensajes: 162
Antigüedad: 20 años, 4 meses
Puntos: 2
Respuesta: Funcion que me devuelva el Salario Anual

Hola,

Gracias por responder.

Creo que lo que he hecho no va bien, podrías ayudarme.

Lo que quiero es lo siguiente:

Crear una función almacenada SALARIO_ANUAL para devolver el salario anual cuando se pasa el salario mensual y la comisión de un empleado. Hay que controlar que la función controla valores NULL.
Crear y llamar a la función SALARIO_ANUAL, pasando los valores del salario mensual y de la comisión. La función debería devolver el salario anual definido por:
SALARIO ANUAL = (SALARIO * 12)+COMISION
Usaremos la sentencia SELECT siguiente contra la tabla EMPLEADOS:
SELECT nombre, codigo, SALARIO_ANUAL(salario, comision) “Compensación Anual” FROM empleados;


Esto es lo que he diseñado gracias a tus consejos:

CREATE FUNCTION SALARIO_ANUAL (cod_emple IN NUMBER)
RETURN NUMBER
as
SALARIO_TOTAL NUMBER(7,2);
begin
SELECT ((salario*12)+comision) "Compensación Anual" into SALARIO_TOTAL FROM EMPLEADOS WHERE
codigo = cod_emple;
RETURN (SALARIO_TOTAL);
END;

Esto es lo que debería hacer si el salario fuera 0. (null).

IF salario IS NULL THEN
SALARIO_TOTAL:= comision;
ELSE
IF comision IS NULL THEN
SALARIO_TOTAL := salario*12;
ELSE
SALARIO_TOTAL := (salario*12)+comision;
END IF;

Gracias
Un Saludo

Última edición por jmfp26; 19/05/2008 a las 08:42
  #4 (permalink)  
Antiguo 19/05/2008, 13:43
 
Fecha de Ingreso: enero-2008
Mensajes: 63
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Funcion que me devuelva el Salario Anual

Puede quedar así:

create function salario_anual(
cod_emple number)
return number
as
salario_total number(7,2);
vsalario number;
vcomision number;
begin
select ((salario*12)+comision), salario, comision
into salario_total, vsalario, vcomision
from empleados where
codigo = cod_emple;

if salario_total is null then
salario_total := vcomision;
else
if comision is null then
salario_total := vsalario*12;
else
salario_total := (vsalario*12)+vcomision;
end if;
end if;

return salario_total;
end;

Saludos,
  #5 (permalink)  
Antiguo 21/05/2008, 09:14
Avatar de jmfp26  
Fecha de Ingreso: diciembre-2003
Mensajes: 162
Antigüedad: 20 años, 4 meses
Puntos: 2
Busqueda Respuesta: Funcion que me devuelva el Salario Anual

Hola de nuevo,

Gracias por contestar. Pero mi pregunta es como llamo a la funciona desde sql.

¿Podría ser así?

select nombre, codigo, CREA_USR.SALARIO_ANUAL(salario, comision) "Compensacion Anual" FROM CREA_USR.EMPLEADOS;

Gracias
Un Saludo
  #6 (permalink)  
Antiguo 21/05/2008, 17:19
 
Fecha de Ingreso: enero-2008
Mensajes: 63
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Funcion que me devuelva el Salario Anual

La función recibe sólo el parametro "cod_emple", asumo que es el código del empleado quedaría así:

select nombre, codigo, CREA_USR.SALARIO_ANUAL(codigo) "Compensacion Anual" from CREA_USR.EMPLEADOS;

Saludos,
  #7 (permalink)  
Antiguo 29/05/2008, 05:28
Avatar de jmfp26  
Fecha de Ingreso: diciembre-2003
Mensajes: 162
Antigüedad: 20 años, 4 meses
Puntos: 2
Respuesta: Funcion que me devuelva el Salario Anual

Gracias por la ayuda prestada, me ha servido de mucho.

Serias tan amable de ayudarme con el siguiente problema:


Tengo que crear un bloque PL/SQL que determine los empleados con sueldos más altos.

Acepte un número n por pantalla como entrada de usuario con un parámetro de sustitución SQL*PLUS.

En un bucle, obtener el nombre, código y sueldo de los n empleados con sueldos más altos de la tabla EMPLEADOS.

Almacenar los datos en la tabla SALARIO_TEMP. (que ya tengo creada con la siguiente estructura: (NOMBRE, CODIGO, SALARIO).

Suponga que no hay dos empleados con el mismo sueldo.
Compruebe varios casos, como n = 0, o donde n es mayor que el número de empleados de la tabla EMPLEADOS.

Gracias
Un Saludo
  #8 (permalink)  
Antiguo 29/05/2008, 14:52
 
Fecha de Ingreso: enero-2008
Mensajes: 63
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: Funcion que me devuelva el Salario Anual

Espero esto te sirva, pero te recomiendo que para la próxima crees un nuevo tema en el foro.

Saludos.

-----------------------------------------------------------------

CREATE OR REPLACE procedure getempleados(
nempleados number,
c out sys_refcursor)
as
cant_empl number;
begin

-- 1º Caso: n es igual a 0
if nempleados = 0 then
raise_application_error(-20000,'La cantidad que ingreso es igual a 0');
end if;
-- 2º Caso: n es mayor a la cantidad de empleados
begin
select count(*) into cant_empl from empleados;
exception
when no_data_found then
cant_empl := 0;
end;
if nempleados > cant_empl then
raise_application_error(-20000,'La cantidad que ingreso, supera la cantidad de empleados');
end if;

-- Obtenemos los "n" número de empleados con mayor sueldo
execute immediate ('truncate table salario_temp'); -- Depuramos el temporal
for aux in( -- Empieza el bucle
select rownum item,
w.codigo,
w.nombre,
w.salario,
w.comision
from(
select codigo, nombre, salario, comision
from empleados
order by salario desc -- Orderna de mayor sueldo a menor
) w
having rownum <= nempleados
group by rownum, w.codigo, w.nombre, w.salario, w.comision
order by rownum
)
loop
-- grabamos en el temporal
insert into salario_temp(codigo, nombre, salario)
values(aux.codigo, aux.nombre, aux.salario);
end loop;

-- devolvemos los datos obtenidos
open c for
select * from salario_temp order by salario desc;

exception
when no_data_found then
null;
when others then
raise_application_error(sqlcode, sqlerrm, true);
raise;
end getempleados;
/

Última edición por Michelc; 29/05/2008 a las 15:16
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 16:07.