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