PLSQL Cursores

8
PL/SQL 3 38 CURSORES ¿Qué es un Cursor? Para procesar una instrucción SQL, Oracle asigna un área de memoria: Área de Área de Área de Área de Contexto Contexto Contexto Contexto, que contiene información necesaria para procesarla. En particular: o el nº de filas nº de filas nº de filas nº de filas procesadas por la instrucción o un puntero puntero puntero puntero a la versión analizada de la instrucción o el conjunto de filas resultado de la consulta: Conjunto Activo Conjunto Activo Conjunto Activo Conjunto Activo Un cursor cursor cursor cursor es un puntero al Área de Contexto Mediante un cursor, un programa PLSQL puede controlar el área de contexto. Los Cursores pueden ser: Explícitos o Implíci Explícitos o Implíci Explícitos o Implíci Explícitos o Implícitos tos tos tos. o Cursores Explícitos: Cursores Explícitos: Cursores Explícitos: Cursores Explícitos: Son aquellos que se asocian de manera explícita a una instrucción SELECT. La asociación se hace a través del nombre del cursor. o Cursores Implícitos: Cursores Implícitos: Cursores Implícitos: Cursores Implícitos: Son los que se utilizan para el resto de instrucciones SQL. CURSORES EXPLÍCITOS: Para procesar un cursor explícito es necesario realizar los cuatro pasos siguientes: Paso1: Declaración del Cursor Debe realizarse en la parte Declarativa Declarativa Declarativa Declarativa del bloque, define el nombre_del_cursor y lo asocia a una instrucción SELECT SELECT SELECT SELECT Su sintaxis es: CURSOR URSOR URSOR URSOR nombre_del_cursor IS IS IS IS Instrucción_SELECT SELECT SELECT SELECT; nombre_del_cursor es el nombre que identificara al cursor Instrucción_SELECT SELECT SELECT SELECT es la consulta que debe ser procesada Una declaración de cursor puede hacer referencia variables PL/SQL, se consideran variables de acoplamiento y deben ser declaradas previamente. En la declaración del cursor la instrucción SELECT SELECT SELECT SELECT no contiene la cláusula INTO INTO INTO INTO, ésta es parte de la instrucción FETCH FETCH FETCH FETCH.

description

PLSQL Cursores

Transcript of PLSQL Cursores

Page 1: PLSQL Cursores

PL/SQL 3

38

CCUURRSSOORREESS

¿¿¿¿¿¿¿¿QQQQQQQQuuuuuuuuéééééééé eeeeeeeessssssss uuuuuuuunnnnnnnn CCCCCCCCuuuuuuuurrrrrrrrssssssssoooooooorrrrrrrr???????? Para procesar una instrucción SQL, Oracle asigna un área de memoria: Área de Área de Área de Área de ContextoContextoContextoContexto, que contiene información necesaria para procesarla. En particular:

o el nº de filasnº de filasnº de filasnº de filas procesadas por la instrucción o un punteropunteropunteropuntero a la versión analizada de la instrucción o el conjunto de filas resultado de la consulta: Conjunto ActivoConjunto ActivoConjunto ActivoConjunto Activo

Un cursorcursorcursorcursor es un puntero al Área de Contexto Mediante un cursor, un programa PLSQL puede controlar el área de contexto. Los Cursores pueden ser: Explícitos o ImplíciExplícitos o ImplíciExplícitos o ImplíciExplícitos o Implícitostostostos.

o Cursores Explícitos:Cursores Explícitos:Cursores Explícitos:Cursores Explícitos: Son aquellos que se asocian de manera explícita a una instrucción SELECT. La asociación se hace a través del nombre del cursor.

o Cursores Implícitos:Cursores Implícitos:Cursores Implícitos:Cursores Implícitos: Son los que se utilizan para el resto de instrucciones SQL.

CCCCCCCCUUUUUUUURRRRRRRRSSSSSSSSOOOOOOOORRRRRRRREEEEEEEESSSSSSSS EEEEEEEEXXXXXXXXPPPPPPPPLLLLLLLLÍÍÍÍÍÍÍÍCCCCCCCCIIIIIIIITTTTTTTTOOOOOOOOSSSSSSSS:::::::: Para procesar un cursor explícito es necesario realizar los cuatro pasos siguientes: PPPPPPPPaaaaaaaassssssssoooooooo11111111:::::::: DDDDDDDDeeeeeeeeccccccccllllllllaaaaaaaarrrrrrrraaaaaaaacccccccciiiiiiiióóóóóóóónnnnnnnn ddddddddeeeeeeeellllllll CCCCCCCCuuuuuuuurrrrrrrrssssssssoooooooorrrrrrrr

