GreysitoErPutoAmo

PL/SQL AC 10

May 11th, 2015
359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 4.57 KB | None | 0 0
  1. --ACTIVIDADES COMPLEMENTARIAS T.10
  2.  
  3. --1 Desarrolla un procedimiento que visualice el apellido y la fecha de alta de todos los empleados ordenados por apellido.
  4. --FETCH
  5. CREATE OR REPLACE PROCEDURE ver_emp AS
  6.     CURSOR cur IS
  7.         SELECT APELLIDO, FECHA_ALT
  8.         FROM EMPLE
  9.         ORDER BY APELLIDO;
  10.     v_apellido VARCHAR2(10);
  11.     v_fecha DATE;
  12. BEGIN
  13.     OPEN cur;
  14.     FETCH cur INTO v_apellido, v_fecha;
  15.     WHILE cur%FOUND LOOP
  16.             DBMS_OUTPUT.PUT_LINE( v_apellido||' * '||v_fecha);
  17.             FETCH cur INTO v_apellido,v_fecha;
  18.     END LOOP;
  19.     CLOSE cur;
  20. END ver_emp;
  21. /
  22.  
  23. -- 2 Codificar un procedimiento que muestre el nombre de cada departamento y el número de empleados que tiene.
  24.  
  25. CREATE OR REPLACE PROCEDURE ver_emple_depart AS
  26.     CURSOR CUR IS
  27.         SELECT dnombre, COUNT(emp_no)
  28.         FROM emple e, depart d
  29.         WHERE d.dept_no = e.dept_no(+)
  30.         GROUP BY dnombre;
  31.     v_dnombre depart.dnombre%TYPE;
  32.     v_num_emple BINARY_INTEGER;
  33. BEGIN
  34.     OPEN cur;
  35.     FETCH cur INTO v_dnombre, v_num_emple;
  36.     WHILE cur%FOUND LOOP
  37.         DBMS_OUTPUT.PUT_LINE(v_dnombre||' * '||v_num_emple);
  38.         FETCH cur INTO v_dnombre,v_num_emple;
  39.     END LOOP;
  40.     CLOSE cur;
  41. END ver_emple_depart;
  42. /
  43.  
  44. -- 3 Escribir un programa que visualice el apellido y el salario de los cinco empleados que tienen el salario más alto.
  45.  
  46. CREATE OR REPLACE PROCEDURE emp_5
  47. AS
  48.     CURSOR cur IS
  49.         SELECT apellido, salario FROM emple
  50.         ORDER BY salario DESC;
  51.     vr_emp cur%ROWTYPE;
  52.     v_num NUMBER;
  53. BEGIN
  54.     v_num:=1;
  55.     OPEN cur;
  56.     FETCH cur INTO vr_emp;
  57.     WHILE cur%FOUND AND v_num<=5 LOOP
  58.         DBMS_OUTPUT.PUT_LINE(vr_emp.apellido ||' * '|| vr_emp.salario);
  59.         FETCH cur INTO vr_emp;
  60.         v_num:=v_num+1;
  61.     END LOOP;
  62.     CLOSE cur;
  63. END emp_5;
  64. /
  65.  
  66. -- 4 Codificar un programa que visualice los dos empleados que ganan menos de cada oficio.
  67.  
  68. CREATE OR REPLACE PROCEDURE emp_2
  69. AS
  70.     CURSOR cur IS
  71.         SELECT apellido, oficio, salario FROM emple
  72.         ORDER BY oficio, salario;
  73.     vr_emp cur%ROWTYPE;
  74.     oficio_ant EMPLE.OFICIO%TYPE;
  75.     v_num NUMBER;
  76. BEGIN
  77.     OPEN c_emp;
  78.     oficio_ant:='*';
  79.     FETCH cur INTO vr_emp;
  80.     WHILE cur%FOUND LOOP
  81.         IF oficio_ant <> vr_emp.oficio THEN
  82.             oficio_ant := vr_emp.oficio;
  83.             v_num := 1;
  84.         END IF;
  85.         IF v_num <= 2 THEN
  86.             DBMS_OUTPUT.PUT_LINE(vr_emp.oficio||' * ' ||vr_emp.apellido||' * ' ||vr_emp.salario);
  87.         END IF;
  88.         FETCH cur INTO vr_emp;
  89.         v_num:=v_num+1;
  90.     END LOOP;
  91.     CLOSE cur;
  92. END emp_2;
  93. /
  94.  
  95. -- 5 Desarrollar un procedimiento que permita insertar nuevos departamentos según las siguientes especificaciones:
  96. -- Se pasará al procedimiento el nombre del departamento y la localidad.
  97. -- El procedimiento insertará la fila nueva asignando como número de departamento la decena siguiente al número mayor de la tabla.
  98. -- Se incluirá gestión de posibles errores.
  99.  
  100. CREATE OR REPLACE PROCEDURE insertar_depart(
  101.     nombre_dep VARCHAR2,
  102.     loc VARCHAR2)
  103. AS
  104.     CURSOR cur IS SELECT dnombre
  105.             FROM depart WHERE dnombre = nombre_dep;
  106.     v_dnombreDEPART.DNOMBRE%TYPE DEFAULT NULL;
  107.     v_ulti_num DEPART.DEPT_NO%TYPE;
  108.     nombre_duplicado EXCEPTION;
  109. BEGIN
  110. -- comprobar que no esté duplicado
  111.     OPEN cur;
  112.     FETCH cur INTO v_dummy;
  113.     CLOSE cur;
  114.     IF v_dnombre IS NOT NULL THEN
  115.         RAISE nombre_duplicado;
  116.     END IF;
  117.  
  118. --  coger el último número y calcular el siguiente
  119.     SELECT MAX(dept_no) INTO v_ulti_num FROM depart;
  120.  
  121. -- Inserción de la nueva fila
  122.     INSERT INTO depart VALUES ((TRUNC(v_ulti_num, -1)+10), nombre_dep, loc);
  123.     EXCEPTION WHEN nombre_duplicado THEN
  124.         DBMS_OUTPUT.PUT_LINE('Err. departamento duplicado');
  125.         RAISE;
  126.     WHEN OTHERS THEN
  127.         RAISE_APPLICATION_ERROR(-20005,'ERROR: no se puede realizar la operación');
  128. END insertar_depart;
  129. /
  130.  
  131. -- 6 Codificar un procedimiento reciba como parámetros un numero de departamento, un importe y un porcentaje; y suba el salario a
  132. -- todos los empleados del departamento indicado en la llamada. La subida será el porcentaje o el importe indicado en la llamada
  133. -- (el que sea más beneficioso para el empleado en cada caso empleado).
  134.  
  135. CREATE OR REPLACE PROCEDURE sub_sal(
  136.     num_depar emple.dept_no%TYPE,
  137.     importe NUMBER,
  138.     porcentaje NUMBER)
  139. AS
  140.     CURSOR cur IS SELECT salario,ROWID
  141.               FROM emple WHERE dept_no = num_depar;
  142.     vr_sal cur%ROWTYPE;
  143.     v_imp_por NUMBER(10);
  144. BEGIN
  145.     OPEN cur;
  146.     FETCH cur INTO vr_sal;
  147.     WHILE cur%FOUND LOOP
  148.  
  149. -- Guardar en v_imp_por el importe mayor
  150.         v_imp_por := GREATEST((vr_sal.salario/100)*porcentaje, v_imp_por);
  151.  
  152. -- Actualizar
  153.         UPDATE EMPLE SET SALARIO=SALARIO + v_imp_por WHERE ROWID = vr_sal.ROWID;
  154.  
  155.         FETCH cur INTO vr_sal;
  156.     END LOOP;
  157.     CLOSE cur;
  158. -- Excepción
  159.     EXCEPTION WHEN NO_DATA_FOUND THEN
  160.         DBMS_OUTPUT.PUT_LINE('ERROR: No se actualiza ninguna fila');
  161. END sub_sal;
  162. /
Add Comment
Please, Sign In to add comment