GreysitoErPutoAmo

PL/SQL Cursores

May 6th, 2015
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 5.46 KB | None | 0 0
  1. -- CURSORES
  2.  
  3. --FETCH
  4. DECLARE
  5.   CURSOR cur IS SELECT dnombre, loc FROM depart;
  6.   v_nombre VARCHAR2(14);
  7.   v_localidad VARCHAR2(14);
  8.  
  9. BEGIN
  10.   OPEN cur;
  11.   LOOP
  12.     FETCH cur INTO v_nombre, v_localidad;
  13.     EXIT WHEN cur%NOTFOUND;
  14.     DBMS_OUTPUT.PUT_LINE (v_nombre || '*' || v_localidad);
  15.   END LOOP;
  16.     DBMS_OUTPUT.PUT_LINE ('Nº de departamentos: ' || cur%ROWCOUNT);
  17.   CLOSE cur;
  18. END;
  19. /
  20.  
  21. -- FOR...LOOP
  22. DECLARE
  23.     CURSOR cur IS SELECT dnombre, loc FROM depart;
  24.  
  25. BEGIN
  26.     FOR v_reg IN cur LOOP
  27.         DBMS_OUTPUT.PUT_LINE(v_reg.dnombre || '*' || v_reg.loc);
  28.     END LOOP;
  29. END;
  30. /
  31.  
  32.  
  33. -- Visualizar los apellidos de los empleados pertenecientes al departamento 20 numerandolos secuencialmente.
  34.  
  35. -- FETCH
  36. DECLARE
  37.     CURSOR c1 IS SELECT apellido FROM emple WHERE dept_no=20;
  38.         v_apellido VARCHAR2(10);
  39. BEGIN
  40.     OPEN c1;
  41.     LOOP
  42.         FETCH c1 INTO v_apellido;
  43.         DBMS_OUTPUT.PUT_LINE(TO_CHAR(c1%ROWCOUNT, '99.') || v_apellido);
  44.         -- Al poner esta fila después del EXIT WHEN la última fila no la devolverá dos veces.
  45.         EXIT WHEN c1%NOTFOUND;
  46.     END LOOP;
  47.     CLOSE c1;
  48. END;
  49. /
  50.  
  51. -- FOR...LOOP
  52.  
  53. DECLARE
  54.     CURSOR c1 IS SELECT apellido FROM emple WHERE dept_no=20;
  55. BEGIN
  56.     FOR v_reg IN c1 LOOP
  57.         DBMS_OUTPUT.PUT_LINE(TO_CHAR(c1%ROWCOUNT, '99.') || v_reg.apellido);
  58.     END LOOP;
  59. END;
  60. /
  61.  
  62. -- VARIABLES DE ACOPLAMIENTO, necesarias cuando las variables implicadas en la condición WHERE se conocen en tiempo de ejecución.
  63.  
  64. -- En el siguiente ejemplo se visualizan lso empleados de un departamento cualquiera usando variables de acoplamineto.
  65.     -- se declaran como cualquier otra.
  66.     -- se utiliza en la clausula SELECT, como parte de la supresión.
  67.  
  68. -- FETCH
  69. CREATE OR REPLACE PROCEDURE ver_emple_por_dept (dep emple.dept_no%TYPE)
  70. AS
  71.     v_dept NUMBER (2); -- variable de acoplamiento
  72.     -- el propio parametro es una buena variable de acoplamiento.
  73.     CURSOR c1 IS SELECT apellido FROM emple WHERE dept_no = v_dept;
  74.     -- sin v. de acoplamiento seria dept_no = dep, usando el propio parametro.
  75.     v_apellido VARCHAR2(10);
  76. BEGIN
  77.     v_dept := dep;
  78.     OPEN c1;
  79.     FETCH c1 INTO v_apellido;
  80.     WHILE c1%FOUND LOOP
  81.         DBMS_OUTPUT.PUT_LINE(v_apellido);
  82.         FETCH c1 INTO v_apellido;
  83.     END LOOP;
  84.     CLOSE c1;
  85. END ver_emple_por_dept;
  86. /
  87.  
  88. -- FOR...LOOP
  89. CREATE OR REPLACE PROCEDURE ver_emple_por_dept (dep emple.dept_no%TYPE)
  90. AS
  91.     CURSOR c1 IS SELECT apellido FROM emple WHERE dept_no = dep;
  92. BEGIN
  93.     FOR v_reg INTO c1 LOOP
  94.         DBMS_OUTPUT.PUT_LINE(v_reg.apellido);
  95.     END LOOP;
  96. END ver_emple_por_dept;
  97. /
  98.  
  99. EXECUTE ver_emple_por_dept(20);
  100.  
  101. -- OBJETIVO CURSORES FOR LOOP : simplificar, omitiendo la mayor parte de las tareas del cursor.
  102. -- En el siguiente ejemplo, se visualizan el apellido, el oficio y la comision de los empleados cuya comision supera 500e utilizando CURSOR FOR... LOOP.
  103.  
  104. DECLARE
  105.     CURSOR mi_cursor IS SELECT apellido, oficio, comision FROM emple WHERE comision > 500;
  106.     num_filas NUMBER (3) DEFAULT 0;
  107. BEGIN
  108. -- desaparece la declaración de las variables que recogerán los datos del cursor.
  109. -- desaparece la introducción de apertura del cursor.
  110. -- las filas del cursor no se recuperan con FETCH.
  111. -- el cursor se cierra utomaticamente.
  112.     FOR v_reg IN mi_cursor LOOP
  113.     -- v_reg es del tipo mi_curor%ROWTYPE y solo tiene validez dentro del bucle, no hace falta declararla.
  114.         DBMS_OUTPUT.PUT_LINE(v_reg.apellido||'*'|| v_reg.oficio||'*'||TO_CHAR(v_reg.comision) );
  115.         num_filas := mi_cursor%ROWTYPE;
  116.     END LOOP;
  117.         DBMS_OUTPUT.PUT_LINE ('Nº de departamentos: ' || num_filas);
  118. END;
  119. /
  120.  
  121. -- otro ejemplo FOR...LOOP
  122.  
  123. DECLARE
  124.     CURSOR c_emple_f1 IS
  125.         SELECT dept_no, COUNT(*) n_emp, SUM(salario+NVL(comision, 0)) suma
  126.         FROM emple
  127.         GROUP BY dept_no;
  128. BEGIN
  129.     FOR v_reg_emp IN c_emple_f1 LOOP
  130.         DBMS_OUTPUT.PUT_LINE(v_reg_emp.dept_no || '*' || v_reg_emp.n_emp || '*' || v_reg_emp.suma);
  131.     END LOOP;
  132. END;
  133. /
  134.  
  135. -- el mismo ejemplo con FETCH
  136.  
  137. DECLARE
  138.     v_dept_no emple.dept_no%TYPE;
  139.     v_n_emp NUMBER (5);
  140.     v_suma NUMBER (10);
  141.     CURSOR c_emple_f1 IS SELECT dept_no, COUNT(*) n_emp, SUM(salario+NVL(comision, 0)) suma
  142.         FROM emple
  143.         GROUP BY dept_no;
  144. BEGIN
  145.     OPEN c_emple_f1;
  146.     LOOP
  147.         FETCH c_emple_f1 INTO v_dept_no, v_n_emp, v_suma;
  148.         EXIT WHEN c_emple_f1%NOTFOUND;
  149.         DBMS_OUTPUT.PUT_LINE (v_dept_no|| '*' || v_n_emp || '*' || v_suma);
  150.     END LOOP;
  151.     CLOSE c_emple_f1;
  152. END;
  153. /
  154.  
  155.  
  156. -- CURSORES CON PARAMETROS (sin usar variables de acoplamiento)
  157.  
  158. -- CURSOR nombre (parametros) IS SELECT sentencia select sin parametros
  159. -- Los parametros se declaran NOMBREPARAMETRO IN tipodato := DEFAULT valor
  160. -- a) con FETCH
  161.  
  162. DECLARE
  163.     v_apellido emple.apellido%TYPE;
  164.     v_salario emple.salario%TYPE;
  165.     v_dep emple.dept_no%TYPE;
  166.     v_ofi emple.oficio%TYPE;
  167.    
  168.     CURSOR cur(v_departamento NUMBER, v_oficio VARCHAR2 DEFAULT 'ANALISTA')
  169.     IS
  170.         SELECT apellido, salario FROM emple
  171.         WHERE dept_no = v_departamento AND oficio = v_oficio;
  172. BEGIN
  173.     v_dep := 20;
  174.     v_ofi := 'ANALISTA';
  175.     -- podemos no declarar las variables y al abrir el cursor poner OPEN cur(20) con solo un valor ya que el otro es DEFAULT
  176.     OPEN cur(v_dep, v_ofi);
  177.    
  178.     FETCH cur INTO v_apellido, v_salario;
  179.     WHILE cur%FOUND LOOP
  180.         DBMS_OUTPUT.PUT_LINE(v_apellido || '*' || v_salario);
  181.         FETCH cur INTO v_apellido, v_salario;
  182.     END LOOP;
  183. END;
  184. /
  185. -- el anterior con FOR...LOOP
  186.  
  187. DECLARE
  188.     CURSOR cur(v_departamento NUMBER, v_oficio VARCHAR2 DEFAULT 'ANALISTA')
  189.         IS
  190.             SELECT apellido, salario FROM emple
  191.             WHERE dept_no = v_departamento AND oficio = v_oficio;
  192. BEGIN
  193.     FOR v_reg IN cur(20) LOOP
  194.     DBMS_OUTPUT.PUT_LINE(v_reg.apellido || '*' || v_reg.salario);
  195.     END LOOP;
  196. END;
  197. /
Add Comment
Please, Sign In to add comment