Debe realizarse en la parte DeclarativaDeclarativaDeclarativaDeclarativa del bloque, define el nombre_del_cursor y lo asocia a una instrucción SELECTSELECTSELECTSELECT

Su ssssssssiiiiiiiinnnnnnnnttttttttaaaaaaaaxxxxxxxxiiiiiiiissssssss es:

CCCCURSORURSORURSORURSOR nombre_del_cursor ISISISIS Instrucción_SELECTSELECTSELECTSELECT;

���� nombre_del_cursor es el nombre que identificara al cursor ���� Instrucción_SELECTSELECTSELECTSELECT es la consulta que debe ser procesada ○ Una declaración de cursor puede hacer referencia variables PL/SQL, se

consideran variables de acoplamiento y deben ser declaradas previamente. ○ En la declaración del cursor la instrucción SELECTSELECTSELECTSELECT no contiene la cláusula

INTOINTOINTOINTO, ésta es parte de la instrucción FETCHFETCHFETCHFETCH.

Page 2: PLSQL Cursores

PL/SQL 3

39

○ En ocasiones es preferible utilizar una variable de tipo registro (del mismo tipo que la extracción del cursor) en lugar de una lista de variables. Para eso podemos utilizar %ROWTYPE%ROWTYPE%ROWTYPE%ROWTYPE de la siguiente manera:

DECLAREDECLAREDECLAREDECLARE CURSORCURSORCURSORCURSOR nombre_de_cursor ISISISIS instrucción_SELECTSELECTSELECTSELECT; -- Declaración de un registro para almacenar la información extraída. v_datos nombre_de_cursor %ROWTYPE%ROWTYPE%ROWTYPE%ROWTYPE;

Lógicamente en este caso la variable registro se declara después que el cursor. PPPPPPPPaaaaaaaassssssssoooooooo22222222:::::::: AAAAAAAAppppppppeeeeeeeerrrrrrrrttttttttuuuuuuuurrrrrrrraaaaaaaa ddddddddeeeeeeeellllllll CCCCCCCCuuuuuuuurrrrrrrrssssssssoooooooorrrrrrrr:::::::: La ssssssssiiiiiiiinnnnnnnnttttttttaaaaaaaaxxxxxxxxiiiiiiiissssssss de apertura es:

OPENOPENOPENOPEN nombre_del_cursor ;

Al abrir un cursor se realizan las siguientes acciones:

���� Se examinan los valores de las variables de acoplamiento ���� Se determina el conjunto activo, basándose en los valores de dichas variables y

el contenido de las tablas que forman parte de la consulta ���� Se apunta el puntero del conjunto activo a la primera fila

Las variables de acoplamiento se examinan únicamente en el momento de abrir el cursor. Lo mismo sucede con el conjunto activo Una vez abierto un cursor no podrá volver a abrirse hasta que no sea cerrado PPPPPPPPaaaaaaaassssssssoooooooo33333333:::::::: EEEEEEEExxxxxxxxttttttttrrrrrrrraaaaaaaacccccccccccccccciiiiiiiióóóóóóóónnnnnnnn ddddddddeeeeeeee ddddddddaaaaaaaattttttttoooooooossssssss ddddddddeeeeeeee uuuuuuuunnnnnnnn CCCCCCCCuuuuuuuurrrrrrrrssssssssoooooooorrrrrrrr Para ello se utiliza la siguiente ssssssssiiiiiiiinnnnnnnnttttttttaaaaaaaaxxxxxxxxiiiiiiiissssssss:

FETCHFETCHFETCHFETCH nombre_del_cursor INTOINTOINTOINTO lista_de_variables; O bien

FETCHFETCHFETCHFETCH nombre_del_cursor INTOINTOINTOINTO registro_PL/SQL;

○ El cursor de nombre nombre_del_cursor debe estar abierto y tanto la lista_de_variables como el registro_PL/SQL deben haberse declarado previamente.

○ Evidentemente la lista_de_variables y las variables del registro_PL/SQL deben ser compatibles en tipo con la lista de selección de la consulta.

○ Después de cada instrucción FETCHFETCHFETCHFETCH el puntero del conjunto activo se incrementa para que apunte a la siguiente fila.

