Ya vimos en el tutorial anterior cómo crear una variable de tipo de registro basada en cursor basada en un cursor simple que devuelve una sola fila de datos. Ahora surge la pregunta aquí:¿podemos usar la misma variable de tipo de datos de registro único con el cursor que devuelve varias filas de datos? Para saber la respuesta, siga leyendo y aprenda a manejar múltiples valores devueltos por un cursor utilizando una variable de tipo de datos de registro basada en un solo cursor.
Como estamos tratando con registros basados en cursores, se requiere un poco de conocimiento del cursor. En aras de la simplicidad y para que este concepto sea fácil de entender, utilizaré un cursor explícito simple para la demostración.
Paso 1:declarar un cursor explícito simple
Un tipo de datos de registro basado en cursor requiere un cursor ya creado. Este cursor se convertirá en una base subyacente para nuestra variable de tipo de registro. Todos los campos de la variable de tipo de registro que se crea utilizando este cursor tendrán el mismo nombre y tipo de datos que el de las columnas utilizadas en la SELECT-List del cursor.
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200;
A diferencia del cursor del tutorial anterior que devuelve una sola fila de datos, este cursor devolverá varias filas. Todas estas filas consistirán en el nombre y el salario de todos los empleados con una identificación de empleado superior a 200.
Paso 2:Declarar la variable de tipo de datos de registro basado en cursor
Como hemos creado el cursor, ahora estamos listos para declarar nuestra variable de registro usando este cursor.
var_emp cur_RebellionRider%ROWTYPE;
Var_emp es la variable de tipo de registro y, como se basa en el cursor cur_RebellionRider, podemos llamarla con orgullo una variable de tipo de registro basada en cursor. Ahora tenemos que ver si esta variable de registro único es capaz de contener todos los datos devueltos por el cursor subyacente cur_RebellionRider.
Paso 3:inicialice la variable de registro de cursor
Como discutimos en el tutorial 34 de PL/SQL, la inicialización de una variable de registro es el proceso de asignarle algunos valores. En el caso de los Cursores, la declaración FETCH-INTO hace este trabajo. Pero tenemos que asegurarnos de que hemos seguido correctamente el ciclo de vida del cursor.
Si no sabe qué es este ciclo de vida del cursor y los pasos necesarios para crear un cursor, consulte este blog sobre "Introducción al cursor de la base de datos".
BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary ); END LOOP;--Simple Loop End CLOSE cur_RebellionRider; END;
La sección de ejecución anterior del bloque PL/SQL que estamos creando aquí se ha explicado línea por línea en el video tutorial en mi canal de YouTube. Compruébalo.
Así que eso es todo. Eso es todo lo que tenemos que hacer. Ahora combinemos todos estos fragmentos de código que vimos en los diferentes pasos anteriores en un único bloque PL/SQL anónimo.
Variable de tipo de datos de registro basada en cursor en Oracle Database
SET SERVEROUTPUT ON; DECLARE CURSOR cur_RebellionRider IS SELECT first_name, salary FROM employees WHERE employee_id > 200; var_emp cur_RebellionRider%ROWTYPE; BEGIN OPEN cur_RebellionRider; LOOP FETCH cur_RebellionRider INTO var_emp; EXIT WHEN cur_RebellionRider%NOTFOUND; DBMS_OUTPUT.PUT_LINE (var_emp.first_name||' '||var_emp.salary); END LOOP; CLOSE cur_RebellionRider; END;
Cuando compile y ejecute el código anterior, obtendrá todos los datos que la declaración FETCH-INTO obtuvo del cursor cur_RebellionRider y almacenó en la variable de registro basada en cursor var_emp. Esto implica que, de hecho, podemos manejar múltiples filas de datos utilizando un único registro basado en cursor.
En mi video tutorial de PL/SQL pregunté si podemos simplificar este código o si hay alguna otra forma de hacer la misma tarea. La respuesta es sí, hay varias formas de lograr el mismo resultado y una de ellas es usando "Cursor For-Loop". Este es un tipo especial de bucle que declara la variable de registro, así como abre, recupera y cierra el cursor subyacente implícitamente en segundo plano para usted. Puede leer más Cursor For-Loop aquí.
Libro de referencia para SQL Expert 1z0-047 Enlace de afiliado
Guía de examen de experto certificado en SQL de la base de datos Oracle de OCA (examen 1Z0-047)
Aquí está el código hecho usando Cursor For-Loop que es equivalente al código anterior. Como puede ver, es mucho menos complejo con pocas líneas de código (LOC).
SET SERVEROUTPUT ON; BEGIN FOR var_emp IN (SELECT first_name, salary FROM employees WHERE employee_id >200) LOOP DBMS_OUTPUT.PUT_LINE(var_emp.first_name||' '||var_emp.salary); END LOOP; END;
Ambos códigos devolverán el mismo resultado ya que ambos están haciendo la misma tarea.
Espero que hayas disfrutado este tutorial detallado de PL/SQL. Asegúrese de compartir esto en sus redes sociales y etiquéteme, ya que estoy regalando productos de RebellionRider todos los meses a un usuario seleccionado al azar. También sígueme en mis redes sociales [Twitter/Facebook/Instagram] para actualizaciones periódicas.
¡Gracias y que tengas un gran día!