As Coleções de Registros em PL/SQL Oracle representam uma técnica avançada de estruturação de dados que combina a flexibilidade das coleções com a organização dos registros. Este artigo técnico explora em profundidade o conceito, implementação e aplicações práticas das coleções de registros, oferecendo insights valiosos para desenvolvedores que buscam otimizar o gerenciamento de dados complexos em aplicações Oracle.
Definição e Conceito
Coleções de Registros em PL/SQL Oracle são estruturas de dados que permitem armazenar múltiplos registros em uma única coleção indexada. Esta abordagem facilita a manipulação de conjuntos de dados complexos, melhorando a eficiência do código e a organização das informações.
Características principais:
- Capacidade de armazenar múltiplos registros em uma única estrutura
- Flexibilidade na definição de tipos de registros personalizados
- Eficiência no acesso e manipulação de dados complexos
- Integração seamless com cursores e consultas SQL
Como Criar uma Coleção de Registros
Vamos ver um exemplo passo a passo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
DECLARE -- Primeiro, criamos um tipo de registro para um time TYPE time_tipo IS RECORD ( nome VARCHAR2(50), num_jogadores NUMBER, tecnico VARCHAR2(50) ); -- Agora, criamos uma tabela (coleção) desse tipo de registro TYPE campeonato_tipo IS TABLE OF time_tipo INDEX BY PLS_INTEGER; -- Declaramos uma variável do tipo campeonato campeonato campeonato_tipo; BEGIN -- Vamos adicionar alguns times campeonato(1) := time_tipo('Flamengo', 25, 'Jorge Jesus'); campeonato(2) := time_tipo('São Paulo', 23, 'Fernando Diniz'); campeonato(3) := time_tipo('Palmeiras', 24, 'Abel Ferreira'); -- Agora vamos imprimir os dados FOR i IN 1..3 LOOP DBMS_OUTPUT.PUT_LINE('Time: ' || campeonato(i).nome); DBMS_OUTPUT.PUT_LINE('Jogadores: ' || campeonato(i).num_jogadores); DBMS_OUTPUT.PUT_LINE('Técnico: ' || campeonato(i).tecnico); DBMS_OUTPUT.PUT_LINE('---'); END LOOP; END; / |
Neste exemplo, criamos uma coleção de registros onde cada elemento é um time de futebol. Veja como é fácil acessar os campos de cada registro na coleção: campeonato(i).nome
.
Usando Coleções de Registros com Cursores
Coleções de registros são muito úteis quando trabalhamos com cursores.
Para viabilizar o exemplo, vamos criar uma tabela chamada “alunos_new_02” e inserir alguns dados:
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE alunos_new_02( nome VARCHAR2(100), idade NUMBER, curso VARCHAR2(100) ); -- Inserir alguns dados de exemplo INSERT INTO alunos_new_02 (nome, idade, curso) VALUES ('João Silva', 20, 'Sistemas de Informação'); INSERT INTO alunos_new_02 (nome, idade, curso) VALUES ('Maria Souza', 22, 'Ciência da Computação'); INSERT INTO alunos_new_02 (nome, idade, curso) VALUES ('Pedro Santos', 21, 'Engenharia de Software'); |
Veja este exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
DECLARE -- Definimos um cursor CURSOR c_alunos IS SELECT nome AS nome, idade AS idade, curso AS curso FROM alunos_new_02 WHERE ROWNUM <= 5; -- Criamos um tipo de tabela baseado no cursor TYPE alunos_tipo IS TABLE OF c_alunos%ROWTYPE INDEX BY PLS_INTEGER; -- Declaramos uma variável do tipo alunos alunos alunos_tipo; v_indice NUMBER := 0; BEGIN -- Preenchemos a coleção com os dados do cursor FOR aluno IN c_alunos LOOP v_indice := v_indice + 1; alunos(v_indice).nome := aluno.nome; alunos(v_indice).idade := aluno.idade; alunos(v_indice).curso := aluno.curso; END LOOP; -- Imprimimos os dados FOR i IN 1..v_indice LOOP DBMS_OUTPUT.PUT_LINE('Aluno: ' || alunos(i).nome); DBMS_OUTPUT.PUT_LINE('Idade: ' || alunos(i).idade); DBMS_OUTPUT.PUT_LINE('Curso: ' || alunos(i).curso); DBMS_OUTPUT.PUT_LINE('---'); END LOOP; END; / |
Neste exemplo, usamos um cursor para preencher nossa coleção de registros. Isso é muito útil quando precisamos trabalhar com dados de uma tabela.
Coleções de Registros Definidos pelo Usuário
Podemos também criar coleções de registros definidos pelo usuário.
Antes de executar o exemplo abaixo, crie a tabela conforme abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
-- DDL para criar a tabela de funcionários CREATE TABLE funcionarios ( id NUMBER PRIMARY KEY, nome VARCHAR2(50) NOT NULL, salario NUMBER(10,2) NOT NULL, departamento VARCHAR2(30) NOT NULL ); -- Sequência para gerar IDs únicos CREATE SEQUENCE seq_funcionarios START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE; -- DMLs para inserir dados de exemplo INSERT INTO funcionarios (id, nome, salario, departamento) VALUES (seq_funcionarios.NEXTVAL, 'João Silva', 5500.00, 'TI'); INSERT INTO funcionarios (id, nome, salario, departamento) VALUES (seq_funcionarios.NEXTVAL, 'Maria Santos', 6200.50, 'RH'); INSERT INTO funcionarios (id, nome, salario, departamento) VALUES (seq_funcionarios.NEXTVAL, 'Pedro Oliveira', 4800.75, 'Financeiro'); INSERT INTO funcionarios (id, nome, salario, departamento) VALUES (seq_funcionarios.NEXTVAL, 'Ana Souza', 7100.25, 'Marketing'); INSERT INTO funcionarios (id, nome, salario, departamento) VALUES (seq_funcionarios.NEXTVAL, 'Carlos Pereira', 5900.00, 'TI'); -- Commit para confirmar as inserções COMMIT; |
Agora, veja este exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
DECLARE -- Definimos um tipo de registro TYPE funcionario_tipo IS RECORD ( nome VARCHAR2(50), salario NUMBER, departamento VARCHAR2(30) ); -- Criamos uma tabela desse tipo de registro TYPE empresa_tipo IS TABLE OF funcionario_tipo INDEX BY PLS_INTEGER; -- Declaramos uma variável do tipo empresa empresa empresa_tipo; -- Cursor para buscar dados dos funcionários CURSOR c_funcionarios IS SELECT nome, salario, departamento FROM funcionarios WHERE ROWNUM <= 5; v_indice NUMBER := 0; BEGIN -- Preenchemos a coleção com os dados do cursor FOR func IN c_funcionarios LOOP v_indice := v_indice + 1; empresa(v_indice) := funcionario_tipo(func.nome, func.salario, func.departamento); END LOOP; -- Imprimimos os dados FOR i IN 1..v_indice LOOP DBMS_OUTPUT.PUT_LINE('Funcionário: ' || empresa(i).nome); DBMS_OUTPUT.PUT_LINE('Salário: R$' || TO_CHAR(empresa(i).salario, '99G999D99')); DBMS_OUTPUT.PUT_LINE('Departamento: ' || empresa(i).departamento); DBMS_OUTPUT.PUT_LINE('---'); END LOOP; END; / |
Neste exemplo, criamos um tipo de registro personalizado e uma coleção desse tipo. Isso nos dá mais flexibilidade para definir exatamente quais informações queremos armazenar.
Conclusão
Ufa! Chegamos ao fim da nossa jornada pelas coleções de registros em PL/SQL. Vamos recapitular o que aprendemos:
- Coleções de registros nos permitem armazenar múltiplos registros em uma única estrutura.
- Podemos criar coleções baseadas em cursores ou em tipos de registro definidos pelo usuário.
- Elas são muito úteis para trabalhar com conjuntos de dados complexos.
- Podemos acessar facilmente os campos de cada registro na coleção usando a notação de ponto.
- Coleções de registros combinam a flexibilidade das coleções com a organização dos registros.
Coleções de registros são como super-heróis do PL/SQL – elas combinam os poderes das coleções e dos registros para criar uma ferramenta realmente poderosa!
Lembre-se: a prática leva à perfeição. Tente criar suas próprias coleções de registros e veja como elas podem simplificar seu código e torná-lo mais eficiente.