Oracle

Cursores de actualización en PL/SQL

Por : Jhons_1101
2018-03-22
Tags :
Los cursores de actulización son muy importantes para realizar validaciones rápidas y toma de desiciones en una misma sentencia.

El fácil manejo del comando FOR UPDATE nos ayudará a entender el proceso.
Veamos con ejemplos de uso.

Para realizar una actualización con un cursor tenemos que añadir la siguiente FOR UPDATE al final de la declaración del curso


CURSOR nombre_del_cursor IS 
    instrucción_SELECT; 
FOR UPDATE;


Para actualizar los datos de un cursor hay que ejecutar la sentencia UPDATE en la cláusula WHERE. y añadiendo la sentencia CURRENT OF cursor_name.


UPDATE nombre_de_la_tabla 
SET campo_1 = valor_1 [,campo_2 = valor_2...]
WHERE CURRENT OF nombre_del_cursor


Cuando trabajamos con cursores de actualización debemos tener en cuenta que la sentencia UPDATE genera bloqueos en la base de datos ( transacciones, disparadores,etc).

las filas que devuelva el cursor van a ser los registros a ser actualizadas o borradas (dado el caso). Una vez declarado un cursor FOR UPDATE, se incluirá el especificador CURRENT OF nombre_cursor en la cláusula WHERE para actualizar o borrar la última fila recuperada mediante la orden FETCH.
compartir en facebook compartir en Google compartir en Twitter compartir en Blogger compartir como código embebido compartir la url

Ejemplos de uso



------------------------------------------------------------------------------------
-- Actualizar el nombre de los paises con tres puntos seguidos para ver el cambio.
------------------------------------------------------------------------------------
DECLARE
    CURSOR cur_paises IS
        SELECT COD_PAIS, NOM_PAIS, COD_CONTINENTE FROM PAIS
    FOR UPDATE;

    lnu_cod_pais       VARCHAR2(3);
    lvc_nom_pais       VARCHAR2(50);
    lnu_cod_continente VARCHAR2(25);
BEGIN
  OPEN cur_paises;
  FETCH cur_paises INTO lnu_cod_pais,lvc_nom_pais,lnu_cod_continente;
  WHILE cur_paises%FOUND
    LOOP
        UPDATE PAIS SET NOM_PAIS = lvc_nom_pais || '...'
        WHERE CURRENT OF cur_paises;

        FETCH cur_paises INTO lnu_cod_pais,lvc_nom_pais,lnu_cod_continente;
    END LOOP;
  CLOSE cur_paises;
  COMMIT;
END;

/*
    ----------------------------------- 
    -- SALIDA 
    ----------------------------------- 
        ver la imagen siguiente...
*/


Si miramos el código anterior, vemos que se hizo la consulta directa a la tabla de PAIS, en donde se reasignó el mismo nombre del archivo más tres puntos seguidos... si nos remitimos a la imagen vemos la salida. Una tabla con todos los registros actualizados por medio de un cursor.

for update ejemplo 1 en PL/SQL



Otro ejemplo... Esta vez aplicado en un procedure.



------------------------------------------------------------------------------------
--   Subir el salario a todos los empleados del departamento indicado 
--   en la llamada. El porcentaje se indicará también en la llamada.
------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE subir_salario (
    num_dept NUMBER, 
    incre    NUMBER
)
IS
    CURSOR c IS SELECT oficio, salario FROM empleados WHERE cod_dept = num_dept
    FOR UPDATE;

    reg c%ROWTYPE;
    inc NUMBER (8);
BEGIN
    OPEN c;
    FETCH c INTO reg;
    WHILE c%FOUND LOOP
        inc := (reg.salario/100 )* inc;
        UPDATE empleados SET salario = salario + inc WHERE CURRENT OF c
        FETCH c INTO reg;
    END LOOP;
    COMMIT;
END;





Ejemplo, usando el ROWID de Oracle


Utilizando la sentencia ROWID sería...

CREATE OR REPLACE PROCEDURE subir_salario (
    num_dept NUMBER, 
    incre    NUMBER
)
IS
    CURSOR c IS 
        SELECT oficio, salario, ROWID FROM empleados WHERE cod_dept = num_dept
    FOR UPDATE;

    reg c%ROWTYPE;
    inc NUMBER (8);
BEGIN
    OPEN c;
    FETCH c INTO reg;
    WHILE c%FOUND LOOP
        inc :=(reg.salario/100 )* inc;
        UPDATE empleados SET salario = salario + inc WHERE ROWID = reg.ROWID;        
        FETCH c INTO reg;
    END LOOP;
    COMMIT;
END;

/*
----------------------------------- 
-- SALIDA 
----------------------------------- 
    Actualizaría todos los registros que existan en la consulta. esta vez, lo hace por el ROWID 
    que es el identificador de un registro dentro de toda la base de datos..
*/







Si este contenido te fue útil, no olvides compartirlo en redes sociales, Considéralo. Puede ser la manera de agradecer!


Agrega tu comentario...

Puedes utilizar etiquetas <pre></pre>, <p></p>, <div></div>, + (Nombre usuario, para responderle a alguien)

akRcTHx





Este post no tiene comentarios, sé el primero en hacerlo
Esta entrada no cuenta con imágenes adjuntas

Unete al grupo de whatsApp +57 316 392 6456

Sigue el grupo en facebook

Siguenos.....