PL / SQL异常翻译

时间:2011-09-26 18:36:10

标签: oracle plsql procedure ora-06553

我在数据库表中插入一个新对象,但我一直在检索一个说明的异常....

    ERROR:insertproperty:ORA-06553: PLS-103: Encountered the symbol "EXCEPTION" when expecting one of the following:

   begin case declare exit for function goto if loop mod null
   package pragma procedure raise return select separate type
   update while with <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> <<
   form table call close current define delete fetch lock insert
   open rollback savepoint set sql execute commit forall merge
ORA-06553: PLS-103: Encountered the symbol "EXCEPTION" when expec

但我所做的只是简单插入......

function insert(...)
begin
    begin 
     select table_seq.nextval
     into nextval 
     from dual

     begin
     insert into table(id, ....)
     values(nextval,....)
     end 
    end
end

这些点都是可选的,所以并不是真的需要。

2 个答案:

答案 0 :(得分:3)

该错误表示EXCEPTION关键字附近存在语法问题。但是您的代码大纲并未表明您的任何块都有异常部分。这使我们很难提供很多帮助。

在评论中,您似乎表明大纲中至少有一个块有一个例外部分。你可以发布实际的代码(或者至少是一个更详细的大纲,包括产生错误的异常块的语法)?

此外,在评论中,听起来你的函数中有一个RETURN语句,它返回某种状态代码。使用函数的返回代码几乎总是错误的 - 简单地抛出异常(甚至更好,允许生成的异常传播)更加健壮。在PL / SQL中编写一个执行DML的函数通常是一个错误 - 如果你正在做DML,你几乎总是希望在一个过程中完成。

答案 1 :(得分:0)

您的函数未返回值。我想你想把它作为一个程序(并添加一些分号,一个“AS”关键字等。):

CREATE OR REPLACE
PROCEDURE insert_proc(...)
AS
BEGIN
   begin 
      select table_seq.nextval
        into nextval 
        from dual;

      begin
         insert into table(id, ....)
         values(nextval,....);
      end;
   end;
END insert_proc;

如果您使用的是Oracle 11g,则可以省略对DUAL表的调用:

CREATE OR REPLACE
PROCEDURE insert_proc(...)
AS
BEGIN
   insert into table(id, ....)
   values(nextvatable_seq.nextval,....);
END insert_proc;

N.B。您应该添加一个例外部分来处理可能发生的任何常见异常,例如:约束违规等。

希望有所帮助