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 异常翻译的主要内容,如果未能解决你的问题,请参考以下文章