PL / SQL – Cursores

En este capítulo, discutiremos los cursores en PL / SQL. Oracle crea un área de memoria, conocida como área de contexto, para procesar una declaración SQL, que contiene toda la información necesaria para procesar la declaración; por ejemplo, el número de líneas procesadas, etc.

Y cursor es un indicador de esta área de contexto. PL / SQL gestiona el área de contexto con un cursor. El cursor contiene las filas (una o más) devueltas por la instrucción SQL. El conjunto de líneas sostenidas por el cursor se llama reclutamiento activo

Puede nombrar el cursor para que se pueda hacer referencia a él en su programa para obtener y procesar las filas devueltas por la instrucción SQL, una a la vez. Hay dos tipos de cursores:

  • Cursores implícitos
  • Cursores explícitos

Cursores implícitos

Oracle crea automáticamente cursores implícitos cada vez que se ejecuta una instrucción SQL cuando no hay un cursor explícito para la instrucción. Los programadores no pueden manipular los cursores implícitos y la información que contienen.

Cada vez que se ejecuta una instrucción DML (INSERT, UPDATE y DELETE), se asocia un cursor implícito con esa instrucción. Para las operaciones INSERT, el cursor contiene los datos que se van a insertar. Para las operaciones UPDATE y DELETE, el cursor indica las filas que se verán afectadas.

En PL / SQL, puede hacer referencia al cursor implícito más reciente como Cursor SQLque siempre tiene atributos como % ENCONTRADO,% AISLADO,% NO ENCONTRADO, y % NÚMERO DE FILAS… El cursor SQL tiene atributos adicionales, % BULK_ROWCOUNT y % BULK_EXCEPTIONS, destinado a su uso con PARA TODOS declaración. La siguiente tabla proporciona una descripción de los atributos más utilizados:

S. No Atributo y descripción
uno

%ENCONTRÓ

Devuelve VERDADERO si la instrucción INSERT, UPDATE o DELETE tocó una o más filas, o si la instrucción SELECT INTO devolvió una o más filas. De lo contrario, se devuelve FALSE.

2

%EXTRAVIADO

Lo contrario lógico de% FOUND. Devuelve TRUE si la instrucción INSERT, UPDATE o DELETE no afectó a ninguna fila, o si la instrucción SELECT INTO no devolvió ninguna fila. De lo contrario, se devuelve FALSE.

3

% ABIERTO

Siempre devuelve FALSE para cursores implícitos porque Oracle cierra automáticamente el cursor SQL después de ejecutar la instrucción SQL asociada.

cuatro

% NÚMERO DE FILAS

Devuelve el número de filas afectadas por una instrucción INSERT, UPDATE o DELETE, o devuelto por una instrucción SELECT INTO.

Cualquier atributo de cursor SQL estará disponible como sql% nombre_atributo como se muestra en el siguiente ejemplo.

Ejemplo

Usaremos la tabla CLIENTES que creamos y usamos en capítulos anteriores.

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

El siguiente programa actualizará la tabla y aumentará el salario de cada cliente en 500 y utilizará SQL% ROWCOUNT un atributo para determinar el número de filas afectadas –

DECLARE  
   total_rows number(2); 
BEGIN 
   UPDATE customers 
   SET salary = salary + 500; 
   IF sql%notfound THEN 
      dbms_output.put_line('no customers selected'); 
   ELSIF sql%found THEN 
      total_rows := sql%rowcount;
      dbms_output.put_line( total_rows || ' customers selected '); 
   END IF;  
END; 
/      

Cuando el código anterior se ejecuta en la línea de comando SQL, da el siguiente resultado:

6 customers selected  

PL/SQL procedure successfully completed. 

Si comprueba los registros en la tabla de clientes, encontrará que las filas se han actualizado:

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2500.00 | 
|  2 | Khilan   |  25 | Delhi     |  2000.00 | 
|  3 | kaushik  |  23 | Kota      |  2500.00 | 
|  4 | Chaitali |  25 | Mumbai    |  7000.00 | 
|  5 | Hardik   |  27 | Bhopal    |  9000.00 | 
|  6 | Komal    |  22 | MP        |  5000.00 | 
+----+----------+-----+-----------+----------+

Cursores explícitos

Los cursores explícitos son cursores definidos por los programadores para obtener más control sobre área de contexto… Se debe definir un cursor explícito en la sección de declaración del bloque PL / SQL. Se crea en una instrucción SELECT que devuelve más de una fila.

La sintaxis para crear un cursor explícito es:

CURSOR cursor_name IS select_statement; 

Trabajar con un cursor explícito implica los siguientes pasos:

  • Declarar un cursor para inicializar la memoria
  • Abriendo el cursor para asignar memoria
  • Obtener el cursor para obtener datos
  • Cerrar el cursor para liberar la memoria asignada

Declaración de cursor

Una declaración de cursor define un cursor con un nombre y una declaración SELECT asociada. Por ejemplo –

CURSOR c_customers IS 
   SELECT id, name, address FROM customers; 

Abriendo el cursor

Abrir un cursor asigna memoria para el cursor y lo prepara para buscar las filas devueltas por la instrucción SQL. Por ejemplo, abriremos el cursor de arriba así:

OPEN c_customers; 

Conseguir el cursor

Recuperar el cursor accede una línea a la vez. Por ejemplo, buscaremos líneas del cursor abierto de arriba de la siguiente manera:

FETCH c_customers INTO c_id, c_name, c_addr; 

Cerrar el cursor

Cerrar el cursor significa liberar la memoria asignada. Por ejemplo, cerraremos el cursor abierto arriba de la siguiente manera:

CLOSE c_customers;

Ejemplo

A continuación se muestra un ejemplo completo para ilustrar el concepto de & minua;

DECLARE 
   c_id customers.id%type; 
   c_name customer.name%type; 
   c_addr customers.address%type; 
   CURSOR c_customers is 
      SELECT id, name, address FROM customers; 
BEGIN 
   OPEN c_customers; 
   LOOP 
   FETCH c_customers into c_id, c_name, c_addr; 
      EXIT WHEN c_customers%notfound; 
      dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr); 
   END LOOP; 
   CLOSE c_customers; 
END; 
/

Cuando el código anterior se ejecuta en la línea de comando SQL, da el siguiente resultado:

1 Ramesh Ahmedabad  
2 Khilan Delhi  
3 kaushik Kota     
4 Chaitali Mumbai  
5 Hardik Bhopal   
6 Komal MP  
  
PL/SQL procedure successfully completed. 

🚫