2011-06-30 54 views
0

我已經在SQL中編寫了這個函數,我不知道爲什麼,但它一直在異常部分返回一個錯誤。我檢查了語法,得到了記錄,但我沒有運氣,有誰會請幫忙嗎?Oracle:異常和錯誤


返回錯誤:

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; 
+0

你應該有,直到最後一個的ELSIF(不是 「否則,如果」)。 if()then ... elsif()then ... else()end if; – tbone

回答

5

你的第二個問題,通過@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; 
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; 
+0

嗯,我已經試過了,但它返回了我:'在第66行PL/SQL錯誤:SQL語句被忽略。' – haunted85

+1

@ haunted85:這是下一個錯誤,請檢查第66行的SQL-Statment可以執行它在sqlplus中隔離? – schurik

+0

@ haunted85我希望你沒有剪切和粘貼schurik'scode。他插入simbol'^^^^^^'讓你明白他在哪裏插入'end if'。 很明顯,simbol'^'不是一個有效的字符,既不是'有效'的詞法單位! 1 http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17126/fundamentals.htm#CIHEGGJG 2 http://download.oracle.com/docs/cd/E11882_01/appdev.112 /e17126/fundamentals.htm#CIHJCJAD – zep