Os Registros Definidos pelo Usuário são uma característica fundamental do PL/SQL Oracle, oferecendo aos desenvolvedores a capacidade de criar estruturas de dados personalizadas e eficientes. Este artigo técnico explora em profundidade o conceito, implementação e melhores práticas para utilização de registros definidos pelo usuário, fornecendo insights valiosos para otimização de código e gerenciamento de dados complexos em aplicações Oracle.
O que são Registros Definidos pelo Usuário?
Registros Definidos pelo Usuário em PL/SQL Oracle são estruturas de dados compostas que permitem agrupar elementos de diferentes tipos de dados sob um único nome. Essas estruturas oferecem uma forma eficaz de organizar informações relacionadas, melhorando a legibilidade do código e facilitando a manipulação de dados complexos.
Principais características:
- Agrupamento lógico de dados relacionados
- Suporte a diferentes tipos de dados em uma única estrutura
- Flexibilidade na definição de campos personalizados
- Melhoria na organização e manutenção do código
Como Criar um Registro Definido pelo Usuário
Vamos ver como fazer isso passo a passo:
- Primeiro, definimos o tipo do registro:
1 2 3 4 5 6 7 |
TYPE nome_tipo_registro IS RECORD ( campo1 tipo_dado1 [NOT NULL] [:= valor_padrao], campo2 tipo_dado2 [NOT NULL] [:= valor_padrao], ... campoN tipo_dadoN [NOT NULL] [:= valor_padrao] ); |
- Depois, declaramos uma variável usando esse tipo:
1 |
nome_variavel nome_tipo_registro; |
Vamos ver um exemplo prático:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
DECLARE -- Definindo o tipo do registro TYPE info_convidado IS RECORD ( nome VARCHAR2(50), idade NUMBER, comida_favorita VARCHAR2(30) := 'Pizza' ); -- Declarando uma variável do tipo registro convidado info_convidado; BEGIN -- Atribuindo valores aos campos do registro convidado.nome := 'João'; convidado.idade := 25; -- Imprimindo os valores DBMS_OUTPUT.PUT_LINE('Nome: ' || convidado.nome); DBMS_OUTPUT.PUT_LINE('Idade: ' || convidado.idade); DBMS_OUTPUT.PUT_LINE('Comida favorita: ' || convidado.comida_favorita); END; / |
Neste exemplo, criamos um registro chamado info_convidado
com três campos: nome, idade e comida_favorita. Note que demos um valor padrão para comida_favorita. Depois, declaramos uma variável chamada convidado
desse tipo e atribuímos valores a ela.
Usando NOT NULL em Campos de Registro
Às vezes, queremos garantir que um campo sempre tenha um valor. É aí que entra o NOT NULL
. Mas cuidado! Se você usar NOT NULL
, precisa dar um valor padrão para o campo ou inicializá-lo antes de usar o registro.
Veja este exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
DECLARE TYPE info_produto IS RECORD ( id NUMBER, nome VARCHAR2(50) NOT NULL := 'Produto sem nome', preco NUMBER(10,2) NOT NULL ); produto info_produto; BEGIN produto.id := 1; produto.preco := 19.99; DBMS_OUTPUT.PUT_LINE('ID: ' || produto.id); DBMS_OUTPUT.PUT_LINE('Nome: ' || produto.nome); DBMS_OUTPUT.PUT_LINE('Preço: R$' || TO_CHAR(produto.preco, '99999.99')); END; / |
Neste caso, nome
e preco
são NOT NULL
. Demos um valor padrão para nome
, mas preco
precisa ser inicializado antes de usarmos o registro.
Expressões Qualificadas com Registros
Existe uma forma mais elegante de atribuir valores a todos os campos de um registro de uma vez só. São as expressões qualificadas. É como preencher toda a caixa de uma vez, em vez de colocar um item de cada vez.
Veja como fica:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
DECLARE TYPE info_livro IS RECORD ( titulo VARCHAR2(100), autor VARCHAR2(50), ano_publicacao NUMBER ); meu_livro info_livro; BEGIN -- Usando expressão qualificada meu_livro := info_livro('O Senhor dos Anéis', 'J.R.R. Tolkien', 1954); DBMS_OUTPUT.PUT_LINE('Título: ' || meu_livro.titulo); DBMS_OUTPUT.PUT_LINE('Autor: ' || meu_livro.autor); DBMS_OUTPUT.PUT_LINE('Ano: ' || meu_livro.ano_publicacao); END; / |
Não é mais fácil? Com uma única linha, preenchemos todos os campos do registro!
Compatibilidade entre Registros
Agora, vem uma parte importante: nem todos os registros são iguais aos olhos do PL/SQL, mesmo que pareçam idênticos para nós.
Dois registros só são considerados do mesmo tipo se forem declarados usando exatamente o mesmo tipo de registro. 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 |
DECLARE TYPE pessoa_tipo1 IS RECORD ( nome VARCHAR2(50), idade NUMBER ); TYPE pessoa_tipo2 IS RECORD ( nome VARCHAR2(50), idade NUMBER ); pessoa1 pessoa_tipo1; pessoa2 pessoa_tipo2; BEGIN pessoa1 := pessoa_tipo1('Maria', 30); -- pessoa2 := pessoa1; -- Isso causaria um erro! -- Forma correta de copiar os valores pessoa2.nome := pessoa1.nome; pessoa2.idade := pessoa1.idade; DBMS_OUTPUT.PUT_LINE('Pessoa 2 - Nome: ' || pessoa2.nome || ', Idade: ' || pessoa2.idade); END; / |
Mesmo que pessoa_tipo1
e pessoa_tipo2
pareçam iguais, o PL/SQL os trata como tipos diferentes. Por isso, não podemos atribuir diretamente pessoa1
a pessoa2
.
Conclusão
Ufa! Chegamos ao fim da nossa aula sobre registros definidos pelo usuário em PL/SQL Oracle. Vamos recapitular o que aprendemos:
- Registros são como caixas personalizadas para agrupar dados relacionados.
- Podemos criar nossos próprios tipos de registro.
- Campos podem ser marcados como
NOT NULL
, mas precisam ser inicializados. - Expressões qualificadas nos permitem preencher todos os campos de uma vez.
- Dois registros só são compatíveis se forem do mesmo tipo exato.
Registros definidos pelo usuário são ferramentas poderosas que podem tornar seu código mais organizado e fácil de entender. Com prática, você vai descobrir muitas maneiras criativas de usá-los em seus programas PL/SQL.