【发布时间】:2018-03-16 00:43:03
【问题描述】:
我有一个插入和更新表的函数。从以下位置调用它:
select AGENTS_REGISTRATION() from dual;
或:
declare
x NUMBER;
begin
select AGENTS_REGISTRATION() into x from dual;
end;
/
什么都不做。另一种形式进行了必要的更改:
declare
x NUMBER;
begin
x := AGENTS_REGISTRATION();
end;
/
前两个表达式有什么问题?
【问题讨论】:
-
“什么都不做”是什么意思?由于查询中不允许使用 DML,因此您应该得到 ORA-14551 错误。
-
我在 Oracle SQL Developer 中执行表达式,但没有得到 ORA-14551。我看到人们写了 You can't use a function that modifying data in a select statement。您可以添加您的评论作为答案吗?不知道……
-
不允许在函数内部执行 DML 操作。如果正如您所说的“它什么都不做”,那么可能存在
when others then null或其他类型的异常处理构造来抑制ORA-14551错误。 -
@NicholasKrasnov 你是对的,它有:
EXCEPTION WHEN OTHERS THEN并且 EXCEPTION 块内的错误报告也尝试写入 DB,所以我没有任何问题的迹象(( -
这就是为什么您永远不应该使用 WHEN OTHERS... 除非您确切知道自己在做什么以及后果是什么。