
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
- 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.
- 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.
- 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.
- 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
, esalario
. - 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!