Un cursor es un apuntador hacia un área privada en memoria que tiene información procedente de la ejecución de una sentencia SQL. Los cursores funcionan para cualquier consulta ya sea que ésta devuelva 0, 1 o varias filas.
Existen dos tipos de cursores: implícitos y explícitos.
Cada vez que se hace una sentencia DML (SELECT, UPDATE, DELETE o INSERT) en una base de datos, se crea por defecto un cursor implícito que contiene las filas afectadas. Estos cursores no se pueden nombrar, y por lo tanto tampoco se pueden controlar ni referir desde ningún otro lugar del código.
Hay que tener en cuenta que los cursores implícitos se abren de manera automática y se cierran inmediatamente una vez se ejecuten.
Normalmente estos cursores se usan cuando en las consultas se va a retornar una sola fila.
Nota: Recordar que cuando se usa la sentencia SELECT en un bloque PL/SQL, ésta debe ir asociada con la cláusula INTO.
Los cursores explícitos son definidos por los programadores y se tienen que declarar en la sección DECLARE del bloque PL/SQL. Se crea un cursor explícito para una sentencia SELECT que devuelve cero, una o más filas.
Para crear esta clase de cursores se deben seguir estos pasos:
A continuación, se muestra la sintaxis.

Los cursores si o si, siempre deben ser cerrados, por lo tanto, una buena práctica es que antes que se abra un cursor, crear la siguiente línea de código:

Tanto el cursor explícito como el implícito tienen ciertos atributos a los cuales pueden acceder. Estos atributos brindan más información sobre las operaciones que tiene el cursor.
En la siguiente tabla se muestran los diferentes atributos que tienen los cursores con su respectiva descripción.

Ejemplo 1:
Vamos a realizar un ejemplo sencillo de un cursor implícito, en donde tenemos que tener en cuenta los siguientes registros de la tabla PAIS.
Escribamos el siguiente código para crear dicha tabla y los datos que va a tener.

Una vez que pongamos a ejecutar el script nos debe quedar la tabla PAIS con esta información.

Luego procedemos a escribir este código en PL/SQL.

Lo que hace este código es actualizar el número de habitantes siempre y cuando cumplan la condición, luego en el condicional usamos el atributo %FOUND para verificar si hubo filas afectadas por el UPDTATE, en caso de que se encontraran filas modificadas, se emplea el atributo %ROWCOUNT para obtener el número total de registros que fueron leídos, de lo contrario se imprimirá en pantalla un mensaje mostrando que ningún país fue actualizado.

Hay que tener en cuenta que para utilizar los atributos (%FOUND, %NOTFOUND, %ISOPEN o %ROWCOUNT) en un cursor implícito debemos poner el comando SQL antes del atributo que vayamos a usar.
Ahora miramos la tabla PAIS para verificar si se actualizó el número de habitantes de los 3 países que arrojó el resultado del código mostrado anteriormente. En nuestro caso son los países de Argentina, Francia y Japón.

Por último, en un script u hoja de trabajo escribimos la sentencia COMMIT y la ejecutamos, con esta sentencia confirmamos que los cambios que hemos hecho en nuestra base de datos se guarden de forma permanente.
![]()
![]()
Ejemplo 2:
Ahora vamos a crear un cursor de manera explícita, y para esto vamos a utilizar la tabla PAIS con los nuevos valores generados por el código que se implementó en el ejemplo 1.

Luego ejecutamos el siguiente código.

Lo que se imprime en pantalla es lo siguiente:

Podemos ver que el cursor se debe declarar en la sección de declaración, el cual apuntará hacia un espacio de memoria donde se tendrá los datos devueltos por la consulta SQL. En el BEGIN procedemos a abrir el cursor, luego creamos un bucle LOOP para que mediante la instrucción FETCH recuperemos fila por fila los datos devueltos por la consulta y almacenarlos en las variables nombrePais, capitalPais y habitantesPais, ya después de guardar los valores en estas variables las imprimimos. En caso de no haber implementado un bucle para recuperar los valores, FETCH simplemente hubiera obtenido la primera fila de resultados de la consulta.
Como hicimos un bucle de tipo LOOP, tenemos que colocar una condición de salida que para nuestro ejemplo usamos el atributo %NOTFOUND que nos permitirá salir de este ciclo cuando el cursor no recupere más datos, es decir, que ya los haya leído todos; por último, usamos %ROWCOUNT para devolver el número de filas que el cursor leyó o recuperó y se cierra el cursor para liberar espacio en memoria.
Ejemplo 3:
A continuación, veremos una segunda forma de hacer un cursor explícito, pero sin la necesidad de abrirlo, ni usar FETCH, ni cerrarlo explícitamente.
Para esto haremos lo mismo que se hizo en el ejemplo 2 (imprimir el nombre, capital y número de habitantes de cada país), por ende, seguiremos usando la tabla PAIS.

Ejecutamos el siguiente código:

Lo que imprime el código anterior es:

Notas:
Ejemplo 4:
Los cursores también pueden tener parámetros. Para visualizar esta clase de cursor vamos a crear una tabla llamada EMPLEADO que tendrá unos datos. Para esto se presentará un script con el código para la creación de esta tabla y los datos que tendrá.

Luego de ejecutar el script debemos observar esta tabla.

Después ejecutamos el siguiente código.

Y luego nos imprime lo siguiente en pantalla:
