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:
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.
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 | +----+----------+-----+-----------+----------+
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:
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;
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;
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 significa liberar la memoria asignada. Por ejemplo, cerraremos el cursor abierto arriba de la siguiente manera:
CLOSE c_customers;
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.
🚫