cursores explícitos - andròmines - andreu serracanta. · • utilizar una variable de registro...

23
Copyright Oracle Corporation, 1998. All rights reserved. 8 8 Cursores Explícitos Cursores Explícitos

Upload: vobao

Post on 07-May-2018

219 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

Copyright Oracle Corporation, 1998. All rights reserved.

88

Cursores ExplícitosCursores Explícitos

Page 2: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-2 Copyright Oracle Corporation, 1998. All rights reserved.

ObjetivosObjetivos

Al final de esta lección, usted podrá:

• Distinguir entre un cursor explícito y otro implícito

• Utilizar una variable de registro PL/SQL

• Escribir un bucle de cursor FOR

Al final de esta lecciAl final de esta lecci óón, usted podrn, usted podr áá::

• Distinguir entre un cursor explícito y otro implícito

• Utilizar una variable de registro PL/SQL

• Escribir un bucle de cursor FOR

Page 3: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-3 Copyright Oracle Corporation, 1998. All rights reserved.

Acerca de los CursoresAcerca de los Cursores

Todas las sentencias SQL ejecutadas por el Servidor Oracle8 tienen un cursor individual asociado:

• Cursores implícitos: Declarados para todas las sentencias DML y PL/SQL SELECT.

• Cursores explícitos: Declarados y nombrados por el programador.

Todas las sentencias SQL ejecutadas por Todas las sentencias SQL ejecutadas por el Servidor Oracle8 tienen un cursor el Servidor Oracle8 tienen un cursor individual asociado:individual asociado:

• Cursores implícitos: Declarados para todas las sentencias DML y PL/SQL SELECT.

• Cursores explícitos: Declarados y nombrados por el programador.

Page 4: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-4 Copyright Oracle Corporation, 1998. All rights reserved.

Funciones de Cursores Explícitos

Funciones de Cursores Funciones de Cursores ExplExpl íícitoscitos

Juego de ResultadosJuego de Resultados

Fila ActualFila ActualCursor

7369 SMITH CLERK

7566 JONES MANAGER

7788 SCOTT ANALYST

7876 ADAMS CLERK

7902 FORD ANALYST

Page 5: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-5 Copyright Oracle Corporation, 1998. All rights reserved.

Control de Cursores ExplícitosControl de Cursores ExplControl de Cursores Expl íícitoscitos

DECLAREDECLAREDECLARE FETCHFETCHFETCHOPENOPENOPEN CLOSECLOSECLOSE

•• Crear un Crear un áárea SQL rea SQL especificaespecifica

•• Identificar Identificar el juego el juego activoactivo

•• Cargar la Cargar la fila actual fila actual en en variablesvariables

•• Buscar Buscar filas filas existentesexistentes

•• Volver a Volver a FETCH si FETCH si encontrencontr óófilasfilas

•• Liberar el Liberar el juego juego activoactivo

NoNo

SSíí¿VACÍO?

Page 6: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-6 Copyright Oracle Corporation, 1998. All rights reserved.

Control de Cursores ExplícitosControl de Cursores ExplControl de Cursores Expl íícitoscitosAbra el cursor.Abra el cursor.

PunteroPuntero

Recupere una fila del cursorRecupere una fila del cursor

ContinContin úúe hasta que quede vace hasta que quede vac ííoo

PunteroPuntero

PunteroPuntero

CursorCursor

CursorCursor

CursorCursor

Page 7: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-7 Copyright Oracle Corporation, 1998. All rights reserved.

Declaración del CursorDeclaraciDeclaraci óón del Cursorn del Cursor

Sintaxis

• No incluya la cláusula INTO en la declaración del cursor.

• Si es necesario procesar filas en una secuencia, utilice la cláusula ORDER BY en la consulta.

SintaxisSintaxis

• No incluya la cláusula INTO en la declaración del cursor.

• Si es necesario procesar filas en una secuencia, utilice la cláusula ORDER BY en la consulta.

CURSOR cursor_name IS

select_statement;

CURSOR cursor_name IS

select_statement;

Page 8: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-8 Copyright Oracle Corporation, 1998. All rights reserved.

