Coleções em PL/SQL

 

Coleções no Oracle são estruturas que permitem armazenar e manipular conjuntos de dados como uma única unidade. Elas são ideais para agrupar elementos de tamanho variável e facilitam o trabalho com listas, arrays e tabelas aninhadas em PL/SQL, tornando a manipulação de múltiplos valores relacionados mais eficiente.

Vantagens de Usar Coleções

  1. Eficiência na Manipulação de Dados: Coleções permitem que você armazene e manipule vários valores em uma única variável, simplificando operações que envolvem listas ou conjuntos de dados.
  2. Flexibilidade: Com coleções, é possível armazenar um número variável de elementos e trabalhar com diferentes tipos de dados, como números, strings, ou até mesmo registros.
  3. Suporte a Operações em Massa: Coleções são ideais para operações em massa, como inserções, atualizações, ou exclusões de múltiplos registros em uma única operação.
  4. Facilidade de Integração: Coleções podem ser facilmente integradas com cursores, loops e outras estruturas PL/SQL, aumentando a flexibilidade e a capacidade de processamento.

Tipos de Coleções no Oracle

1. VARRAYs (Vetores de Tamanho Fixo)

VARRAY (Variável Array) é uma coleção que armazena um número fixo de elementos, todos do mesmo tipo. É útil quando o tamanho máximo da coleção é conhecido antecipadamente.

 

Exemplo de Definição e Uso de VARRAY:

CREATE TYPE numeros_varray AS VARRAY(10) OF NUMBER;

DECLARE
  numeros numeros_varray := numeros_varray(1, 2, 3, 4, 5);
BEGIN
  DBMS_OUTPUT.PUT_LINE(numeros(1)); 
END;

DBMS Output

1

Neste exemplo, um VARRAY chamado numeros_varray é criado para armazenar até 10 números. Em seguida, ele é instanciado e usado para armazenar e acessar valores.

 


2. Nested Tables (Tabelas Aninhadas)

Nested Tables são coleções semelhantes às tabelas de banco de dados. Elas permitem armazenar um número variável de elementos, e esses elementos podem ser armazenados em qualquer ordem. Diferente dos VARRAYs, os elementos em Nested Tables não possuem uma posição fixa.

 

Exemplo de Definição e Uso de Nested Tables:

CREATE TYPE numeros_table AS TABLE OF NUMBER;

DECLARE
  numeros numeros_table := numeros_table(1, 2, 3, 4, 5);
BEGIN
  numeros.DELETE(3); -- Remove o 3º elemento
  FOR i IN numeros.FIRST .. numeros.LAST LOOP
    IF numeros.EXISTS(i) THEN
      DBMS_OUTPUT.PUT_LINE(numeros(i));
    END IF;
  END LOOP;
END;

DBMS Output

1
2
4
5

Aqui, numeros_table é uma tabela aninhada que armazena números. Podemos remover elementos, redimensionar a tabela e iterar sobre seus elementos.

 


3. Associative Arrays (Arrays Associativos)

Associative Arrays, também conhecidos como Index-By Tables, são coleções indexadas por uma chave que pode ser um número ou uma string. São extremamente flexíveis e podem crescer ou encolher conforme necessário.

 

Exemplo de Definição e Uso de Associative Arrays:

DECLARE
  TYPE numeros_assoc_array IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
  numeros numeros_assoc_array;
BEGIN
  numeros(1) := 100;
  numeros(2) := 200;
  numeros(100) := 300;
  FOR i IN numeros.FIRST .. numeros.LAST LOOP
    IF numeros.EXISTS(i) THEN
      DBMS_OUTPUT.PUT_LINE('Chave: ' || i || ', Valor: ' || numeros(i));
    END IF;
  END LOOP;
END;

DBMS Output

Chave: 1, Valor: 100
Chave: 2, Valor: 200
Chave: 100, Valor: 300

Este exemplo define um numeros_assoc_array onde os elementos são indexados por inteiros. Podemos acessar, adicionar e remover elementos de maneira flexível.

 


4. PL/SQL Collections

