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

Instrução FORALL com cláusula INDICES-OF no banco de dados Oracle

Por que declaração FORALL com cláusula INDICE OF Bound?


A instrução FORALL com cláusula Lower &Upper Bound é provavelmente a maneira mais fácil de processamento de dados em massa até que façamos referência a uma coleção densa. Quando se trata de coleção esparsa, a cláusula Lower &Upper Bound não é forte. Além disso, infelizmente, no cenário da vida real, as chances de trabalhar com uma coleção densa são muito menores do que trabalhar com uma coleção esparsa.

De qualquer forma, se você estiver curioso, fizemos uma demonstração. Confira o que acontece quando usamos a cláusula de limite inferior e superior da instrução FORALL com coleção esparsa no vídeo em nosso canal do YouTube aqui.

A desvantagem da cláusula de limite inferior e superior da instrução FORALL é que ela não pode ser usada com uma coleção esparsa. Essa deficiência pode ser facilmente superada usando opções como 'Indices-of ' ou 'Valores de ' cláusula vinculada. Este tutorial é sobre a primeira opção.

INDICES-OF Cláusula vinculada


Semelhante à cláusula de limite inferior e superior, a cláusula INDICES-OF nos ajuda no processamento de dados em massa, permitindo iterar pela coleção. A única diferença é que usando a cláusula INDICES OF podemos iterar através de uma coleção densa e esparsa. Enquanto a cláusula de limite inferior e superior funciona apenas com uma coleção densa.

Sintaxe de INDICES OF cláusula vinculada

FORALL index IN INDICES OF collection_variable
[SAVE EXCEPTION]
DML statements; 

Onde:

FORALL é uma palavra-chave reservada do Oracle Database seguida por um Index. Este índice é um contador de loops definido implicitamente que é declarado pelo mecanismo PL/SQL. Depois disso, você deve escrever outra palavra-chave que seja IN. Seguido pela palavra-chave IN, temos nossa cláusula vinculada que é INDICES OF.

Logo após escrever a frase reservada ‘INDICES OF’ temos que especificar a variável de coleção da coleção cujos dados queremos usar. Já sabemos que referenciamos a coleção no programa por meio de sua variável de coleção. Seguido disso, temos a opção SAVE EXCEPTION, esta é uma escolha opcional. Então temos uma instrução DML que pode ser qualquer instrução DML ou uma instrução MERGE.

Certifique-se de que a instrução DML ou a instrução MERGE que você está usando com FORALL deve fazer referência a uma coleção. Além disso, uma instrução FORALL pode processar apenas uma instrução DML ou MERGE de uma só vez.

Exemplo de cláusula vinculada INDICES OF


Aqui veremos uma demonstração da cláusula INDICE OF vinculada com a instrução FORALL. Aqui vamos buscar os dados de uma tabela aninhada esparsa já inicializada e armazená-los em uma tabela.

Como aprendemos no tutorial anterior, a instrução FORALL pega os dados da coleção e os armazena em uma tabela. Assim, vamos primeiro criar uma tabela.
SET SERVEROUTPUT ON;
CREATE TABLE tut_78(
    mul_tab NUMBER(5)
);

Para facilitar a demonstração, criamos uma tabela bem simples com o nome tut_78. Esta tabela tem apenas uma coluna mul_tab do tipo de dados NUMBER.
DECLARE
    TYPE my_nested_table IS TABLE OF number;
    var_nt my_nested_table := my_nested_table (9,18,27,36,45,54,63,72,81,90);
    --Another variable for holding total number of record stored into the table 
    tot_rec NUMBER;
BEGIN
    var_nt.DELETE(3, 6);
    
    FORALL idx IN INDICES OF var_nt
        INSERT INTO tut_78 (mul_tab) VALUES (var_nt(idx));
        
    SELECT COUNT (*) INTO tot_rec FROM tut_78;
    DBMS_OUTPUT.PUT_LINE ('Total records inserted are '||tot_rec);
END;
/

Você pode encontrar a explicação detalhada do código acima no tutorial em vídeo. Mas ainda vamos ter uma explicação rápida aqui também.

Seção de declaração do bloco PL/SQL acima


Aqui nesta seção, primeiro criamos uma tabela aninhada com o nome 'my_nested_table '. Ele está segurando os dados do tipo de dados NUMBER. Em seguida, declaramos sua variável de coleção 'var_nt '. Usando-o, inicializamos os 10 primeiros índices armazenando 10 elementos numéricos em nossa coleção.

Além da tabela aninhada e sua variável de coleção, também declaramos uma variável extra 'tot_rec ' do tipo de dados numérico. Esta variável será usada para armazenar o número total de dados que serão armazenados na tabela.

Seção de Execução


Se você observar a primeira instrução na seção de execução. Você descobrirá que, usando o método de coleta DELETE, excluí dados do índice 3 para o índice 6. Isso significa que agora o índice de nossa coleção não é preenchido sequencialmente. Isso muda a natureza de nossa coleção de DENSE para PARA.

Logo após a chamada do método de coleta DELETE, temos nossa instrução FORALL com cláusula vinculada INDICES OF. Usando esta declaração estamos inserindo na coleção ‘my_nested_table’ na tabela tut_78.

Então temos uma instrução SELECT-INTO. Essa instrução está retornando o número total de linhas inseridas na tabela tut_78 e armazenando esse valor na variável tot_rec. Em seguida, usando a instrução DBMS_OUTPUT, estamos exibindo de volta o valor armazenado na variável tot_rec com uma string formatada para o usuário.



Eu sugiro que você assista a este tutorial no meu canal do YouTube para uma explicação detalhada do código discutido acima. Além disso, não se esqueça de se inscrever no canal para mais tutoriais interessantes.

Obrigado, esse é o tutorial de PL/SQL sobre como fazer processamento de dados em massa usando a instrução FORALL com a cláusula INDICES OF. Espero que você tenha gostado de ler, se sim, então compartilhe este blog em suas mídias sociais. Tenha um ótimo dia!