Declaración del CursorDeclaraciDeclaraci óón del Cursorn del Cursor

EjemploEjemploEjemplo

DECLARECURSOR c1 IS SELECT empno, ename, job, salFROM empWHERE sal > 2000;

CURSOR c2 RETURN dept%ROWTYPE ISSELECT *FROM deptWHERE deptno = 10;

BEGIN...

DECLARECURSOR c1 IS SELECT empno, ename, job, salFROM empWHERE sal > 2000;

CURSOR c2 RETURN dept%ROWTYPE ISSELECT *FROM deptWHERE deptno = 10;

BEGIN...

Page 9: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-9 Copyright Oracle Corporation, 1998. All rights reserved.

Apertura del CursorApertura del CursorApertura del Cursor

Sintaxis

• Abra el cursor para ejecutar la consulta e identificar el juego activo.

• Si la consulta no devuelve ninguna fila, no se producirá ninguna excepción.

• Utilice los atributos del cursor para comprobar los resultados producidos tras una recuperación.

SintaxisSintaxis

• Abra el cursor para ejecutar la consulta e identificar el juego activo.

• Si la consulta no devuelve ninguna fila, no se producirá ninguna excepción.

• Utilice los atributos del cursor para comprobar los resultados producidos tras una recuperación.

OPEN cursor_name;OPEN cursor_name;

Page 10: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-10 Copyright Oracle Corporation, 1998. All rights reserved.

Recuperación de Datos del CursorRecuperaciRecuperaci óón de Datos del Cursorn de Datos del Cursor

Sintaxis

• Recupere los valores de la fila actual e introd úzcalos en variables de salida.

• Incluya el mismo n úmero de variables.

• Relacione posicionalmente las variables y las columnas.

• Compruebe si el cursor tiene filas.

SintaxisSintaxis

• Recupere los valores de la fila actual e introd úzcalos en variables de salida.

• Incluya el mismo n úmero de variables.

• Relacione posicionalmente las variables y las columnas.

• Compruebe si el cursor tiene filas.

FETCH cursor_name INTO [variable1, variable2, ...]

| record_name];

FETCH cursor_name INTO [variable1, variable2, ...]

| record_name];

Page 11: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-11 Copyright Oracle Corporation, 1998. All rights reserved.

Recuperación de Datos del CursorRecuperaciRecuperaci óón de Datos del Cursorn de Datos del Cursor

EjemplosEjemplosEjemplos

FETCH c1 INTO v_deptno, v_dname, v_location;FETCH c1 INTO v_deptno, v_dname, v_location;

...OPEN defined_cursor;LOOPFETCH defined_cursor INTO defined_recordEXIT WHEN ...;...-- Process the retrieved data

...END;

...OPEN defined_cursor;LOOPFETCH defined_cursor INTO defined_recordEXIT WHEN ...;...-- Process the retrieved data

...END;

Page 12: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-12 Copyright Oracle Corporation, 1998. All rights reserved.

Cierre del CursorCierre del CursorCierre del Cursor

Sintaxis

• Cierre el cursor una vez completado el procesamiento de las filas.

• Vuelva a abrir el cursor si es necesario.

• No intente recuperar los datos de un cursor una vez que ha sido cerrado.

SintaxisSintaxis

• Cierre el cursor una vez completado el procesamiento de las filas.

• Vuelva a abrir el cursor si es necesario.

• No intente recuperar los datos de un cursor una vez que ha sido cerrado.

CLOSE cursor_name; CLOSE cursor_name;

Page 13: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-13 Copyright Oracle Corporation, 1998. All rights reserved.

Atributos de Cursores ExplícitosAtributos de Cursores ExplAtributos de Cursores Expl íícitoscitos

Obtiene información de estado de un cursor.Obtiene informaciObtiene informaci óón de estado de un cursor.n de estado de un cursor.Atributo Tipo Descripción

%ISOPEN Booleano Resulta TRUE si el cursor está abierto.

%NOTFOUND Booleano Resulta TRUE si la recuperación más reciente no devuelve una fila.

