Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como usar a cláusula de coleta em massa com a instrução SELECT INTO no banco de dados Oracle

Cláusula de coleta em massa com instrução SELECT INTO


Bem-vindo ao segundo tutorial da série PL/SQL Bulk Collect, onde aprenderemos como usar a cláusula BULK COLLECT com a instrução SELECT-INTO.

As trocas de contexto são boas, mas apenas quando são baixas em números. O aumento do número de trocas de contexto pode causar problemas como baixo desempenho de consulta. Essa sobrecarga causada por alternâncias de contexto pode ser facilmente controlada se pudermos comprimi-las. É exatamente isso que você aprenderá neste tutorial.

Você pode saber mais sobre SELECT-INTO aqui .

Quando devemos usar a coleta em massa com a instrução Select-Into?


Quando você tem certeza de que o resultado de retorno de sua instrução SELECT é pequeno então você deve usar a cláusula Bulk Collect com a instrução Select-Into. Caso contrário, sua cláusula de coleta em massa tornará sua instrução Select-Into um monstro que consome memória. Consequentemente, irá diminuir o desempenho do seu banco de dados.

O que devo fazer se minha instrução SELECT estiver recuperando um grande número de linhas?


Você sempre pode usar a cláusula LIMIT junto com o Bulk Collect para limitar o número de linhas buscadas no banco de dados. Mas isso só é possível quando estamos usando a cláusula Bulk Collect com PL/SQL Cursors. No entanto, discutiremos sobre isso em detalhes no próximo tutorial.

Por que não podemos limitar os dados obtidos usando a coleta em massa na instrução SELECT-INTO?


Quando usamos a cláusula Bulk Collect com a instrução SELECT-INTO, ela usa implícito cursor para executar a tarefa de processamento de dados em massa. No entanto, a Cláusula Limite só pode ser usada com a cláusula Coleta em Massa, quando esta estiver usando o Cursor Explícito para processamento de dados.

Quando a cláusula de coleta em massa usa um cursor implícito e quando um cursor explícito?


Se estivermos usando Bulk Collect Clause com uma instrução SQL como SELECT-INTO, ela usará um cursor implícito. Por outro lado, sempre que usamos a cláusula Bulk Collect com a instrução FETCH, ela usa um cursor explícito.

Sugiro que leia como criar um cursor explícito para saber mais sobre a declaração FETCH.

Podemos armazenar o resultado retornado pela cláusula de coleta em massa em uma variável de tipo de dados primitivo?


Não, a partir de agora as Coleções PL/SQL são os únicos tipos de dados de suporte para Processamento de Dados em Massa com Cláusula de Coleta em Massa no Banco de Dados Oracle. Caso você tente armazenar os dados recuperados usando a cláusula Bulk Collect em uma variável de tipo de dados como Char, Number ou Varchar2, você receberá um erro que será algo assim:



“PLS-00497:Não é possível misturar entre linha única e várias linhas (BULK) na lista INTO”

Definição de Coleta em Massa em Declaração
A instrução “Bulk Collect Into” seleciona vários dados de uma coluna e os armazena em uma coleção SQL.

Sintaxe da cláusula Bulk Collect com instrução Select-Into.


A sintaxe para usar a cláusula PL/SQL Bulk Collect com instrução Select-Into no Oracle Database é a seguinte:
SELECT column_list
 BULK COLLECT INTO collection_datatype_name 
FROM table_name 
WHERE <where clause> 
ORDER BY <column list>;

Onde:

Lista de colunas é a lista de colunas das quais você deseja recuperar os dados.

Nome do tipo de dados da coleção será o nome da variável de coleta que conterá os dados retornados pela cláusula de coleta em massa.

Além disso, lembre-se sempre de que cada coluna que você especificou para recuperar os dados deve conter um tipo de dados de coleção correspondente para armazenar esses dados. Porque o mecanismo de tempo de execução PL/SQL sempre armazena os dados recuperados da coluna na coleção de maneira paralela.

Por exemplo

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

Aqui, os dados recuperados da coluna_1 serão armazenados na coleção_1 e os dados da coluna_2 na coleção_2 automaticamente.

Nome da tabela pode ser o nome de qualquer tabela da qual você deseja recuperar os dados.

Seguido disso, temos as cláusulas WHERE e ORDER BY que são opcionais, mas se você quiser, pode usá-las.

Agora que discutimos a sintaxe, vamos fazer um exemplo simples para aprender a trabalhar com a cláusula PL/SQL Bulk Collect com a instrução SELECT INTO no 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;
/

Explicação do exemplo


Aqui temos um código muito simples para demonstrar como usar Bulk Collect Clause com instrução Select-Into. Na seção de declaração deste código, primeiro criamos duas coleções do tipo de tabela aninhada “nt_fName” e “nt_lName” com suas variáveis ​​de coleção correspondentes “fName” e “lName”. Na verdade, essas duas coleções serão usadas para armazenar os dados retornados pela instrução Select-Into.

Você pode ler como criar uma tabela aninhada aqui.

Na seção de declaração temos nossa declaração Select-Into com a cláusula Bulk Collect. Além disso, usando esta instrução Select-Into, estamos recuperando todos os dados da coluna Nome e Sobrenome da tabela de funcionários. E com a ajuda da cláusula Bulk Collect, estamos armazenando esses dados nas coleções correspondentes de maneira paralela.

Exceto junto com a instrução Select-Into, também temos um "For Loop" que está imprimindo os dados de ambas as coleções na tela de saída.

Deve assistir
Não deixe de conferir o vídeo em que demonstrei como a cláusula de coleta em massa compacta várias opções de contexto em uma e melhora o desempenho da consulta. Aqui está o link.

Esse é o tutorial explicando os conceitos da cláusula Bulk Collect com instrução Select-Into em detalhes. Neste tutorial, tentei responder a todas as possíveis perguntas que você pode enfrentar no seu exame de certificação, bem como na entrevista.



Espero que tenha gostado de ler. Por favor, certifique-se de COMPARTILHAR este blog com seus amigos em sua rede social. Obrigado e tenha um ótimo dia!