Database
 sql >> Base de Dados >  >> RDS >> Database

Como usar a cláusula de coleta em massa PL/SQL com a instrução FETCH INTO

Cláusula de coleta em massa com declaração FETCH INTO


No tutorial anterior, conseguimos compactar várias opções de contexto em uma única usando o PL/SQL Bulk Collect com a instrução SELECT-INTO. A instrução SELECT-INTO é uma consulta padrão SQL, o que significa que o desenvolvedor não tem muito controle sobre a execução da instrução.

Se falamos sobre desempenho de consulta, não podemos ir além de uma extensão com a instrução SELECT-INTO. Vamos ver como podemos superar todas essas deficiências da instrução SELECT-INTO.

Neste blog, você aprenderá como usar a cláusula Bulk Collect com a instrução FETCH-INTO de um cursor explícito. Como as instruções FETCH fazem parte do ciclo de vida do cursor, é necessário um conhecimento prático do cursor explícito para o melhor entendimento deste tutorial. Para o mesmo você pode conferir o tutorial de como criar um cursor explícito no banco de dados Oracle.

Por que devemos usar a cláusula Bulk Collect com a instrução FETCH INTO?


Conforme mencionado no blog anterior, sempre que usamos Bulk-Collect com instrução SELECT-INTO, o mecanismo de tempo de execução usa o cursor implícito para processar a tarefa. Mas se usarmos o Bulk Collect com a instrução FETCH-INTO, o mecanismo de tempo de execução usará o cursor explícito para processar a tarefa.

Um cursor explícito sempre nos ajuda a obter controle avançado sobre nossas consultas SQL padrão. Por exemplo, com um cursor explícito, podemos controlar quando buscar os registros ou quantos registros queremos recuperar de uma vez, mas isso não é possível no caso da instrução SELECT-INTO.

Qual ​​é a sintaxe da instrução Coleta em massa com Fetch-Into?


Semelhante à instrução SELECT-INTO, a cláusula de coleta em massa funciona como um atributo para a instrução FETCH-INTO. Aqui está a sintaxe
FETCH <cursor_name> BULK COLLECT INTO <plsql_collection>;

As instruções FETCH fazem parte do cursor explícito. Se você tentar executá-los sem declarar o cursor pai, receberá um erro. Lembre-se também de que as coleções PL/SQL são a única estrutura suportada para coleta em massa.

Exemplo:como usar o PL/SQL Bulk Collect com a instrução FETCH-INTO no banco de dados Oracle.

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;
/

Expliquei cada linha de todo este código em detalhes no tutorial em vídeo no meu canal do YouTube. Você pode assistir a este tutorial.



Como neste código usamos a cláusula Bulk Collect com a instrução fetch into, isso significa que a troca de contexto não será um problema. Como sabemos, a cláusula de coleta em massa compacta vários switches em um único, para que não haja mais gargalos de desempenho.

Mas isso significa que este código está bem otimizado e não precisa de otimização adicional? Ou o desempenho da consulta nunca será um problema para nós no futuro?

Fique atento, para obter as respostas para todas essas perguntas e também para saber como podemos otimizar ainda mais este programa PL/SQL.

Espero que tenham gostado deste blog. Se você tiver alguma dúvida ou pergunta ou acha que esqueci de mencionar algo neste blog, escreva para mim na minha página do Facebook ou Twitter. Obrigado e tenha um ótimo dia!