PPPPPPPPaaaaaaaassssssssoooooooo44444444:::::::: CCCCCCCCiiiiiiiieeeeeeeerrrrrrrrrrrrrrrreeeeeeee ddddddddeeeeeeee uuuuuuuunnnnnnnn CCCCCCCCuuuuuuuurrrrrrrrssssssssoooooooorrrrrrrr La acción de cierre del cursor informa a PL/SQL de que el programa ha terminado de utilizar el cursor y de que se pueden liberar todos los recursos asociados al mismo. La ssssssssiiiiiiiinnnnnnnnttttttttaaaaaaaaxxxxxxxxiiiiiiiissssssss para el cierre del cursor es:

CLOSECLOSECLOSECLOSE nombre_del_cursor ;

Page 3: PLSQL Cursores

PL/SQL 3

40

AAAAAAAAttttttttrrrrrrrriiiiiiiibbbbbbbbuuuuuuuuttttttttoooooooossssssss ddddddddeeeeeeee lllllllloooooooossssssss CCCCCCCCuuuuuuuurrrrrrrrssssssssoooooooorrrrrrrreeeeeeeessssssss eeeeeeeennnnnnnn PPPPPPPPLLLLLLLL////////SSSSSSSSQQQQQQQQLLLLLLLL Existen cuatro atributos de cursor, que se añaden al nombre del mismo en un bloque PL/SQL. La ssssssssiiiiiiiinnnnnnnnttttttttaaaaaaaaxxxxxxxxiiiiiiiissssssss general de los atributos es:

nombre_del_cursor %ATR%ATR%ATR%ATRIBUTOIBUTOIBUTOIBUTO Estos devuelven un valor que puede ser utilizado en una expresión. LLLLLLLLoooooooossssssss aaaaaaaattttttttrrrrrrrriiiiiiiibbbbbbbbuuuuuuuuttttttttoooooooossssssss ssssssssoooooooonnnnnnnn:::::::: %FOUND :%FOUND :%FOUND :%FOUND : nombre_del_cursor % FOUND% FOUND% FOUND% FOUND Atributo booleano que devuelve:

o TRUETRUETRUETRUE si la última orden FETCHFETCHFETCHFETCH devolvió una fila. o FALSEFALSEFALSEFALSE en caso contrario. o NULLNULLNULLNULL si aún no se a efectuado ninguna extracción con FETCHFETCHFETCHFETCH. o ERRORERRORERRORERROR ORAORAORAORA----1001100110011001 (invalid_cursor )si el cursor no está abierto

%NOTFOUND :%NOTFOUND :%NOTFOUND :%NOTFOUND : nombre_del_cursor %NOTFOUND%NOTFOUND%NOTFOUND%NOTFOUND Atributo booleano opuesto a %FOUND%FOUND%FOUND%FOUND (en los valores lógicos).

Suele usarse como condición de salida en un Suele usarse como condición de salida en un Suele usarse como condición de salida en un Suele usarse como condición de salida en un bucle.bucle.bucle.bucle. Devuelve:

o FALSEFALSEFALSEFALSE si la última orden FETCHFETCHFETCHFETCH devolvió una fila. o TRUETRUETRUETRUE en caso contrario. o NULLNULLNULLNULL si aún no se a efectuado ninguna extracción con FETCHFETCHFETCHFETCH. o ERROR ORAERROR ORAERROR ORAERROR ORA----1001100110011001 (invalid_cursor )si el cursor no está abierto

%ISOPEN:%ISOPEN:%ISOPEN:%ISOPEN: nombre_del_cursor %%%% HISOPEENHISOPEENHISOPEENHISOPEEN Atributo booleano que devuelve:

o TRUETRUETRUETRUE si el cursor está abierto. o FALSEFALSEFALSEFALSE en caso contrario

Nunca genera un errorNunca genera un errorNunca genera un errorNunca genera un error

%ROWCOUNT:%ROWCOUNT:%ROWCOUNT:%ROWCOUNT: nombre_del_cursor%ROWCOUNT%ROWCOUNT%ROWCOUNT%ROWCOUNT Atributo numérico que devuelve

o El número de filas extraídas con FETCHFETCHFETCHFETCH hasta el momento. o ERROR ORAERROR ORAERROR ORAERROR ORA----1010101001010101 (invalid_cursor )si el cursor no está abierto

Page 4: PLSQL Cursores

PL/SQL 3

41

