GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Utilizando ROWTYPE – Parte I

A PL/SQL é uma linguagem que como qualquer outra, possui boas e más práticas de programação. Existem vários caminhos para se chegar ao mesmo resultado, mas existem maneiras mais inteligentes para se alcançar isso.

Um exemplo é o uso de variáveis do tipo ROWTYPE. Com essa abordagem, é possível construir um código mais limpo e organizado. Vamos aos exemplos:

Vamos criar uma tabela chamada EMPRESA_TESTE

CREATE TABLE EMPRESA_TESTE (
CODIGO NUMBER(02) NOT NULL,
NOME  VARCHAR2(2000),
NOME_FANTASIA VARCHAR2(2000),
CNPJ  VARCHAR2(100)
)
/

Não vou criar PK, sequences ou qualquer outro tipo de objeto. Não serão necessários para a demonstração a seguir.

O objetivo será a criação de um bloco onde deveremos inserir informações dentro da tabela EMPRESA_TESTE

Primeiramente irei replicar um código que os Analistas e DBAs mais experientes com certeza já encontraram, e certamente ainda encontram na programação PL/SQL nesse mundo afora.

DECLARE
v_codigo        NUMBER;
v_nome          VARCHAR2(2000);
v_nome_fantasia VARCHAR2(2000);
v_cnpj          VARCHAR2(100);

BEGIN
v_codigo        := '1';
v_nome          := 'GPO';
v_nome_fantasia := 'GPO (GRUPO DE PROFISSIONAIS ORACLE)';
v_cnpj          := '99999999999999';

INSERT INTO empresa_teste VALUES
(
v_codigo,
v_nome,
v_nome_fantasia,
v_cnpj
);

END;
/

COMMIT
/

SELECT * FROM empresa_teste
/

CODIGO NOME            NOME_FANTASIA                      CNPJ
------ --------------- ---------------------------------- ----------------
1      GPO             GPO(GRUPO DE PROFISSIONAIS ORACLE) 99999999999999

Simples não ? Acreditem ou não ainda está mais caprichado do que existe por aí. Agora imagine se tivermos 50 campos para serem inseridos na tabela !

Mesmo assim, vamos dar uma melhorada nisso…delete o registro e execute o script abaixo:

DECLARE
v_codigo        empresa_teste.codigo%TYPE;
v_nome          empresa_teste.nome%TYPE;
v_nome_fantasia empresa_teste.nome_fantasia%TYPE;
v_cnpj          empresa_teste.cnpj%TYPE;

BEGIN
v_codigo        := '1';
v_nome          := 'GPO';
v_nome_fantasia := 'GPO (GRUPO DE PROFISSIONAIS ORACLE)';
v_cnpj          := '99999999999999';

INSERT INTO empresa_teste VALUES
(
v_codigo,
v_nome,
v_nome_fantasia,
v_cnpj
);

END;
/

COMMIT
/

SELECT * FROM empresa_teste
/

CODIGO NOME            NOME_FANTASIA                      CNPJ
------ --------------- ---------------------------------- ----------------
1      GPO             GPO(GRUPO DE PROFISSIONAIS ORACLE) 99999999999999

No exemplo acima utilizamos TYPE para definir os tipos de dados de cada variável. Assim temos a garantia de que as variáveis terão os mesmos tipos que os campos correspondentes na tabela. Só que acaba recorrendo no mesmo problema do primeiro exemplo.

Acaba por aqui ? A resposta é não ! Tentemos de outra maneira…

DECLARE
v_empTeste      empresa_teste%ROWTYPE;

BEGIN
v_empTeste.codigo        := '1';
v_empTeste.nome          := 'GPO';
v_empTeste.nome_fantasia := 'GPO (GRUPO DE PROFISSIONAIS ORACLE)';
v_empTeste.cnpj          := '99999999999999';

INSERT INTO empresa_teste VALUES v_empTeste;

END;
/

COMMIT
/

SELECT * FROM empresa_teste
/

CODIGO NOME            NOME_FANTASIA                      CNPJ
------ --------------- ---------------------------------- ----------------
1      GPO             GPO(GRUPO DE PROFISSIONAIS ORACLE) 99999999999999

Nesse exemplo utilizamos o ROWTYPE para criar uma variável com a mesma estrutura da tabela. Ao preenchermos os respectivos valores em seus campos, podemos fazer a inserção com o conteúdo da variável.
Existem diversas vantagens nesse tipo de abordagem. Garantia de integridade da informação a ser inserida, padronização das inserções e código limpo e de fácil entendimento.

Três maneiras de se chegar ao mesmo resultado. Só que muitas vezes, a maneira como se chega ao objetivo, conta tanto quanto o resultado final.

No próximo post falarei mais um pouco sobre ROWTYPE e seu uso em FUNCTIONS.

Abraço

Share

You may also like...

Deixe um comentário

O seu endereço de e-mail não será publicado.