PL/SQL 异常翻译

Posted

技术标签:

【中文标题】PL/SQL 异常翻译【英文标题】:PL/SQL Exception Translation 【发布时间】:2011-09-26 18:36:09 【问题描述】:

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

    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

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

【问题讨论】:

错误消息提到了EXCEPTION,你清理了你的代码,删除了EXCEPTION,可能还有它周围的上下文。当您删除收到投诉的代码块时,我们应该如何提供帮助? @Shannon Severance 对此很抱歉,但我真正想要的是有人向我解释这个例外。与代码无关,因此得名“异常翻译” 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

您的函数没有返回值。我认为您想将其设为 PROCEDURE(并添加一些分号、“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;

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

希望对你有帮助

【讨论】:

是的,抱歉,它最终会返回一个值,但我并没有真正包含该部分。基本上最后如果它抛出一个异常然后返回一个我没有包含的负数,但是这个异常是什么意思? 您在函数声明中缺少关键字。你能发布实际的语法吗?

以上是关于PL/SQL 异常翻译的主要内容,如果未能解决你的问题,请参考以下文章

将 PL/SQL ETL 流程翻译成 HiveQL

PL/SQL 引发处理异常

PL/SQL 异常不会引发

PL/SQL:捕获编号异常?

PL/SQL 异常以啥顺序引发?

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器