PL/SQL – Utilizando ROWTYPE – Parte II
Observando meus artigos antigos, percebi que esqueci de escrever a continuação do artigo sobre ROWTYPE. Lembro que eu ia demonstrar um exemplo utilizando funções. Bom, vamos lá. Antes tarde do que nunca ! 🙂
Vamos criar uma FUNCTION que retornará um ROWTYPE, mas primeiro vamos criar nossa massa de dados:
CREATE TABLE empresa
(
codigo NUMBER
,nome VARCHAR2(2000)
)
/
Table EMPRESA criado.
INSERT INTO empresa VALUES(1,'EMPRESA 1')
/
1 linha inserido.
INSERT INTO empresa VALUES(2,'EMPRESA 2')
/
1 linha inserido.
Agora vamos criar nossa FUNCTION:
CREATE OR REPLACE FUNCTION fnc_retorna_empresa
RETURN empresa%ROWTYPE
IS
v_retorno empresa%ROWTYPE;
BEGIN
BEGIN
SELECT a.*
INTO v_retorno
FROM empresa a
WHERE a.codigo = (
SELECT MAX(b.codigo)
FROM empresa b
);
EXCEPTION
WHEN others THEN
DBMS_OUTPUT.put_line('[ ERRO ] ' || DBMS_UTILITY.format_error_stack);
END;
v_retorno.codigo := v_retorno.codigo + 1;
v_retorno.nome := REPLACE(v_retorno.nome,v_retorno.codigo -1, v_retorno.codigo);
RETURN (v_retorno);
END fnc_retorna_empresa;
Function FNC_RETORNA_EMPRESA compilado
Vamos testar:
DECLARE
v_retorno empresa%ROWTYPE;
BEGIN
v_retorno := FNC_RETORNA_EMPRESA;
DBMS_OUTPUT.put_line('Codigo: ' || v_retorno.codigo);
DBMS_OUTPUT.put_line('Nome: ' || v_retorno.nome);
END;
Procedimento PL/SQL concluído com sucesso.
Codigo: 3
Nome: EMPRESA 3
Vamos incrementar esse teste:
DECLARE
v_retorno empresa%ROWTYPE;
BEGIN
v_retorno := FNC_RETORNA_EMPRESA;
DBMS_OUTPUT.put_line('Codigo: ' || v_retorno.codigo);
DBMS_OUTPUT.put_line('Nome: ' || v_retorno.nome);
INSERT INTO empresa VALUES v_retorno;
DBMS_OUTPUT.put_line('Codigo: ' || v_retorno.codigo);
DBMS_OUTPUT.put_line('Nome: ' || v_retorno.nome);
END;
Procedimento PL/SQL concluído com sucesso.
Codigo: 3
Nome: EMPRESA 3
Codigo: 4
Nome: EMPRESA 4
Vamos mudar novamente:
DECLARE
v_retorno empresa%ROWTYPE;
BEGIN
DBMS_OUTPUT.put_line('Codigo: ' || FNC_RETORNA_EMPRESA().codigo);
DBMS_OUTPUT.put_line('Nome: ' || FNC_RETORNA_EMPRESA().nome);
INSERT INTO empresa VALUES (v_retorno.codigo, v_retorno.nome);
COMMIT;
DBMS_OUTPUT.put_line('Codigo: ' || FNC_RETORNA_EMPRESA().codigo);
DBMS_OUTPUT.put_line('Nome: ' || FNC_RETORNA_EMPRESA().nome);
v_retorno := FNC_RETORNA_EMPRESA;
INSERT INTO empresa VALUES v_retorno;
DBMS_OUTPUT.put_line('Codigo: ' || v_retorno.codigo);
DBMS_OUTPUT.put_line('Nome: ' || v_retoro.nome);
COMMIT;
END;
Procedimento PL/SQL concluído com sucesso.p
Codigo: 4
Nome: EMPRESA 4
Codigo: 5
Nome: EMPRESA 5
Codigo: 6
Nome: EMPRESA 6
Como percebem, é possível referenciar apenas o atributo da tabela se for preciso, tanto através da chamada da função (FNC_RETORNA_EMPRESA().codigo) quanto pela variável que recebeu o retorno (v_retorno.codigo).
São várias as possibilidades de utilização, agora o resto eu deixo com vocês. 🙂
Um grande abraço