You are on page 1of 5

TALLER

STORED FUNCTIONS

1. Crear una funcin llamada ANNUAL_COMP, que dado como parmetro el cdigo de
un empleado me devuelva el total de salario y comisin anual que debera recibir al
ao el empleado.

CREATE OR REPLACE FUNCTION ANNUAL_COMP


(p_id IN EMPLOYEES.EMPLOYEE_ID%TYPE)
RETURN NUMBER
IS
v_salary EMPLOYEES.SALARY%TYPE;
v_commision EMPLOYEES.COMMISSION_PCT%TYPE;
BEGIN
SELECT salary+salary*NVL(COMMISSION_PCT,0) INTO v_salary FROM
employees WHERE employee_id=p_id;
RETURN v_salary;
END ANNUAL_COMP;
/
2. Crear un procedimiento llamado NEW_EMP, para ingresar un nuevo empleado en la
tabla EMPLOYEES el procedimiento llamara a una funcin VALID_DEPTID que validar
que el cdigo del departamento exista en la tabla DEPARTMENTS.

CREATE OR REPLACE FUNCTION VALID_DEPTID


(p_id IN DEPARTMENTS.DEPARTMENT_ID%TYPE)
RETURN BOOLEAN
IS
valido BOOLEAN := true;
dep_name DEPARTMENTS.DEPARTMENT_NAME%TYPE;
BEGIN
SELECT department_name INTO dep_name FROM DEPARTMENTS WHERE
department_id=p_id;
IF SQL%NOTFOUND THEN
valido:=false;
END IF;
RETURN valido;
END VALID_DEPTID;
/

SET SERVEROUTPUT ON
CREATE OR REPLACE PROCEDURE NEW_EMP
(emp_id IN employees.employee_id%TYPE,
first_n IN EMPLOYEES.FIRST_NAME%TYPE,
last_n IN EMPLOYEES.LAST_NAME%TYPE,
mail IN EMPLOYEES.EMAIL%TYPE,
phone IN EMPLOYEES.PHONE_NUMBER%TYPE,
hire_d IN EMPLOYEES.HIRE_DATE%TYPE,
j_id IN EMPLOYEES.JOB_ID%TYPE,
sal IN EMPLOYEES.SALARY%TYPE,
com_pct IN EMPLOYEES.COMMISSION_PCT%TYPE,
man_id IN EMPLOYEES.MANAGER_ID%TYPE,
dep_id IN EMPLOYEES.DEPARTMENT_ID%TYPE,
bonus IN EMPLOYEES.EMPLOYEE_BONUS%TYPE)
IS
err_no_valid_dept EXCEPTION;
BEGIN
IF VALID_DEPTID(dep_id) THEN
INSERT INTO EMPLOYEES VALUES(emp_id, first_n, last_n, mail, phone, hire_d,
j_id, sal, com_pct, man_id, dep_id, bonus);
ELSE
RAISE err_no_valid_dept;
END IF;

COMMIT;
EXCEPTION
WHEN err_no_valid_dept THEN
DBMS_OUTPUT.PUT_LINE('El departamento al que se quiere ingresar no
existe');
END NEW_EMP;
/

EXECUTE NEW_EMP(207,'ADRIAN','MENA', 'ALMENA4', '515.123.4567', '17/06/87',


'AD_PRES', 24000, 0, 101, 90, 0);

3. Crear una funcin llamada QUERY_JEFE que dado como parmetro el cdigo de un
empleado me devuelva el nombre de su jefe inmediato, probar su funcionamiento
mediante un select a todos los empleados de la tabla employees.

CREATE OR REPLACE FUNCTION query_jefe


(e_id IN employees.employee_id%TYPE)
RETURN VARCHAR2
IS
v_nomjefe employees.last_name%TYPE;
BEGIN
SELECT f.last_name
INTO v_nomjefe
FROM employees e
INNER JOIN employees f
ON e.manager_id=f.employee_id AND e.employee_id = e_id;

RETURN v_nomjefe;
END query_jefe;
/
--Al empleado con id 130
SELECT query_jefe(employee_id) as "Jefe", last_name as "Empleado" from
employees where employee_id = 130;
--A todos lo empleados
SELECT query_jefe(employee_id) as "Jefe", last_name as "Empleado" from employees;

4. Crear una funcin llamada QUERY_DEPT que dado como parmetro el cdigo de un
departamento me devuelva el nmero de puestos de trabajo diferentes que existen
en ese departamento.

CREATE OR REPLACE FUNCTION QUERY_DEPT


(d_id IN departments.department_id%TYPE)
RETURN NUMBER
IS
v_jobtypes number := 0;
BEGIN
SELECT count(count(JOB_ID))
INTO v_jobtypes
FROM employees
where department_id=d_id
group by job_id;

RETURN v_jobtypes;
END QUERY_DEPT;
/

SELECT query_dept(department_id), department_name from departments where


DEPARTMENT_ID = 80;

You might also like