Jump to content

Recommended Posts

Posted

Boa tarde,

estou a tentar fazer um procedimento que me faça uma transação de uma certa quantidade de um armazem para uma instituição. O código está feito mas estou a receber um erro:

Error(89,59): PLS-00103: Encountered the symbol ";" when expecting one of the following:	 * & = - + < / > at in is mod remainder not rem then    <expoente (**)> <> or != or ~= >= <= <> and or like LIKE2_    LIKE4_ LIKEC_ between overlaps || multiset year DAY_ member    SUBMULTISET_

Aqui está o código:

create or replace procedure arm_inst (
p_cod_armazem_zona in varchar2,
p_cod_instituicao in varchar2)

is
qn_cg_pd number(8);
qn_cm_pd number(8);
qn_cp_pd number(8);
qn_cg_ar number(8);
qn_cm_ar number(8);
qn_cp_ar number(8);
estado_pd char (8);
begin
select estado_ped
into estado_pd
from pedidos
where cod_instituicao = p_cod_instituicao;

select quantidade_az_cg, quantidade_az_cm, quantidade_az_cp
into qn_cg_ar, qn_cm_ar, qn_cp_ar
from armazem_zona
where armazem_zona = p_cod_armazem_zona;

if (estado_pd = 'Pendente') then
 select quantidade_pedida_cg, quantidade_pedida_cm, quantidade_pedida_cp
 into qn_cg_pd, qn_cm, qn_cp
from pedidos
where cod_instituicao = p_cod_instituicao;

 if(qn_cg_pd <= qn_cg_ar) then -- verifica quantidade cabazes grandes
  update pedidos
  set estado_ped = 'Aprovado' --se e verdadeira da aprovado
  where cod_instituicao = p_cod_instituicao;

  update armazem_zona -- faz update da tabela armazem com as
  set qn_cg_ar = qn_cg_ar - qn_cg_pd -- quantidades
  where cod_armazem_zona = p_cod_armazem_zona;
 else if(qn_cg_pd > qn_cg_ar)then -- se nao for verdadeira da recusado
  update pedidos
  set estado_pd = 'Recusado'
  where cod_instituicao = p_cod_instituicao;
   end if;
 end if;
 if(qn_cm_pd <= qn_cm_ar)then --verifica quantidade cabazes medias
  update pedidos
  set estado_pd = 'Aprovado'
  where cod_instituicao = p_cod_instituicao;

  update armazem_zona
  set qn_cm_ar = qn_cm_ar - qn_cm_pd
  where cod_armazem_zona = p_cod_armazem_zona;

 else if(qn_cm_pd > qn_cm_ar)then-- condicao é falsa
  update pedidos
  set estado_pd = 'Recusado'
  where cod_instituicao = p_cod_instituicao;
   end if;
 end if;
 if(qn_cp_pd <= qn_cp_ar) then
  update pedidos
  set estado_pd = 'Aprovado'
  where cod_instituicao = p_cod_instituicao;

  update armazem_zona
  set qn_cp_ar = qn_cp_ar - qn_cp_pd
  where cod_armazem_zona = p_cod_armazem_zona;
 else if(qn_cp_pd > qn_cp_ar) then
  update pedidos
  set estado_pd = 'Recusado'
  where cod_instituicao = p_cod_instituicao;
 end if;
   end if;

 select estado_pd
 from pedidos
 where cod_instituicao = p_cod_instituicao;
 if (estado_pd = 'Aprovado') then
  update pedidos
  set estado_pd = 'Aprovado'
  where cod_instituicao = p_cod_instituicao;
 else if (estado_pf != 'Aprovado') then
  update pedidos
  set estado_pd = 'Reprovado'
  where cod_instituicao = p_cod_instituicao;
   end if;
   end if;

 elsif (dbms_output.put_line('O pedido já foi avaliado'));
 end if;
commit;
end;

O que faço para corrigir?

  • 4 weeks later...
Posted

Boa noite.

Existem aí algumas coisas erradas.

1 - Usa end if apenas para fechar um if, e não para fechar cada if e else if. Tens aí end if's a mais. Tu estás afazer algo do tipo:

if(c) { qq coisa }
else if(c) { outra coisa }
else { cena }
end if;
end if;
end if;

quando ocorreto seria usar apenas UM end if.

2 - Em PL/SQL o operador booleano de diferente não se representa por !=, mas sim por <>

3 - A tua quarta linha a contar do fim será else (dbms_output.put_line('O pedido já foi avaliado'));

Espero ter ajudado,

Cumprimentos

  • Vote 1

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.