Base de Datos. Escriba un bloque PL/SQL
Enviado por marceloubi666 • 24 de Mayo de 2020 • Examen • 1.069 Palabras (5 Páginas) • 129 Visitas
- Escriba un bloque PL/SQL que utilice un cursor para seleccionar los cinco empleados mejor pagados de la tabla employees
set SERVEROUTPUT ON
declare
v_salario employees.salary%type;
v_cod employees.employee_id%type;
v_nombre employees.first_name%type;
v_contador number:=0;
cursor pagados is
select employee_id, first_name, salary
from employees
order by salary desc;
begin
open pagados;
loop
fetch pagados into v_cod, v_nombre, v_salario;
DBMS_OUTPUT.PUT_LINE('codigo: '||v_cod||' Nombre: '||v_nombre||' Salarios: '||v_salario);
v_contador :=v_contador + 1;
exit when v_contador >=5;
end loop;
end;
/
- Crear una función llamada FUNC_UNO que dado el código de un empleado retorne la ciudad en la que trabaja
set SERVEROUTPUT ON
create or replace function FUN_UNO
(cod_emp in employees.employee_id%type)
return varchar2
is
v_cod employees.employee_id%type;
v_nombre employees.first_name%type;
v_ciudad locations.city%type;
begin
select e.employee_id, e.first_name, l.city
into v_cod, v_nombre, v_ciudad
from employees e, departments d, locations l
where e.department_id = d.department_id and
d.location_id = l.location_id and
employee_id = cod_emp;
return v_ciudad;
DBMS_OUTPUT.PUT_LINE('codigo: '||v_cod||' Nombre: '||v_nombre||' Ciudad: '||v_ciudad);
end FUN_UNO;
select employee_id, first_name, FUN_UNO(employee_id) ciudad
from employees
order by employee_id;
- Crear un PLSQL donde utilice un cursor para que dado el código de dos empleados (como parámetro), devuelva el employee_id y department_id , de todos empleados que tienen el mismo manager_id y department_id (que el de los empleados dados como parámetro).Además por cada registro que devuelva el cursor llamar a la función FUNC_UNO para imprimir en pantalla el nombre del empleado y la ciudad donde trabaja cada uno de ellos
CREATE OR REPLACE PROCEDURE compas(
e1_id IN employees.employee_id%TYPE,
e2_id IN employees.employee_id%TYPE,
c_dbuser OUT SYS_REFCURSOR)
IS
BEGIN
OPEN c_dbuser FOR
SELECT employee_id, department_id FROM employees
WHERE manager_id IN (SELECT manager_id from employees where employee_id=e1_id OR employee_id=e2_id)
AND department_id IN (SELECT department_id from employees where employee_id=e1_id OR employee_id=e2_id);
END;
SET SERVEROUTPUT ON
DECLARE
c_dbuser SYS_REFCURSOR;
v_empid employees.employee_id%TYPE;
v_depid employees.department_id%TYPE;
BEGIN
compas(110,120,c_dbuser);
LOOP
FETCH c_dbuser INTO v_empid,v_depid;
EXIT WHEN c_dbuser%NOTFOUND;
dbms_output.put_line(v_empid ||' '||v_depid ||' '|| FUNC_UNO(v_empid));
END LOOP;
CLOSE c_dbuser;
END;
- Crear un procedimiento que me indique en pantalla para todos los empleados (tabla employees) que tengan un salario mayor a $3000 cuantos compañeros de trabajo tiene cada uno de ellos.
CREATE OR REPLACE PROCEDURE showSal
IS
v_empid employees.first_name%TYPE;
v_depid employees.department_id%TYPE;
v_sal employees.salary%TYPE;
v_num NUMBER;
c_dbuser SYS_REFCURSOR;
BEGIN
OPEN c_dbuser FOR
SELECT e.first_name , e.salary, e.department_id, COUNT(es.employee_id)-1
from employees e, employees es
where e.salary >3000 and es.department_id= e.department_id
GROUP BY e.first_name , e.salary,e.department_id ORDER BY e.department_id;
LOOP
FETCH c_dbuser INTO v_empid,v_sal,v_depid,v_num;
EXIT WHEN c_dbuser%NOTFOUND;
dbms_output.put_line(v_empid ||' '||v_depid ||' '|| TO_CHAR(v_num));
END LOOP;
CLOSE c_dbuser;
END;
execute showSal;
Grupo II
- Escriba un bloque PL/SQL que utilice un cursor para seleccionar los cinco empleados peor pagados de la tabla employees
set SERVEROUTPUT ON
declare
cod_emp employees.employee_id%type;
v_nombre employees.first_name%type;
v_salario employees.salary%type;
v_contador number:=0;
cursor mal_pagados is
select employee_id, first_name, salary
from employees
order by salary asc;
begin
open mal_pagados;
loop
fetch mal_pagados into cod_emp, v_nombre, v_salario;
DBMS_OUTPUT.PUT_LINE('codigo: '||cod_emp||' Nombre: '||v_nombre||' Salarios: '||v_salario);
v_contador := v_contador + 1;
exit when v_contador >=5;
...