CCCCCCCCuuuuuuuurrrrrrrrssssssssoooooooorrrrrrrreeeeeeeessssssss PPPPPPPPaaaaaaaarrrrrrrraaaaaaaammmmmmmmeeeeeeeettttttttrrrrrrrriiiiiiiizzzzzzzzaaaaaaaaddddddddoooooooossssssss:::::::: En vez de usar variables de acoplamiento dentro del cursor (en su definición), pueden usarse parámetros (formales) que se ponen entre paréntesis tras el nombre del cursor cuando se declara. Al abrir el cursor deben darse los parámetros actuales.

CURSORCURSORCURSORCURSOR nombre_del_cursor (pf1,…,pfn) IS IS IS IS Instrucción_SELECTSELECTSELECTSELECT; …………

OPENOPENOPENOPEN nombre_del_cursor (pa1,…,pan)

���� pf1,…,pfn Son los parámetros formales ���� pa1,…,pan Son los parámetros actuales

CCCCCCCCuuuuuuuurrrrrrrrssssssssoooooooorrrrrrrreeeeeeeessssssss IIIIIIIImmmmmmmmppppppppllllllllíííííííícccccccciiiiiiiittttttttoooooooossssssss oooooooo CCCCCCCCuuuuuuuurrrrrrrrssssssssoooooooorrrrrrrreeeeeeeessssssss SSSSSSSSQQQQQQQQLLLLLLLL

o Los cursores implícitos sirven para procesar las instrucciones INSERTINSERTINSERTINSERT, , , , UPDATEUPDATEUPDATEUPDATE, , , , DELETEDELETEDELETEDELETE y la orden SELECT..INTOSELECT..INTOSELECT..INTOSELECT..INTO (de una única fila).

o Son los cursores propios de SQLSQLSQLSQL, y es el motor PL/SQLPL/SQLPL/SQLPL/SQL quien los abre y cierra.

o Las instrucciones: OPEN, FETCH y CLOSEOPEN, FETCH y CLOSEOPEN, FETCH y CLOSEOPEN, FETCH y CLOSE no son relevantes en este tipo de

cursores.

o Sin embargo todos los atributos propios de cursores se utilizan de la misma

manera que se ha visto antes utilizando en lugar de nombre_del_cursor la palabra reservada SQLSQLSQLSQL(p.e. SQL%%%%FOUNDFOUNDFOUNDFOUND)

o Solamente %ISOPEN%ISOPEN%ISOPEN%ISOPEN actúa de manera diferente ya que PL/SQL cierra

automáticamente los cursores implícitos, y por lo tanto SQL%ISOPENSQL%ISOPENSQL%ISOPENSQL%ISOPEN siempre será FALSEFALSEFALSEFALSE

.

Page 5: PLSQL Cursores

PL/SQL 3

42

BBBBBBBBUUUUUUUUCCCCCCCCLLLLLLLLEEEEEEEE SSSSSSSSIIIIIIIIMMMMMMMMPPPPPPPPLLLLLLLLEEEEEEEE YYYYYYYY CCCCCCCCUUUUUUUURRRRRRRRSSSSSSSSOOOOOOOORRRRRRRREEEEEEEESSSSSSSS LLLLLLLLOOOOOOOOOOOOOOOOPPPPPPPP……………………EEEEEEEENNNNNNNNDDDDDDDD LLLLLLLLOOOOOOOOOOOOOOOOPPPPPPPP

DECLAREDECLAREDECLAREDECLARE -- Declaración de variables para almacenar información acerca -- extraída del cursor -- Cursor para recuperar la información CURSORCURSORCURSORCURSOR nombre_de_cursor ISISISIS instrucción_SELECTSELECTSELECTSELECT ; BEGINBEGINBEGINBEGIN -- Abrir el cursor e inicializar el conjunto activo OPENOPENOPENOPEN nombre_de_cursor; LOOPLOOPLOOPLOOP -- Recuperación de la información FETCHFETCHFETCHFETCH nombre_de_cursor INTOINTOINTOINTO variables; -- Salida del bucle cuando no hay más filas que recuperar EXIT WHENEXIT WHENEXIT WHENEXIT WHEN nombre_de_cursor %NOTFOUND; -- Procesa las filas recuperadas. END LOOP END LOOP END LOOP END LOOP; -- Liberar los recursos utilizados por el cursor CLOSECLOSECLOSECLOSE nombre_de_cursor; END;END;END;END; ////

