我有一个执行从表到另一个表的事务的过程。我已经完成了代码,但它让我犯了这个错误
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;
任何帮助将不胜感激! :)
答案 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
,并且随着编译器在每次更正后进一步发展,可能会有其他一些被逐渐发现。