Os Registros Aninhados em PL/SQL Oracle representam uma técnica avançada de estruturação de dados, permitindo a criação de estruturas complexas e hierárquicas dentro de um único registro. Este artigo técnico explora em profundidade o conceito, implementação e aplicações práticas dos registros aninhados, oferecendo insights valiosos para desenvolvedores que buscam otimizar o gerenciamento de dados em aplicações Oracle.
Definição e Conceito
Registros Aninhados em PL/SQL Oracle são estruturas de dados que permitem a inclusão de um registro dentro de outro, criando uma hierarquia de dados. Esta abordagem facilita a organização de informações relacionadas de forma lógica e eficiente, melhorando a legibilidade do código e a manipulação de dados complexos.
Características principais:
- Capacidade de encapsular múltiplos níveis de dados relacionados
- Melhoria na organização e estruturação de informações complexas
- Flexibilidade na definição de estruturas de dados personalizadas
- Otimização do acesso e manipulação de dados hierárquicos
Como Criar um Registro Aninhado
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 29 30 31 32 33 34 |
DECLARE -- Primeiro, criamos um registro para o nome TYPE nome_tipo IS RECORD ( primeiro_nome VARCHAR2(15), sobrenome VARCHAR2(30) ); -- Agora, criamos um registro que inclui o nome e outras informações TYPE pessoa_tipo IS RECORD ( nome nome_tipo, -- Aqui está o registro aninhado! rua VARCHAR2(50), cidade VARCHAR2(25), estado VARCHAR2(2), cep VARCHAR2(8) ); -- Declaramos uma variável do tipo pessoa pessoa_rec pessoa_tipo; BEGIN -- Vamos preencher os dados pessoa_rec.nome.primeiro_nome := 'João'; pessoa_rec.nome.sobrenome := 'Silva'; pessoa_rec.rua := 'Rua das Flores, 123'; pessoa_rec.cidade := 'São Paulo'; pessoa_rec.estado := 'SP'; pessoa_rec.cep := '01234-567'; -- Agora vamos imprimir os dados DBMS_OUTPUT.PUT_LINE('Nome: ' || pessoa_rec.nome.primeiro_nome || ' ' || pessoa_rec.nome.sobrenome); DBMS_OUTPUT.PUT_LINE('Endereço: ' || pessoa_rec.rua); DBMS_OUTPUT.PUT_LINE('Cidade: ' || pessoa_rec.cidade || ', ' || pessoa_rec.estado); DBMS_OUTPUT.PUT_LINE('CEP: ' || pessoa_rec.cep); END; / |
Veja como é fácil acessar os campos do registro aninhado? Usamos a notação de ponto duas vezes: pessoa_rec.nome.primeiro_nome
.
Usando Registros Aninhados com Consultas SQL
Registros aninhados são muito úteis quando trabalhamos com consultas SQL.
Mas antes vamos criar uma tabela para viabilizar o exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 |
CREATE TABLE alunos_new ( id NUMBER PRIMARY KEY, primeiro_nome VARCHAR2(15), sobrenome VARCHAR2(30), endereco VARCHAR2(50), cidade VARCHAR2(25), estado VARCHAR2(2), cep VARCHAR2(9) ); INSERT INTO alunos_new (id, primeiro_nome, sobrenome, endereco, cidade, estado, cep) VALUES (1, 'João', 'Silva', 'Rua das Flores, 123', 'São Paulo', 'SP', '01234-567'); INSERT INTO alunos_new (id, primeiro_nome, sobrenome, endereco, cidade, estado, cep) VALUES (2, 'Maria', 'Oliveira', 'Avenida Central, 456', 'Rio de Janeiro', 'RJ', '98765-432'); INSERT INTO alunos_new (id, primeiro_nome, sobrenome, endereco, cidade, estado, cep) VALUES (3, 'Carlos', 'Pereira', 'Travessa do Sol, 789', 'Belo Horizonte', 'MG', '12345-678'); |
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 |
DECLARE TYPE nome_tipo IS RECORD ( primeiro_nome VARCHAR2(15), sobrenome VARCHAR2(30) ); TYPE pessoa_tipo IS RECORD ( nome nome_tipo, rua VARCHAR2(50), cidade VARCHAR2(25), estado VARCHAR2(2), cep VARCHAR2(9) ); pessoa_rec pessoa_tipo; BEGIN -- Vamos buscar dados de uma tabela SELECT primeiro_nome, sobrenome, endereco, cidade, estado, cep INTO pessoa_rec.nome.primeiro_nome, pessoa_rec.nome.sobrenome, pessoa_rec.rua, pessoa_rec.cidade, pessoa_rec.estado, pessoa_rec.cep FROM alunos_new WHERE id = 1; -- Imprimindo os dados DBMS_OUTPUT.PUT_LINE('Nome: ' || pessoa_rec.nome.primeiro_nome || ' ' || pessoa_rec.nome.sobrenome); DBMS_OUTPUT.PUT_LINE('Endereço: ' || pessoa_rec.rua); DBMS_OUTPUT.PUT_LINE('Cidade: ' || pessoa_rec.cidade || ', ' || pessoa_rec.estado); DBMS_OUTPUT.PUT_LINE('CEP: ' || pessoa_rec.cep); END; / |
Neste exemplo, estamos buscando dados de uma tabela e armazenando-os diretamente em nosso registro aninhado. Isso torna nosso código mais organizado e fácil de entender.
Registros Aninhados com Coleções
Agora, vamos dar um passo além! E se quiséssemos armazenar vários sobrenomes para um mesmo CEP? Podemos usar uma coleção dentro de um registro. Veja só:
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 38 |
DECLARE -- Criamos um tipo de tabela para armazenar sobrenomes TYPE sobrenome_tipo IS TABLE OF VARCHAR2(30) INDEX BY PLS_INTEGER; -- Criamos um registro que inclui o CEP e a tabela de sobrenomes TYPE info_cep_tipo IS RECORD ( cep VARCHAR2(9), sobrenomes sobrenome_tipo ); -- Declaramos uma variável do tipo info_cep info_cep_rec info_cep_tipo; -- Cursor para buscar sobrenomes por CEP CURSOR c_sobrenomes (p_cep VARCHAR2) IS SELECT sobrenome FROM alunos_new WHERE cep = p_cep; v_indice PLS_INTEGER := 0; BEGIN -- Vamos preencher o CEP info_cep_rec.cep := '01234-567'; -- Agora vamos buscar os sobrenomes para este CEP FOR rec IN c_sobrenomes(info_cep_rec.cep) LOOP v_indice := v_indice + 1; info_cep_rec.sobrenomes(v_indice) := rec.sobrenome; END LOOP; -- Vamos imprimir os dados DBMS_OUTPUT.PUT_LINE('CEP: ' || info_cep_rec.cep); DBMS_OUTPUT.PUT_LINE('Sobrenomes neste CEP:'); FOR i IN 1..info_cep_rec.sobrenomes.COUNT LOOP DBMS_OUTPUT.PUT_LINE(i || ': ' || info_cep_rec.sobrenomes(i)); END LOOP; END; / |
Neste exemplo, criamos um registro que contém um CEP e uma coleção de sobrenomes. Usamos um cursor para preencher a coleção com todos os sobrenomes associados a um CEP específico.
Conclusão
Ufa! Chegamos ao fim da nossa aventura pelos registros aninhados em PL/SQL. Vamos recapitular o que aprendemos:
- Registros aninhados são registros que contêm outros registros ou coleções.
- Eles nos permitem organizar dados complexos de forma mais estruturada.
- Podemos acessar campos de registros aninhados usando a notação de ponto múltiplas vezes.
- Registros aninhados são muito úteis quando trabalhamos com consultas SQL complexas.
- Podemos combinar registros aninhados com coleções para criar estruturas de dados ainda mais poderosas.
Registros aninhados são como super-poderes para o seu código PL/SQL. Eles permitem que você organize dados complexos de uma forma que faz sentido para o seu problema específico.
Lembre-se: a prática leva à perfeição. Tente criar seus próprios registros aninhados e veja como eles podem simplificar seu código.