La orden EXIT WHENEXIT WHENEXIT WHENEXIT WHEN debe situarse después del FETCHFETCHFETCHFETCH y antes de procesar los datos de cada fila, para evitar procesar dos veces la última fila del cursor. BBBBBBBBUUUUUUUUCCCCCCCCLLLLLLLLEEEEEEEE WWWWWWWWHHHHHHHHIIIIIIIILLLLLLLLEEEEEEEE YYYYYYYY CCCCCCCCUUUUUUUURRRRRRRRSSSSSSSSOOOOOOOORRRRRRRREEEEEEEESSSSSSSS

DECLAREDECLAREDECLAREDECLARE -- Declaración de variables para almacenar información extraída del cursor -- Cursor para recuperar la información CURSORCURSORCURSORCURSOR nombre_de_cursor ISISISIS instrucción_SELECTSELECTSELECTSELECT ; BEGINBEGINBEGINBEGIN -- Abrir el cursor e inicializar el conjunto activo OPENOPENOPENOPEN nombre_de_cursor; -- Recuperar la primera fila para configurar el bucle WHILEWHILEWHILEWHILE FETCHFETCHFETCHFETCH nombre_de_cursor INTOINTOINTOINTO variables; -- El bucle continúa mientras haya más filas que extraer WHILEWHILEWHILEWHILE nombre_de_cursor %FOUND%FOUND%FOUND%FOUND LOOPLOOPLOOPLOOP -- Procesar las filas recuperadas.

-- Recuperar la fila siguiente. -- La condición %FOUND se comprobará antes de que el bucle

continúe. FETCHFETCHFETCHFETCH nombre_de_cursor INTOINTOINTOINTO variables; END LOOP;END LOOP;END LOOP;END LOOP; -- Liberar los recursos utilizados por el cursor CLOSECLOSECLOSECLOSE nombre_de_cursor; END;END;END;END; ////

Page 6: PLSQL Cursores

PL/SQL 3

43

BBBBBBBBUUUUUUUUCCCCCCCCLLLLLLLLEEEEEEEE FFFFFFFFOOOOOOOORRRRRRRR YYYYYYYY CCCCCCCCUUUUUUUURRRRRRRRSSSSSSSSOOOOOOOORRRRRRRREEEEEEEESSSSSSSS Este tipo de bucle nononono requiere ni abrirabrirabrirabrir, ni cerrarcerrarcerrarcerrar el cursor, ni usar la orden FETCHFETCHFETCHFETCH para recuperar las filas una a una, ni declarar la variable en la que se recuperan los datos (de tipo nombre_de_cursor %ROWTYPE%ROWTYPE%ROWTYPE%ROWTYPE).

DECLAREDECLAREDECLAREDECLARE

CURSORCURSORCURSORCURSOR nombre_de_cursor ISISISIS instrucción_SELECTSELECTSELECTSELECT ; BEGINBEGINBEGINBEGIN -- Inicio del bucle. Se ejecuta una instrucción OPEN implícita del cursor FORFORFORFOR variable ININININ nombre_de_cursor LOOPLOOPLOOPLOOP

-- variable es cualquier variable registro del mismo tipo que el cursor -- no es necesario declararla previamente

-- Ejecución de una instrucción FETCHFETCHFETCHFETCH implícita. -- nombre_de_cursor %NOTFOUND%NOTFOUND%NOTFOUND%NOTFOUND también se comprueba implícitamente, para -- ver si se han realizado las extracciones. -- Procesa las filas recuperadas END LOOP;END LOOP;END LOOP;END LOOP; -- Ahora que el bucle ha terminado, se hace un cierre implícito del mismo END;END;END;END; ////

Aún se puede simplificar más el bucle FORFORFORFOR sin necesidad de declarar explícitamente el cursor

BEGINBEGINBEGINBEGIN -- Inicio del bucle. Se ejecuta una instrucción OPEN implícita. FORFORFORFOR variable ININININ nombre_de_cursor (instrucción_SESESESELECTLECTLECTLECT ) LOOPLOOPLOOPLOOP -- Se ejecuta una instrucción FETCH implícita y se comprueba %NOTFOUND -- Procesa las filas recuperadas END LOOP;END LOOP;END LOOP;END LOOP; -- Ahora que el bucle ha terminado, se hace un cierre implícito. END;END;END;END; ////

Page 7: PLSQL Cursores

PL/SQL 3

44

