Procedure pl/sql

Asked

Viewed 133 times

1

Do you guys talk? Well I am new in PL/SQL and I am creating my first Precedent, because I need to load in two tables (Insert or Change), I am using Merge. But when I try to run my past I already get the following error

PLS - 000103: Symbol "BEGIN found"

create or replace procedure pr_voxis_beneficiario(
p_retorno_beneficiario out varchar2,
p_retorno_pessoa out varchar2) is

begin
merge into pessoa_fisica_acol pf
using (select p.nopessoa nom_pessoa,substr(lpad(p.nrcgc_cpf,'11','0'),1,9) cpf_num,
substr(lpad(p.nrcgc_cpf,'11','0'),10,11) cpf_dv
from pessoa p,usuario u
where p.nrregistro = u.nrregistro_usuario
and (u.dtexclusao is null or u.dtexclusao > sysdate)) p

on (pf.nom_pessoa = p.nopessoa)

when matched then
update set pf.cpf_num = p.cpf_num,
pf.cpf_dv = p.cpf_dv

when not matched then 
insert (pf.seq_pessoa_fisica,pf.nom_pessoa,pf.cpf_num,pf.cpf_dv)
values ((select max(pf.seq_pessoa_fisica) + 1 
from pessoa_fisica_acol pf),p.nom_pessoa,p.cpf_num,p.cpf_dv);

commit;
p_retorno_pessoa := 'OK';
exception when others then begin
rollback;
p_retorno_pessoa := 'Erro ao atualizar Dados.' || chr(13) || chr(10) || sqlerrm;
end;
end pr_voxis_beneficiario;

begin

merge into beneficiario_acol b
using (select '0' seq_beneficiario,'1' seq_convenio,p.dtnascimento,null dat_emissao,i.dtvalidade,
i.nrvia_cartao,'0'||u.cdareaacao||u.nrcontrato||lpad(u.nrfamilia,'6','0')||u.tpusuario NUM_CARTEIRA_BENEFICIARIO,
p.cdsexo,'' cod_plano,decode(i.dtcancelamento,'','1','0') flg_ativo,i.dtcancelamento,null seq_plano_saude,
u.nrsequencial_usuario,substr(t.txacomodacao,1,11) txacomodacao

from usuario u,
pessoa p,
usuario_identificacao i,
tipo_de_plano t

where u.nrregistro_usuario = p.nrregistro and
u.nrsequencial_usuario = i.nrsequencial_usuario and
u.tpplano = t.tpplano ) s

on (b.num_carteira_beneficiario = s.NUM_CARTEIRA_BENEFICIARIO)
when matched then
update set b.seq_beneficiario = s.seq_beneficiario,
b.seq_convenio = s.seq_convenio,
b.dat_nascimento = s.dtnascimento,
b.dat_emissao = s.dat_emissao,
b.dat_validade = s.dtvalidade,
b.num_via_carteira = s.nrvia_cartao,
b.sexo_beneficiario = s.cdsexo,
b.bkpv301#cod_plano = s.cod_plano,
b.flg_ativo = s.flg_ativo,
b.dat_cancelamento = s.dtcancelamento,
b.seq_plano_saude = s.seq_plano_saude,
b.seq_beneficiario_cliente = s.nrsequencial_usuario,
b.pdr_internacao = s.txacomodacao

when not matched then 
insert (b.seq_beneficiario,b.seq_convenio,b.dat_nascimento,
b.dat_emissao,b.dat_validade,b.num_via_carteira,b.num_carteira_beneficiario,
b.sexo_beneficiario,b.bkpv301#cod_plano,b.flg_ativo,b.dat_cancelamento,
b.seq_plano_saude,b.seq_beneficiario_cliente,b.pdr_internacao )

values (sequencial,s.seq_convenio,s.dtnascimento,s.dat_emissao,s.dtvalidade,
s.nrvia_cartao,s.NUM_CARTEIRA_BENEFICIARIO,s.cdsexo,s.cod_plano,s.flg_ativo,
s.dtcancelamento,s.seq_plano_saude,s.nrsequencial_usuario,s.txacomodacao);

commit;
p_retorno_beneficiario := 'OK';
exception when others then begin
rollback;
p_retorno_beneficiario := 'Erro ao atualizar Dados.' || chr(13) || chr(10) || sqlerrm;
end;
end pr_voxis_beneficiario;

1 answer

1

You used BEGIN twice when defining a procedure:

create or replace procedure pr_voxis_beneficiario(
    p_retorno_beneficiario out varchar2,
    p_retorno_pessoa out varchar2) 
is
begin -- aqui
    merge into pessoa_fisica_acol pf
    ...

And then:

begin

merge into beneficiario_acol b
using (select '0' seq_beneficiario,'1' seq_convenio,p.dtnascimento,null dat_emissao,i.dtvalidade,
i.nrvia_cartao,'0'||u.cdareaacao||u.nrcontrato||lpad(u.nrfamilia,'6','0')||u.tpusuario NUM_CARTEIRA_BENEFICIARIO,
p.cdsexo,'' cod_plano,decode(i.dtcancelamento,'','1','0') flg_ativo,i.dtcancelamento,null seq_plano_saude,
u.nrsequencial_usuario,substr(t.txacomodacao,1,11) txacomodacao
...

This second begin is without block. Remove it which should work.

See more here.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.