%FOUND Booleano Resulta TRUE si la recuperaciónmás reciente devuelve una fila; complemento de %NOTFOUND

%ROWCOUNT Número Da el número total de filas devueltas hasta ese momento.

Page 14: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-14 Copyright Oracle Corporation, 1998. All rights reserved.

Control de Varias Recuperaciones

Control de Varias Recuperaciones

• Procese varias filas de un cursor explícito utilizando un bucle.

• Recupere una fila con cada iteración.

• Utilice el atributo %NOTFOUND para crear una prueba de una recuperación no satisfactoria.

• Utilice atributos de cursores explícitos para comprobar el éxito de cada recuperación.

• Procese varias filas de un cursor explícito utilizando un bucle.

• Recupere una fila con cada iteración.

• Utilice el atributo %NOTFOUND para crear una prueba de una recuperación no satisfactoria.

• Utilice atributos de cursores explícitos para comprobar el éxito de cada recuperación.

Page 15: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-15 Copyright Oracle Corporation, 1998. All rights reserved.

El Atributo %ISOPENEl Atributo %ISOPENEl Atributo %ISOPEN

• Recupere filas únicamente cuando el cursor está abierto.

• Utilice el atributo de cursor %ISOPEN antes de ejecutar una recuperación para comprobar si el cursor está abierto.

Ejemplo

• Recupere filas únicamente cuando el cursor está abierto.

• Utilice el atributo de cursor %ISOPEN antes de ejecutar una recuperación para comprobar si el cursor está abierto.

EjemploEjemplo

IF NOT ename_cursor%ISOPEN THENOPEN ename_cursor;

END IF;LOOPFETCH ename_cursor...

IF NOT ename_cursor%ISOPEN THENOPEN ename_cursor;

END IF;LOOPFETCH ename_cursor...

Page 16: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-16 Copyright Oracle Corporation, 1998. All rights reserved.

Los Atributos %NOTFOUND y %ROWCOUNT

Los Atributos %NOTFOUND y %ROWCOUNT

• Utilice el atributo de cursor %ROWCOUNT para recuperar un número exacto de filas.

• Utilice el atributo de cursor %NOTFOUND para determinar cu ándo salir del bucle.

• Utilice el atributo de cursor %ROWCOUNT para recuperar un número exacto de filas.

• Utilice el atributo de cursor %NOTFOUND para determinar cu ándo salir del bucle.

Page 17: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-17 Copyright Oracle Corporation, 1998. All rights reserved.

%NOTFOUND y %ROWCOUNT%NOTFOUND y %ROWCOUNT%NOTFOUND y %ROWCOUNT

Ejemplo Ejemplo Ejemplo

LOOPFETCH ename_cursor INTO v_ename, v_deptno;IF ename_cursor%ROWCOUNT > 20 THEN...

EXIT WHEN ename_cursor%NOTFOUND;...

END LOOP;

LOOPFETCH ename_cursor INTO v_ename, v_deptno;IF ename_cursor%ROWCOUNT > 20 THEN...

EXIT WHEN ename_cursor%NOTFOUND;...

END LOOP;

Page 18: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-18 Copyright Oracle Corporation, 1998. All rights reserved.

Cursores y Registros Cursores y Registros Cursores y Registros Procese las filas del juego activo de forma conveniente recuperando valores e introduciéndolos es un PL/SQL RECORD.

Ejemplo

Procese las filas del juego activo de forma Procese las filas del juego activo de forma conveniente recuperando valores e conveniente recuperando valores e introduciintroduci ééndolos es un PL/SQL RECORD.ndolos es un PL/SQL RECORD.

EjemploEjemplo

... CURSOR emp_cursor ISSELECT empno, sal, hiredate, rowidFROM empWHERE deptno = 20;

emp_record emp_cursor%ROWTYPE;BEGINOPEN emp_cursor;

. . .FETCH emp_cursor INTO emp_record;

... CURSOR emp_cursor ISSELECT empno, sal, hiredate, rowidFROM empWHERE deptno = 20;

