GreysitoErPutoAmo

PL/SQL Actualizar filas con Cursores

May 13th, 2015
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 2.19 KB | None | 0 0
  1. -- PAGINA 289
  2.  
  3. -- Los cursores con FOR UPDATE se recorren siempre con FETCH.
  4.  
  5. CREATE OR REPLACE PROCEDURE subir_salario_dpto
  6.     vp_num_dpto NUMBER;
  7.     vp_por_subida NUMBER;
  8. AS
  9.     CURSOR c_emple IS SELECT oficio, salario
  10.     FROM emple WHERE dept_no = vp_num_dpto
  11.     FOR UPDATE; -- añadir FOR UPDATE es lo que indica que es un cursor que facilita las actualizaciones.
  12. -- si la consulta del cursor hace referencia a múltiples tablas o columnas de una tabla, entonces utilizaremos FOR UPDATE of nombre_columna, consiguiendo que solamente se bloqueen las filas correspondientes a la tabla que tenga la columna especificada.
  13.     vc_reg_emple c_emple%ROWTYPE;
  14.     v_inc NUMBER (9,2);
  15. BEGIN
  16.     OPEN c_emple;
  17.  
  18.     FETCH c_emple INTO vc_reg_emple;
  19.     WHILE c_emple%FOUND LOOP
  20.         v_inc := (vc_reg_emple.salario / 100) * vp_por_subida;
  21.         UPDATE emple SET salario = salario + v_inc
  22.         WHERE CURRENT OF c_emple; -- indica que se actualice la última fila recuperada con FETCH.
  23.         FETCH c_emple INTO vc_reg_emple;
  24.     END LOOP;
  25. END subir_salario_dpto;
  26. /
  27.  
  28. EXECUTE subir_salario_dpto (10,10);
  29.  
  30. --PROBLEMAS POSIBLES con el bloqueo y el desbloqueo de filas.
  31. -- El bloqueo de filas y la determinación de una única transacción de los cursores FOR UPDATE suele ser lo más adecuado cuando queremos actualizar todas las filas seleccionadas por el cursor.
  32.  
  33. -- La actualización de filas con ROWID realiza bloqueos individuales de fila. Normalmente optaremos por ella cuando se prevean pocas actualizaciones en relación con el número de filas seleccionado por el cursor.
  34.  
  35. CREATE OR REPLACE PROCEDURE subir_salario_dpto_b
  36.     (vp_num_dpto NUMBER,
  37.     vp_pct_subida NUMBER)
  38. AS
  39.     CURSOR c_emple IS SELECT oficio, salario, ROWID
  40.             FROM emple WHERE dept_no = vp_num_dpto;
  41.     vc_reg_emple c_emple%ROWTYPE;
  42.     v_inc NUMBER(8,2);
  43. BEGIN
  44.     OPEN c_emple;
  45.     FETCH c_emple INTO vc_reg_emple;
  46.     WHILE c_emple%FOUND LOOP
  47.         v_inc := (vc_reg_emple.salario /100) * vp_pct_subida;
  48.         UPDATE emple SET salario = salario + v_inc
  49.         WHERE ROWID = vc_reg_emple.ROWID;
  50.         FETCH c_emple INTO vc_reg_emple;
  51.     END LOOP;
  52. END subir_salario_dpto_b;
  53. /
  54.  
  55. --En caso de que tengamos que declarar explícitamente la variable que recogerá el ROWID se declarará "nombrevariable ROWID;"
Add Comment
Please, Sign In to add comment