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

Métodos de coleta:funções FIRST &LAST no banco de dados Oracle




Bem-vindo novamente à série sobre Métodos de Coleta no Banco de Dados Oracle. Até agora, nesta série, abordamos Contagem de função de coleção ( ) e Existência de função de coleção ( ). Espero que tenha gostado de ler. Hoje neste tutorial de PL/SQL vamos aprender os métodos de coleta First ( ) e Last ( ).

Quais são os métodos de coleta FIRST ( ) e LAST ( )?


Usamos as funções de coleção First &Last para conhecer o primeiro e o último valores de índice definidos em uma coleção.

Podemos usar esses métodos de coleta com qualquer tipo de coleta?


Sim! Você pode usar essas duas funções com todos os três tipos de coleções que são Matriz Associativa, Tabela Aninhada e VARRAYs.

Quando o método de coleta FIRST ( ) e LAST ( ) retornam nulos?


Ambas as funções retornam null quando aplicadas a uma coleção vazia ou quando aplicadas a uma coleção de inicialização que não possui elementos.

Você pode listar a especificação de função para ambas as funções?


Certo! Por que não. A especificação para a função de coleção FIRST ( ) é:
FUNCTION FIRST RETURN PLS_INTEGER | VARCHAR2

E a especificação da função para a função de coleção LAST ( ) é:
FUNCTION LAST RETURN PLS_INTEGER | VARCHAR2

Informações:
Para array associativo indexado por string, esses métodos retornam strings; "mais baixo" e "mais alto" são determinados pela ordem do conjunto de caracteres em uso nessa sessão.

E se houver apenas 1 elemento no meu VARRAY?


Nesse caso, a função de coleta FIRST ( ) é sempre 1 e o método de coleta LAST ( ) é sempre igual a COUNT.

E se eu aplicasse essas funções a uma coleção não inicializada?


Quero dizer, sério, por que você faria isso! De qualquer forma, se você aplicou a função de coleção FIRST &LAST a uma coleção não inicializada, ela gerará a exceção COLLECTION_IS_NULL.

Exemplo:como usar a função de coleção PRIMEIRO e ÚLTIMO com a coleção?

SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_tab IS TABLE OF NUMBER;
    col_var nt_tab := nt_tab(10, 20, 30, 40, 50);
BEGIN
    DBMS_OUTPUT.PUT_LINE ('First Index of the Nested table is ' || col_var.FIRST);
    DBMS_OUTPUT.PUT_LINE ('Last Index of the Nested table is ' || col_var.LAST);
END;
/

No exemplo acima, criamos uma tabela aninhada com o nome NT_TAB e a inicializamos usando a variável de coleção col_var. Esta tabela aninhada tem 5 índices nos quais armazenamos os valores. O índice mais baixo nesta tabela aninhada é 1 que mantém o valor 10 e o índice máximo é 5 com valor 50. Assim, na execução, o resultado da primeira DBMS_OUTPUT será 1 e da segunda instrução DBMS_OUTPUT será 5.

Vá em frente, copie o código e confira o resultado você mesmo.

E se excluirmos o primeiro elemento da tabela aninhada? Qual será então a saída da função de coleta PRIMEIRO?


Esta é uma questão muito boa! Se você excluir o primeiro elemento da função de coleta, a função de coleta FIRST retornará o subscrito que é maior que 1 e contém alguns dados. Vejamos o exemplo:
SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_tab IS TABLE OF NUMBER;
    col_var nt_tab := nt_tab(10, 20, 30, 40, 50);
BEGIN
col_var.DELETE(1);
    DBMS_OUTPUT.PUT_LINE ('First Index after DELETE is ' || col_var.FIRST);
END;
/

No exemplo acima, excluímos o primeiro elemento da tabela aninhada nt_tab usando o método de coleta DELETE. Depois de excluir o primeiro elemento que é 10 no índice 1, o novo subscrito mais baixo agora é 2, que possui alguns dados armazenados nele. Assim na execução o resultado será 2.

E se eu excluir o elemento do meio da coleção?


Se você excluir os dados do meio, a função de coleta LAST retornará um valor maior que o valor retornado pelo método COUNT.

Podemos ver os dados armazenados nos índices da coleção usando os métodos de coleta FIRST e LAST?


Quando eu estava explicando esse mesmo conceito em uma aula, uma aluna levantou a mão e me perguntou.

Senhor, até agora vimos que essas funções retornam o número de índice da coleção. E se quisermos ver os dados armazenados nesses index. Existe uma maneira de ver os dados armazenados no índice usando esses métodos de coleta FIRST &LAST?

A resposta a esta pergunta é, sim! Claro . Junto com o número do subscrito, você pode usar essas funções para ver os dados armazenados no índice mais baixo e mais alto da coleção.

Por exemplo
SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_tab IS TABLE OF NUMBER;
    col_var nt_tab := nt_tab(10, 20, 30, 40, 50);
BEGIN
    -- This output statement will return 10 which is the value stored at the first index
    DBMS_OUTPUT.PUT_LINE ('Value stored at First Index is ' || col_var(col_var.FIRST));
    -- This output statement will return 50 which is the value stored at the last index
    DBMS_OUTPUT.PUT_LINE ('Value stored at First Index is ' || col_var(col_var.LAST));
END;
/

Para ver os dados armazenados no primeiro e no último índice, basta colocar as chamadas de função dessas funções dentro dos parênteses da variável de coleção que é col_var como fizemos no exemplo acima.

Agora a questão é e se TRIM a coleção? Qual será então a saída da função de coleta LAST? Vá em frente e confira o tutorial em vídeo onde expliquei qual será a saída do método de coleta LAST quando você aparar a coleção usando o exemplo.

Isso é tudo sobre esses métodos de coleta. Espero que você tenha achado este blog útil. Obrigado e tenha um ótimo dia!