程序:PLS - 00103错误

时间:2014-02-14 15:24:10

标签: oracle procedure

我有一个执行从表到另一个表的事务的过程。我已经完成了代码,但它让我犯了这个错误

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_

我无法弄清楚我做错了什么!

这是我的代码:

    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;
      commit;
        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;

任何帮助将不胜感激! :)

2 个答案:

答案 0 :(得分:1)

接近代码的末尾:

select estado_pd 
from pedidos
where cod_instituicao = p_cod_instituicao;

if (estado_pd = 'Aprovado') then

缺少一个

INTO estado_pd
在你的选择陈述中

答案 1 :(得分:0)

第89行似乎是这样的:

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

elsif需要测试;不确定你是否打算在那里检查其他东西以决定是否显示该消息,或者你是否只想要一个else

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

使用更一致的缩进可能会更容易一些......

这就是您要询问的特定PLS-00103的原因,但这只是它在这种情况下报告的第一个错误 - 在进一步深入语句语法之前,似乎因为结构错误而放弃了。正如CorradoPiola所指出的那样,你在第75行的into中至少错过了一个select,并且随着编译器在每次更正后进一步发展,可能会有其他一些被逐渐发现。