2014-02-14 2 views
0

У меня есть процедура, которая выполняет транзакцию из таблицы в другую. Я уже сделал код, но он получает мне эту ошибкуПроцедура: PLS - 00103 ошибка

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; 

Любая помощь будет оценен по достоинству! :)

ответ

1

В конце коды:

select estado_pd 
from pedidos 
where cod_instituicao = p_cod_instituicao; 

if (estado_pd = 'Aprovado') then 

Это отсутствует в

INTO estado_pd 

в вашем отборном заявлении.

+0

В этом случае я хочу проверить, если последний estado_pd = 'Aprovado' или 'Reprovado', поэтому я могу обновить таблицу с результатом. Это была ошибка? – rcrd18

+0

Вы должны добавить предложение INTO после инструкции SELECT и перед предложением FROM. –

+0

Кроме того, у вас есть другие ошибки, о чем говорили Алекс Пул и OracleUser. –

0

Line 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, о котором вы спрашиваете, но это только первая ошибка, которую он сообщает в этом случае - кажется, что он отказывается из-за структурных ошибок, прежде чем копаться дальше в синтаксисе оператора , Как заметил КоррадоПиола, вы, по крайней мере, пропустили into в select по строке 75, и могут быть другие, которые постепенно раскрываются, когда компилятор получает после каждой коррекции.

+0

Я посмотрю! Спасибо! – rcrd18

Смежные вопросы