Oracle:异常和错误

hau*_*d85 0 oracle plsql exception-handling pls-00103

我已经在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
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)

sch*_*rik 5

你错过了另一个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;
Run Code Online (Sandbox Code Playgroud)


Dav*_*sta 5

在添加END IF@schurik描述的第二个问题之后,您在插入中混合了一个带有变量名的列名:

    insert into Evento (Nome, Giorno, Mese, Anno, IdPeriodo)
        values (NomeEvento2, g2, m2, a2, IdPeriodo);
Run Code Online (Sandbox Code Playgroud)

应该

    insert into Evento (Nome, Giorno, Mese, Anno, IdPeriodo)
        values (NomeEvento2, g2, m2, a2, id_Periodo);
Run Code Online (Sandbox Code Playgroud)

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

在不相关的说明中,您可以合并这两行:

insert into Periodo (Nome) values (NomePeriodo);

select Id into id_Periodo from Periodo where Nome=NomePeriodo;
Run Code Online (Sandbox Code Playgroud)

成:

insert into Periodo (Nome) values (NomePeriodo) returning Id into id_Periodo;
Run Code Online (Sandbox Code Playgroud)