0

この関数を 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;
4

2 に答える 2

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;
于 2011-06-30T08:38:40.373 に答える
5

@schurik で説明されているように追加した後の 2 番目の問題は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その値を保持する変数です。これは、 への 4 つのインサートすべてで修正する必要がありますEvento

無関係なメモとして、次の 2 つの行を統合できます。

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;
于 2011-06-30T12:37:59.527 に答える