sql >> Base de Datos >  >> RDS >> Database

Cómo utilizar la cláusula de recopilación masiva de PL/SQL con la instrucción FETCH INTO

Cláusula de recopilación masiva con instrucción FETCH INTO

En el tutorial anterior, logramos comprimir varios cambios de contexto en uno solo mediante el uso de PL/SQL Bulk Collect con la declaración SELECT-INTO. La declaración SELECT-INTO es una consulta estándar de SQL, lo que significa que el desarrollador no tiene mucho control sobre la ejecución de la declaración.

Si hablamos del rendimiento de las consultas, no podemos ir más allá de una extensión con la instrucción SELECT-INTO. Veamos cómo podemos superar todas estas deficiencias de la instrucción SELECT-INTO.

En este blog, aprenderá cómo usar la cláusula Bulk Collect con la declaración FETCH-INTO de un cursor explícito. Como las declaraciones FETCH son parte del ciclo de vida del cursor, se requiere un conocimiento práctico del cursor explícito para comprender mejor este tutorial. Por lo mismo, puede consultar el tutorial sobre cómo crear un cursor explícito en la base de datos Oracle.

¿Por qué deberíamos usar la cláusula Bulk Collect con la instrucción FETCH INTO?

Como se mencionó en el blog anterior, cada vez que usamos Bulk-Collect con la declaración SELECT-INTO, el motor de tiempo de ejecución usa un cursor implícito para procesar la tarea. Pero si usamos Bulk Collect con la instrucción FETCH-INTO, el motor de tiempo de ejecución usará el cursor explícito para procesar la tarea.

Un cursor explícito siempre nos ayuda a obtener un control avanzado sobre nuestras consultas SQL estándar. Por ejemplo, con un cursor explícito podemos controlar cuándo buscar los registros o cuántos registros queremos recuperar a la vez; sin embargo, esto no es posible en el caso de la instrucción SELECT-INTO.

¿Cuál es la sintaxis de Bulk Collect con instrucción Fetch-Into?

Similar a la declaración SELECT-INTO, la cláusula de recopilación masiva funciona como un atributo de la declaración FETCH-INTO. Aquí está la sintaxis

FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;

Las declaraciones FETCH son parte del cursor explícito. Si intenta ejecutarlos sin declarar su cursor principal, obtendrá un error. Además, recuerde siempre que las colecciones PL/SQL son la única estructura admitida para la recopilación masiva.

Ejemplo:Cómo usar PL/SQL Bulk Collect con declaración FETCH-INTO en Oracle Database.

SET SERVEROUTPUT ON;
DECLARE
--Create an explicit cursor
    CURSOR exp_cur IS
    SELECT first_name FROM employees;

    --Declare collection for holding the data 
    TYPE nt_fName   IS TABLE OF VARCHAR2 (20);
    fname   nt_fName;
BEGIN
    OPEN exp_cur;
    LOOP
        FETCH exp_cur BULK COLLECT INTO fname;
        EXIT WHEN fname.count=0;
        --Print data
        FOR idx IN fname.FIRST.. fname.LAST
        LOOP
            DBMS_OUTPUT.PUT_LINE (idx||' '||fname(idx) );
        END LOOP; 
    END LOOP;
    CLOSE exp_cur;
END;
/

He explicado cada línea de este código completo en detalle en el video tutorial en mi canal de YouTube. Puedes ver este tutorial.

Dado que en este código hemos utilizado la cláusula Bulk Collect con la instrucción fetch into, significa que el cambio de contexto no será un problema. Como sabemos, la cláusula de recopilación masiva comprime varios conmutadores en uno solo, por lo que no hay más cuellos de botella en el rendimiento.

Pero, ¿significa que este código está bien optimizado y no necesita más optimización? ¿O, de hecho, el rendimiento de las consultas nunca será un problema para nosotros en el futuro?

Estén atentos para obtener las respuestas a todas estas preguntas, así como para saber cómo podemos optimizar aún más este programa PL/SQL.

Espero que hayas disfrutado este blog. Si tienes alguna duda o pregunta o crees que olvidé mencionar algo en este blog, escríbeme a mi página de Facebook o Twitter. ¡Gracias y que tengas un gran día!