
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!