-2

我在我的数据库表中插入一个新对象,但我继续检索一个异常状态......

    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

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

4

2 回答 2

3

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

在评论中,您似乎表明大纲中的至少一个块具有异常部分。你能发布实际的代码(或者至少一个更详细的大纲,其中包括生成错误的任何异常块的语法)?

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

于 2011-09-26T19:29:37.280 回答
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;

注意您应该添加一个异常部分来处理可能发生的任何常见异常,例如违反约束等。

希望能帮助到你

于 2011-09-26T19:21:03.843 回答