2 Pl SQL Cursores Oracle 11g

March 17, 2018 | Author: Robert Puican Gutierrez | Category: Pl/Sql, Sql, Oracle Corporation, Software Engineering, Information Retrieval


Comments



Description

<Insert Picture Here> PL/SQL EN ORACLE PL / SQL CURSORES . • • • • • se debe usar un cursor para su procesamiento en PL/SQL. Abrir el cursor: Se ejecuta la consulta. Para declarar y usar un cursor se siguen estos pasos: 1. tomar las filas del cursor una a una Proceso iterativo 4. Cerrar el cursor: Liberar la memoria * Los cursores funcionan para cualquier consulta ya sea que esta devuelva 0. Recuperar. 1 o muchas filas . en ese momento se está “apuntando” a la primera de las filas seleccionadas por la consulta 3.CURSORES • Si una sentencia SELECT devuelve más de una fila*. Declarar el cursor: Se le asigna un nombre al cursor y se le asocia una consulta 2. varn.. OPEN nombre_cursor.Se declara IS consulta SQL. -.. .CURSOR Sintaxis: CURSOR nombre_cursor -. /*Se recupera la fila actual */ CLOSE nombre_cursor.Se abre FETCH nombre_cursor INTO var1.Se cierra .. -.var2. CURSOR Atributos (funciones) de los cursores: %NOTFOUND: Es verdadero (TRUE) cuando el último FETCH ejecutado no recupera datos %FOUND: Es verdadero cuando el último FETCH ejecutado recuperó datos (trajo una fila) %ROWCOUNT: Devuelve el número de filas leídas hasta el momento %ISOPEN: Es verdadero cuando el cursor está abierto . 'Lisa'. 'Adam'. INSERT INTO empleado VALUES(12.5.300).2. nombre VARCHAR2(15). INSERT INTO empleado VALUES(56. 'Ben'. INSERT INTO empleado VALUES(73. INSERT INTO empleado VALUES(15. CREATE TABLE empleado( codigo NUMBER(8) PRIMARY KEY.100). .2. 'Adrian'. sueldo NUMBER(8) NOT NULL ).EJEMPLO CURSOR DROP TABLE empleado. dep NUMBER(3). INSERT INTO empleado VALUES(76.3. 'Patty'.100).1.400).500). Ejemplo Cursor DECLARE CURSOR ordena_d IS SELECT codigo. dep FROM empleado ORDER BY dep. END LOOP. codi empleado.dep%TYPE. BEGIN OPEN ordena_d.codigo%TYPE. LOOP FETCH ordena_d INTO codi. END. dpto empleado. DBMS_OUTPUT. dpto. EXIT WHEN ordena_d%NOTFOUND. / .PUT_LINE('Total de Registros: ' || ordena_d%ROWCOUNT).PUT_LINE(codi || '--' || dpto). CLOSE ordena_d. DBMS_OUTPUT. PUT_LINE(mi_e. END LOOP. Estas acciones las puede hacer automáticamente un ciclo FOR así: DECLARE CURSOR ordena_d IS --Se declara el cursor SELECT codigo. ni hacerles FETCH.dep). END.CURSORES Los cursores también se pueden procesar sin necesidad de abrirlos. dep FROM empleado ORDER BY dep.codigo || ' ' || mi_e. BEGIN FOR mi_e IN ordena_d LOOP DBMS_OUTPUT.PUT_LINE('Total: ' || ordena_d%ROWCOUNT). ni cerrarlos explícitamente. ---DBMS_OUTPUT. / mi_e es una variable local del ciclo que automáticamente se declara del tipo del cursor . END LOOP.PUT_LINE(mi_e. END. / . dep FROM empleado ORDER BY dep) LOOP DBMS_OUTPUT.CURSOR SIN DECLARAR Se puede también evitar la declaración de un cursor así: BEGIN FOR mi_e IN (SELECT codigo.' || mi_e.codigo || ' .dep). PUT_LINE('Empleado: '|| mi_e.PUT_LINE('Dpto ' || k).nombre).5 LOOP DBMS_OUTPUT. END LOOP. DBMS_OUTPUT. END.CURSOR CON PARAMETRO SET SERVEROUTPUT ON DECLARE total NUMBER(5). BEGIN FOR k IN 1. grantotal NUMBER(6) := 0. DBMS_OUTPUT. CURSOR emp_cur(v_dept NUMBER) IS SELECT nombre FROM empleado WHERE dep = v_dept. grantotal := grantotal + total.PUT_LINE('Total empleados en la empresa: ' || grantotal). total := total + 1. total := 0.PUT_LINE('Total empleados en el dpto: ' || total). END LOOP.. FOR mi_e IN emp_cur(k) LOOP DBMS_OUTPUT. / . codigo || ' ' || mi_e.dep).ROWTYPE Se puede declarar una variable del tipo de una tabla (mediante ROWTYPE)y se puede usar así: DECLARE CURSOR emp_cur IS SELECT * FROM empleado. / . EXIT WHEN emp_cur%NOTFOUND. Todos los datos de un LOOP empleado quedan almacenados en mi_e FETCH emp_cur INTO mi_e. CLOSE emp_cur. END LOOP. END. BEGIN OPEN emp_cur.PUT_LINE(mi_e. DBMS_OUTPUT. mi_e empleado%ROWTYPE. END LOOP.PUT_LINE('Total: ' || suma ). EXIT WHEN ord_c%NOTFOUND OR ord_c%ROWCOUNT = 3. suma := suma + mi_e.También se pueden declarar variables del tipo de un cursor: DECLARE CURSOR ord_c IS SELECT sueldo FROM empleado ORDER BY sueldo DESC.sueldo. suma NUMBER(6) := 0. / ¿Qué hace este código? . LOOP FETCH ord_c INTO mi_e. BEGIN OPEN ord_c. END. CLOSE ord_c. DBMS_OUTPUT. mi_e ord_c%ROWTYPE. debe ser FOR UPDATE. UPDATE o el DELETE.Se borran los emps actuales del depto 2 WHERE CURRENT OF emp_c. * Si no hay FOR UPDATE. -. FOR UPDATE establece el bloqueo desde el OPEN.Se refiere a la fila actual del cursor ELSE UPDATE empleado SET dep = dep . Oracle bloquea las filas en el momento de hacer el END. / .1 Para usar CURRENT OF el cursor WHERE CURRENT OF emp_c. BEGIN FOR UPDATE bloquea las filas leídas por FOR mi_e IN emp_c el cursor antes* de hacer el UPDATE o LOOP el DELETE IF mi_e. END LOOP.FOR UPDATE y CURRENT OF Al abrir. el cursor toma una imagen de las filas y las bloquea DECLARE CURSOR emp_c IS SELECT dep FROM empleado FOR UPDATE.dep = 2 THEN DELETE FROM empleado -. END IF.
Copyright © 2024 DOKUMEN.SITE Inc.