emp_record emp_cursor%ROWTYPE;BEGINOPEN emp_cursor;

. . .FETCH emp_cursor INTO emp_record;

Page 19: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-19 Copyright Oracle Corporation, 1998. All rights reserved.

Sintaxis

• Facilite el procesamiento de cursores explícitos.

• Apertura, recuperación y cierre implícitos.

• No declare el registro, está declarado implícitamente.

SintaxisSintaxis

• Facilite el procesamiento de cursores explícitos.

• Apertura, recuperación y cierre implícitos.

• No declare el registro, está declarado implícitamente.

Bucles FOR de CursorBucles FOR de CursorBucles FOR de Cursor

FOR record_name IN cursor_name LOOP

statement1;

statement2;

. . .

END LOOP;

FOR record_name IN cursor_name LOOP

statement1;

statement2;

. . .

END LOOP;

Page 20: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-20 Copyright Oracle Corporation, 1998. All rights reserved.

Bucles FOR de CursorBucles FOR de CursorBucles FOR de Cursor

Recupere, de uno en uno, todos los artículos de línea de un pedido hasta que no queden m ás artículos de línea.

Ejemplo

Recupere, de uno en uno, todos los Recupere, de uno en uno, todos los artart íículos de lculos de l íínea de un pedido hasta que nea de un pedido hasta que no queden mno queden m áás arts art íículos de lculos de l íínea. nea.

EjemploEjemplo

FOR item_record IN item_cursor LOOP-- implicit open and implicit fetch occur

v_ordertotal := v_ordertotal + (item_record.price * item_record.quantity);

i := i + 1;prodid_table (i) := item_record.prodid;ordertotal_table (i) := v_ordertotal;

END LOOP; -- implicit close occurs

FOR item_record IN item_cursor LOOP-- implicit open and implicit fetch occur

v_ordertotal := v_ordertotal + (item_record.price * item_record.quantity);

i := i + 1;prodid_table (i) := item_record.prodid;ordertotal_table (i) := v_ordertotal;

END LOOP; -- implicit close occurs

Page 21: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-21 Copyright Oracle Corporation, 1998. All rights reserved.

ResumenResumen

• Tipos de cursor:

– Cursores implícitos: Utilizados para todas las sentencias DML y consultas de una sola fila.

– Cursores explícitos: Utilizados para consultas de cero, una o m ás filas.

• Manipule los cursores explícitos con los comandos:

– Declare, open, fetch, y close.

• Tipos de cursor:

– Cursores implícitos: Utilizados para todas las sentencias DML y consultas de una sola fila.

– Cursores explícitos: Utilizados para consultas de cero, una o m ás filas.

• Manipule los cursores explícitos con los comandos:

– Declare, open, fetch, y close.

Page 22: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-22 Copyright Oracle Corporation, 1998. All rights reserved.

ResumenResumen

• Examine el estado del cursor utilizando atributos de cursor.

• Utilice bucles FOR de cursor como un método abreviado para:

– abrir el cursor.

– recuperar filas de una en una para cada iteración del bucle.

– cerrar autom áticamente el cursor despu és de haber procesado todas las filas.

• Examine el estado del cursor utilizando atributos de cursor.

• Utilice bucles FOR de cursor como un método abreviado para:

– abrir el cursor.

– recuperar filas de una en una para cada iteración del bucle.

– cerrar autom áticamente el cursor despu és de haber procesado todas las filas.

Page 23: Cursores Explícitos - Andròmines - Andreu Serracanta. · • Utilizar una variable de registro PL/SQL • Escribir un bucle de cursor FOR Al final de esta lecciAl final de esta

8-23 Copyright Oracle Corporation, 1998. All rights reserved.

Visión General de la PrácticaVisión General de la Práctica

• Declaración y uso de cursores explícitos para consultar filas de una tabla

• Utilización de un bucle FOR de cursor

• Aplicación de atributos de cursor para comprobar el estado del cursor

• Declaración y uso de cursores explícitos para consultar filas de una tabla

• Utilización de un bucle FOR de cursor

• Aplicación de atributos de cursor para comprobar el estado del cursor