sql >> Base de Datos >  >> RDS >> Oracle

Cómo utilizar la cláusula de recopilación masiva con la declaración SELECT INTO en la base de datos Oracle

Cláusula de recopilación masiva con declaración SELECT INTO

Bienvenido al segundo tutorial de la serie PL/SQL Bulk Collect, donde aprenderemos a usar la cláusula BULK COLLECT con la declaración SELECT-INTO.

Los cambios de contexto son buenos, pero solo cuando son bajos en número. Un mayor número de cambios de contexto podría causar problemas, como un rendimiento deficiente de las consultas. Esta sobrecarga causada por los cambios de contexto podría controlarse fácilmente si podemos comprimirlos. Esto es exactamente lo que aprenderá en este tutorial.

Puede obtener más información sobre SELECT-INTO aquí .

¿Cuándo debemos usar Bulk Collect con declaración Select-Into?

Cuando esté seguro de que el resultado de retorno de su sentencia SELECT es pequeño entonces debe usar la cláusula Bulk Collect con la declaración Select-Into. De lo contrario, su cláusula de recolección masiva hará que su declaración Select-Into sea un monstruo que acapara la memoria. En consecuencia, ralentizará el rendimiento de su base de datos.

¿Qué debo hacer si mi declaración SELECT está recuperando una gran cantidad de filas?

Siempre puede usar la cláusula LIMIT junto con Bulk Collect para limitar el número de filas obtenidas de la base de datos. Pero esto solo es posible cuando usamos la cláusula Bulk Collect con cursores PL/SQL. No obstante, discutiremos esto en detalle en el próximo tutorial.

¿Por qué no podemos limitar los datos obtenidos mediante Bulk Collect en la instrucción SELECT-INTO?

Cuando usamos la cláusula Bulk Collect con la declaración SELECT-INTO, usa implícito cursor para realizar la tarea de procesamiento masivo de datos. Sin embargo, la cláusula de límite solo se puede usar con la cláusula de recolección masiva, cuando esta última usa Cursor explícito para el procesamiento de datos.

¿Cuándo utiliza la cláusula de recopilación masiva un cursor implícito y cuándo un cursor explícito?

Si usamos la cláusula de recopilación masiva con una declaración SQL como SELECT-INTO, usa un cursor implícito. Por otro lado, cada vez que usamos la cláusula Bulk Collect con la declaración FETCH, usa un cursor explícito.

Le sugiero que lea cómo crear un cursor explícito para obtener más información sobre la instrucción FETCH.

¿Podemos almacenar el resultado devuelto por la cláusula de recopilación masiva en una variable de tipo de datos primitivo?

No, a partir de ahora, las colecciones PL/SQL son los únicos tipos de datos compatibles con el procesamiento masivo de datos con la cláusula de recopilación masiva en Oracle Database. En caso de que intente almacenar los datos recuperados mediante la cláusula Bulk Collect en una variable de tipo de datos como Char, Number o Varchar2, obtendrá un error que dirá algo como esto:

"PLS-00497:No se puede mezclar entre una sola fila y varias filas (BULK) en la lista INTO"

Definición de Recolección masiva en estado de cuenta
La declaración "Bulk Collect Into" selecciona varios datos de una columna y los almacena en una colección de SQL.

Sintaxis de la cláusula Bulk Collect con instrucción Select-Into.

La sintaxis para usar la cláusula de recopilación masiva de PL/SQL con la instrucción Select-Into en Oracle Database es la siguiente:

SELECT column_list
 BULK COLLECT INTO collection_datatype_name 
FROM table_name 
WHERE <where clause> 
ORDER BY <column list>;

donde:

Lista de columnas es la lista de columnas de las que desea recuperar los datos.

Nombre del tipo de datos de la colección será el nombre de la variable de colección que contendrá los datos devueltos por la cláusula de recopilación masiva.

Además, recuerde siempre que cada columna que especificó para recuperar los datos debe llevar un tipo de datos de colección correspondiente para almacenar esos datos. Porque el motor de tiempo de ejecución PL/SQL siempre almacena los datos recuperados de la columna en la colección de forma paralela.

Por ejemplo

SELECT column_1, column_2 BULK COLLECT INTO collection_1, collection2 FROM table;

Aquí, los datos recuperados de la columna_1 se almacenarán en la colección_1 y los datos de la columna_2 en la colección_2 automáticamente.

Nombre de la tabla podría ser el nombre de cualquier tabla de la que desee recuperar los datos.

Seguido de eso, tenemos las cláusulas WHERE y ORDER BY que son opcionales, pero si lo desea, puede usarlas.

Ahora que hemos discutido la sintaxis, hagamos un ejemplo simple para aprender cómo trabajar con la cláusula PL/SQL Bulk Collect con la instrucción SELECT INTO en Oracle Database.

SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_fName   IS TABLE OF VARCHAR2 (20);
    TYPE nt_lName   IS TABLE OF VARCHAR2 (20);
    
    fname   nt_fName;
    lName   nt_lName;
BEGIN
    SELECT first_name, last_name 
        BULK COLLECT INTO fName, lName 
    FROM employees; 
        
        --Print values from the collection--
    FOR idx IN 1..fName.COUNT
    LOOP
        DBMS_OUTPUT.PUT_LINE (idx||' - '||fName (idx) ||' '||lName (idx));
    END LOOP;
END;
/

Explicación del ejemplo

Aquí tenemos un código muy simple para demostrar cómo usar la cláusula de recopilación masiva con la declaración Select-Into. En la sección de declaración de este código, primero creamos dos colecciones de tipo de tabla anidada "nt_fName" y "nt_lName" con sus correspondientes variables de colección "fName" y "lName". De hecho, ambas colecciones se utilizarán para almacenar los datos devueltos por la instrucción Select-Into.

Puede leer cómo crear una tabla anidada aquí.

En la sección de declaración tenemos nuestra declaración Select-Into con la cláusula Bulk Collect. Además, al usar esta declaración Select-Into, estamos recuperando todos los datos de la columna Nombre y Apellido de la tabla de empleados. Y con la ayuda de la cláusula Bulk Collect, almacenamos esos datos en las colecciones correspondientes de manera paralela.

Excepto junto con la declaración Select-Into, también tenemos un "For Loop" que está imprimiendo los datos de ambas colecciones en la pantalla de salida.

Imprescindible
Asegúrese de ver el video en el que demostré cómo la cláusula de recopilación masiva comprime varios cambios de contexto en uno y mejora el rendimiento de la consulta. Aqui esta el link.

Ese es el tutorial que explica los conceptos de la cláusula Bulk Collect con la declaración Select-Into en detalle. En este tutorial, he intentado responder a todas las preguntas posibles que podría enfrentar en su examen de certificación, así como en la entrevista.

Espero que hayas disfrutado leyendo. Asegúrate de COMPARTIR este blog con tus amigos en tus redes sociales. ¡Gracias y que tengas un gran día!