Coleções PL/SQL são variáveis compostas que podem armazenar vários elementos do mesmo tipo. Elas incluem VARRAYs, Nested Tables e Associative Arrays, cada uma com suas características próprias.

 


5. Multidimensional Collections

Embora o Oracle não suporte coleções multidimensionais diretamente, é possível criar coleções de coleções, como uma Nested Table que contém VARRAYs ou outro Nested Table.

 

Exemplo de Definição e Uso de Coleções Multidimensionais:

CREATE TYPE matriz_tipo IS TABLE OF numeros_varray;

DECLARE
  matriz matriz_tipo := matriz_tipo(numeros_varray(1, 2),
                                    numeros_varray(3, 4));
BEGIN
  DBMS_OUTPUT.PUT_LINE(matriz(1) (2)); 
END;

DBMS Output

2

Aqui, matriz_tipo é uma tabela aninhada que contém VARRAYs, representando uma matriz de números.

 


6. Nested Records

É possível criar coleções que armazenam registros compostos, ou seja, registros dentro de coleções como Nested Tables ou Associative Arrays.

 

Exemplo de Definição e Uso de Nested Records:

DECLARE
  TYPE funcionarios_rec IS RECORD(
    id      funcionarios.id%TYPE,
    nome    funcionarios.nome%TYPE,
    salario funcionarios.salario%TYPE);

  TYPE funcionarios_table IS TABLE OF funcionarios_rec;
  my_funcionarios_table funcionarios_table;
BEGIN

  -- Popula a tabela aninhada com registros de funcionários
  SELECT id, nome, salario
    BULK COLLECT
    INTO my_funcionarios_table
    FROM funcionarios
   WHERE salario > 5000;

  -- Itera sobre a tabela aninhada e exibe os dados
  FOR i IN 1 .. my_funcionarios_table.COUNT LOOP
    DBMS_OUTPUT.PUT_LINE('ID: ' || my_funcionarios_table(i).id ||
                         ', Nome: ' || my_funcionarios_table(i).nome ||
                         ', Salário: ' || my_funcionarios_table(i).salario);
  END LOOP;
END;

DBMS Output

ID: 3, Nome: Pedro Lima, Salário: 6500
ID: 4, Nome: Mariana Costa, Salário: 7000

Neste exemplo:

  • funcionarios_rec define um registro para armazenar dados de id, nome, e salario.
  • funcionarios_table é uma Nested Table que armazena vários registros do tipo funcionarios_rec.
  • A tabela aninhada é preenchida com dados da tabela funcionarios e, em seguida, os registros são exibidos usando um loop.

Isso demonstra como usar registros aninhados em coleções para manipular dados complexos de maneira eficiente.

Operações Comuns com Coleções

Inserção e Atualização

Coleções permitem inserir novos elementos ou atualizar os existentes usando índices, como mostrado nos exemplos acima.

Iteração

É possível iterar sobre os elementos de uma coleção usando loops como FOR, WHILE, ou LOOP, permitindo processar ou exibir os elementos da coleção.

Operações em Massa

As coleções podem ser usadas em operações em massa, como inserir vários registros em uma tabela de banco de dados usando a instrução FORALL.

 

Exemplo de Inserção em Massa com FORALL:

DECLARE
  TYPE numeros_array IS TABLE OF NUMBER;
  numeros numeros_array := numeros_array(1, 2, 3, 4, 5);
BEGIN
  FORALL i IN INDICES OF numeros
    INSERT INTO minha_tabela (val) VALUES (numeros(i));
END;

Considerações Finais

 

Coleções no Oracle são ferramentas poderosas que permitem gerenciar grandes volumes de dados de forma eficiente e flexível. Com tipos como VARRAYs, Nested Tables, Associative Arrays, e a capacidade de criar estruturas complexas como coleções multidimensionais ou registros aninhados, as coleções oferecem uma vasta gama de possibilidades para manipulação e armazenamento de dados em PL/SQL.

 

Se você tiver alguma dúvida ou sugestão, deixe um comentário abaixo!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima