2017-10-04 66 views
1

我有一个插入并更新表的函数。Oracle:从“从双选中”调用函数不做任何操作

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; 
/

前两个表达式有什么问题?

+1

“无所事事”是什么意思?由于在查询中不允许DML,你应该得到ORA-14551错误。 –

+0

我在Oracle SQL Developer中执行表达式,但没有得到ORA-14551。我看到人们编写了*你不能使用修改** select **语句*中的数据的函数。你可以添加你的评论作为答案?不知道.... – gavenkoa

+1

不允许在函数内部执行DML操作。如果你把它放在“它什么都不做”的话,那么可能会出现“其他人无效”或其他某种类型的异常处理结构,以抑制ORA-14551错误。 –

回答

4

Oracle在查询中不允许DML操作。调用函数,在查询inserts/updates/deletes数据将提高:

ORA-14551:不能在查询内部进行DML操作

如果exception被困在函数内部查询不会引发错误 - 它是使用WHEN OTHERS异常处理程序非常危险(或直接使用pragma exception_init捕获ORA-14551),而不会重新提升错误,如您在本示例中所见。

虽然我不建议这样做,但如果函数定义为autonomous transaction(使用pragma autonomous_transaction),则可以在查询中使用DML操作 - 但这会导致更多问题。

解决方案不是在查询内部调用函数 - 这当然没有意义。