SSSSSSSSEEEEEEEELLLLLLLLEEEEEEEECCCCCCCCTTTTTTTT FFFFFFFFOOOOOOOORRRRRRRR UUUUUUUUPPPPPPPPDDDDDDDDAAAAAAAATTTTTTTTEEEEEEEE Los cursores explícitos evalúan la consulta cuando se abre el cursor, pero no bloquean el acceso a las tablas involucradas. – Otro usuario podrá modificarlas mientras se procesa el cursor. – Puede que interese Bloquear el acceso a esas tablas si van a modificarse, de forma que no puedan ser modificadas por nadie hasta que termine la transacción SSSSSSSSiiiiiiiinnnnnnnnttttttttaaaaaaaaxxxxxxxxiiiiiiiissssssss:::::::: En la declaración del cursor se añade la cláusula FOR UPDATEFOR UPDATEFOR UPDATEFOR UPDATE tras la consulta CURSORCURSORCURSORCURSOR nombre_de_cursor ISISISIS instrucción_SELECTSELECTSELECTSELECT FOR UPDATEFOR UPDATEFOR UPDATEFOR UPDATE [OFOFOFOF columna/s] [NOWAITNOWAITNOWAITNOWAIT];

○ OF OF OF OF colucolucolucolumna/smna/smna/smna/s Es una columna o una lista de columnas de las tablas de la consulta que se modificarán. Su especificación es opcional.

○ NOWAITNOWAITNOWAITNOWAIT: Si otra sesión ha bloqueado lo que el cursor quiere bloquear, el cursor esperará indefinidamente hasta que sea liberado. Esta cláusula indica que el cursor no debe esperar, produciendo un error (ORA-54).

Ejemplo.:Ejemplo.:Ejemplo.:Ejemplo.: CURSORCURSORCURSORCURSOR C_studentsS IS – Estudiantes cuyo nombre empiece por S

SELECTSELECTSELECTSELECT * FROMFROMFROMFROM students WHEREWHEREWHEREWHERE first_name LIKELIKELIKELIKE 'S%' FOR UPDATEFOR UPDATEFOR UPDATEFOR UPDATE;

o Al usar la orden UPDATE/DELETEUPDATE/DELETEUPDATE/DELETEUPDATE/DELETE es necesario especificar las tuplas a Actualizar/Borrar con la cláusula WHEREWHEREWHEREWHERE.

o Cuando se usa un cursor SELECT FOR UPDATESELECT FOR UPDATESELECT FOR UPDATESELECT FOR UPDATE y extraemos sus filas una a

una es fácil escribir esa cláusula WHEREWHEREWHEREWHERE, porque hay una forma de referirse a la última fila recuperada del cursor.

SSSSSSSSiiiiiiiinnnnnnnnttttttttaaaaaaaaxxxxxxxxiiiiiiiissssssss:::::::: Se sustituye la cláusula WHEREWHEREWHEREWHERE de una orden UPDATE/DELETEUPDATE/DELETEUPDATE/DELETEUPDATE/DELETE por: ... WHERE WHERE WHERE WHERE CURRENT OFCURRENT OFCURRENT OFCURRENT OF nombre_de_cursor UPDATEUPDATEUPDATEUPDATE sólo debe modificar las columnas que se especificaron en el cursor SELECT SELECT SELECT SELECT FOR UPDATEFOR UPDATEFOR UPDATEFOR UPDATE. Si no se especificaron columnas, se puede modificar cualquier columna. Ejemplo:Ejemplo:Ejemplo:Ejemplo: OPENOPENOPENOPEN C_studentsS;

LOOPLOOPLOOPLOOP FETCHFETCHFETCHFETCH C_studentsS INTO estudiante;

-- estudiante es una variable registro compatible con la fila EXITEXITEXITEXIT WHENWHENWHENWHEN C_studentsS%NOTFOUNDNOTFOUNDNOTFOUNDNOTFOUND;

-- Procesamiento de la fila almacenada en estudiante IFIFIFIF estudiante.current_credits < 10 THENTHENTHENTHEN

UPDATEUPDATEUPDATEUPDATE students SETSETSETSET current_credits = current_credits + 10 WHERE CURRENT OFWHERE CURRENT OFWHERE CURRENT OFWHERE CURRENT OF C_studentsS;

ELSE DELETEELSE DELETEELSE DELETEELSE DELETE students WHERE CURRENT OFWHERE CURRENT OFWHERE CURRENT OFWHERE CURRENT OF C_studentsS;

Page 8: PLSQL Cursores

PL/SQL 3

45

END IF;END IF;END IF;END IF; END LOOP;END LOOP;END LOOP;END LOOP;

CLOSE CLOSE CLOSE CLOSE C_studentsS;