Oracle PL SQL Clase 3 Cursores

Embed Size (px)

DESCRIPTION

Teoría básica de cursores en oracle

Citation preview

PL/SQL

PL/SQLCursores1CursoresZona de memoria de tamao fijo, usado por Oracle para almacenar datos originados por una consulta.

Los cursores representan consultas SELECT de SQL que devuelven ms de un resultado y que permiten el acceso a cada fila de dicha consulta.

Lo cual significa que el cursor siempre tiene un puntero sealando a una de las filas del SELECT que representa el cursor.2Cursores - ProcesamientoLos cursores se procesan en tres pasos:Declarar el cursorAbrir el cursor. Tras abrir el cursor, el puntero del cursor sealar a la primera fila (si la hay)Procesar el cursor. La instruccin FETCH permite recorrer el cursor registro a registro hasta que el puntero llegue al final.Cerrar el cursor

3Declaracin de CursorEl cursor debe declararse en la seccin declarativa.Sintaxis:

CURSOR nombre IS sentenciaSELECT;

4Ejemplo:CURSOR cursorProvincias ISSELECT p.nombre, SUM(poblacion) AS poblacion FROM localidades lJOIN provincias p USING (n_provincia)GROUP BY p.nombre;5Apertura del cursorEsta sentencia abre el cursor, lo que significa:Reservar memoria suficiente para el cursor.Ejecutar la sentencia SELECT a la que se refiere el cursor.Colocar el puntero en la primera fila.

OPEN cursor;

6Tratamiento de filas - IInstruccin FETCHLa sentencia FETCH es la encargada de recorrer el cursor e ir procesando los valores del mismo:

FETCH cursor INTO listaDeVariables

7Tratamiento de filas - IIEsta instruccin almacena el contenido de la fila a la que apunta actualmente el puntero en la lista de variables indicada, que tiene tener el mismo tipo y nmero que las columnas representadas en el cursor. Tras esta instruccin el puntero de registros avanza a la siguiente posicin.Esta instruccin se coloca dentro de un bucle a fin de ir procesando cada fila del cursor. Ejemplo:FETCH cursorProvincias INTO v_nombre, v_poblacion;

8Tratamiento de filas - IIIUna instruccin FETCH lee una sola fila y su contenido lo almacena en variables. Por ello se usa siempre dentro de bucles:

LOOPFETCH cursorProvincias INTO (v_nombre, v_poblacion);... --instrucciones de proceso de los datos del cursorEND LOOP;9Cerrar cursorAl cerrar el cursor se libera la memoria que ocupa y se impide su procesamiento.

CLOSE cursor;

10Atributos de los CursoresPara poder procesar adecuadamente los cursores se pueden utilizar una serie de atributos que devuelven verdadero o falso segn la situacin actual del cursor.

Se utilizan indicando el nombre del cursor e inmediatamente el nombre del atributo (por ejemplo cursorProvincias%ISOPEN)

11Atributos%ISOPENDevuelve verdadero si el cursor ya est abierto.

%NOTFOUNDDevuelve verdadero si la ltima instruccin FETCH no devolvi ningn valor. 12Atributos%FOUNDInstruccin contraria a la anterior, devuelve verdadero si el ltimo FETCH devolvi una fila.

%ROWCOUNTIndica el nmero de filas que se han recorrido en el cursor (inicialmente vale cero). Es decir, indica cuntos FETCH se han aplicado sobre el cursor.

13DECLARE Cursor C1 isSelect CodProductoFrom ProductosBEGINOPEN C1;FETCH C1 INTO ln_cod;While C1%Found LoopFETCH C1 INTO ln_cod;End Loop;Close C1;END ;

14SET SERVEROUTPUT ON DECLARE CURSOR c1 IS SELECT * FROM scott.emp; c1_rec c1%ROWTYPE; BEGIN OPEN c1; LOOP FETCH c1 INTO c1_rec;

EXIT WHEN c1%NOTFOUND; DBMS_OUTPUT.PUT_LINE( 'employee name = ' || c1_rec.ename);

END LOOP; END; 15