Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- PAGINA 289
- -- Los cursores con FOR UPDATE se recorren siempre con FETCH.
- CREATE OR REPLACE PROCEDURE subir_salario_dpto
- vp_num_dpto NUMBER;
- vp_por_subida NUMBER;
- AS
- CURSOR c_emple IS SELECT oficio, salario
- FROM emple WHERE dept_no = vp_num_dpto
- FOR UPDATE; -- añadir FOR UPDATE es lo que indica que es un cursor que facilita las actualizaciones.
- -- 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.
- vc_reg_emple c_emple%ROWTYPE;
- v_inc NUMBER (9,2);
- BEGIN
- OPEN c_emple;
- FETCH c_emple INTO vc_reg_emple;
- WHILE c_emple%FOUND LOOP
- v_inc := (vc_reg_emple.salario / 100) * vp_por_subida;
- UPDATE emple SET salario = salario + v_inc
- WHERE CURRENT OF c_emple; -- indica que se actualice la última fila recuperada con FETCH.
- FETCH c_emple INTO vc_reg_emple;
- END LOOP;
- END subir_salario_dpto;
- /
- EXECUTE subir_salario_dpto (10,10);
- --PROBLEMAS POSIBLES con el bloqueo y el desbloqueo de filas.
- -- 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.
- -- 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.
- CREATE OR REPLACE PROCEDURE subir_salario_dpto_b
- (vp_num_dpto NUMBER,
- vp_pct_subida NUMBER)
- AS
- CURSOR c_emple IS SELECT oficio, salario, ROWID
- FROM emple WHERE dept_no = vp_num_dpto;
- vc_reg_emple c_emple%ROWTYPE;
- v_inc NUMBER(8,2);
- BEGIN
- OPEN c_emple;
- FETCH c_emple INTO vc_reg_emple;
- WHILE c_emple%FOUND LOOP
- v_inc := (vc_reg_emple.salario /100) * vp_pct_subida;
- UPDATE emple SET salario = salario + v_inc
- WHERE ROWID = vc_reg_emple.ROWID;
- FETCH c_emple INTO vc_reg_emple;
- END LOOP;
- END subir_salario_dpto_b;
- /
- --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