【问题标题】:Oracle: exception and errorOracle:异常和错误
【发布时间】:2011-06-30 07:58:10
【问题描述】:

我已经在 SQL 中编写了这个函数,但我不知道为什么,但它一直在异常部分返回错误。我已经检查了语法,得到了记录,但我没有运气,有人可以帮忙吗?


返回错误:

Error on line 83: PLS-00103: Found symbol "EXCEPTION" instead one of the following:
    begin case declare end exit for goto if loop mod null pragma raise return select update while with
    <<
    close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe

create or replace function InsertPeriodoEvento
    (NomePeriodo in varchar,
    aInizio in integer,
    aFine in integer,
    NomeEvento1 in varchar,
    g1 in integer,
    m1 in integer,
    a1 in integer,
    NomeEvento2 in varchar,
    g2 in integer,
    m2 in integer,
    a2 in integer)
return integer is

id_Periodo number;

begin
savepoint prima_di_tutto;

insert into Periodo (Nome) values (NomePeriodo);

select Id into id_Periodo from Periodo where Nome=NomePeriodo;


if NomeEvento2 is null then
    begin
        insert into Evento (Nome, Giorno, Mese, Anno, IdPeriodo)
            values (NomeEvento1, g1, m2, a2, IdPeriodo);

        update Periodo set
            AnnoFine = aFine,
            IdEventoInizio = (select Id from Evento where Nome = NomeEvento1)
            where Periodo.Id = id_Periodo;
    end;
else
    if NomeEvento1 is null then
    begin

        insert into Evento (Nome, Giorno, Mese, Anno, IdPeriodo)
            values (NomeEvento2, g2, m2, a2, IdPeriodo);

        update Periodo set
            AnnoInizio = aInizio,
            IdEventoFine = (select Id from Evento where Nome = NomeEvento2)
            where Periodo.Id = id_Periodo;
    end;
else
    begin
        insert into Evento (Nome, Giorno, Mese, Anno, IdPeriodo)
            values (NomeEvento1, g1, m2, a2, IdPeriodo);


        insert into Evento (Nome, Giorno, Mese, Anno, IdPeriodo)
            values (NomeEvento2, g2, m2, a2, IdPeriodo);


        update Periodo set
            IdEventoInizio = (select Id from Evento where Nome = NomeEvento1),
            IdEventoFine = (select Id from Evento where Nome = NomeEvento2)
            where Periodo.Id = id_Periodo;
    end;
end if;

commit;


return 1;


EXCEPTION
when OTHERS then
    rollback to prima_di_tutto;
    return 0;

 end InsertPeriodoEvento;

【问题讨论】:

  • 你应该有一个 elsif(不是“else if”),直到最后一个。 if() then ... elsif() then ... else() end if;

标签: oracle exception-handling plsql pls-00103


【解决方案1】:

在添加@schurik 所述的END IF 之后,您的第二个问题是您在插入时将列名与变量名混淆了:

    insert into Evento (Nome, Giorno, Mese, Anno, IdPeriodo)
        values (NomeEvento2, g2, m2, a2, IdPeriodo);

应该是

    insert into Evento (Nome, Giorno, Mese, Anno, IdPeriodo)
        values (NomeEvento2, g2, m2, a2, id_Periodo);

IdPeriodo 是表中的一列。 id_Periodo 是保存其值的变量。这需要在所有四个插入到Evento 中修复。

在不相关的注释上,您可以合并这两行:

insert into Periodo (Nome) values (NomePeriodo);

select Id into id_Periodo from Periodo where Nome=NomePeriodo;

进入:

insert into Periodo (Nome) values (NomePeriodo) returning Id into id_Periodo;

【讨论】:

    【解决方案2】:

    你又错过了一个END IF

                update Periodo set
                    IdEventoInizio = (select Id from Evento where Nome = NomeEvento1),
                    IdEventoFine = (select Id from Evento where Nome = NomeEvento2)
                    where Periodo.Id = id_Periodo;
            end;
          end if;
    --   ^^^^^^^
        end if;
    
    
        commit;
    
    
        return 1;
    
    
        EXCEPTION
        when OTHERS then
            rollback to prima_di_tutto;
            return 0;
    
         end InsertPeriodoEvento;
    

    【讨论】:

    • 好吧,我已经尝试过了,但它返回给我:Error on line 66 PL/SQL: SQL Statement ignored.
    • @haunted85:这是下一个错误,请检查第 66 行的 SQL 语句,您可以在 sqlplus 中隔离执行吗?
    • @haunted85 我希望你没有剪切和粘贴 schurik 的代码。他插入了 simbol'^^^^^^' 让您了解他在哪里插入了 'end if'。显然,simbol'^' 不是一个有效的字符,也不是一个“有效的”词汇单元! 1 download.oracle.com/docs/cd/E11882_01/appdev.112/e17126/… 2 download.oracle.com/docs/cd/E11882_01/appdev.112/e17126/…
    • 你为什么编辑你的代码并评论了'^^^^^^^',却没有在你的修改上贴上注释?
    • @zep:感谢您对 ^^^^^^ 的评论,编辑了我的答案并评论了这一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2021-08-15
    • 2014-04-06
    • 2015-03-28
    相关资源
    最近更新 更多