我创建了一个用户定义的函数来删除一些数据。它不适用于删除,但适用于select。我是Oracle 9i。
这个功能是这样的:
create or replace function UFN_PURGEDATA(INPUTID IN VarChar2) return number is
Result number;
begin
Result := 0;
DELETE FROM MyTable WHERE MyTable.ID=INPID;
COMMIT;
Result := 1;
EXCEPTION WHEN OTHERS THEN
return(Result);
end UFN_PURGEDATA;
然后我使用select UFN_PURGEDATA('test') from dual
来运行它,但得到结果0
。
答案 0 :(得分:1)
你的问题的答案是“不”。
如果您删除错误“处理”,您会发现删除失败,例外情况如下:
ORA-14551:无法执行DML 查询中的操作
即。您无法在SELECT语句中调用的函数中执行插入,更新或删除。
要在IDE或SQL Plus中执行此功能,请将其包装在更多PL / SQL中,如下所示:
declare
l_result number;
begin
l_result := my_function(123);
end;
但是,您需要先向函数添加RETURN语句,否则会失败。
(NB我在引号中说“处理”因为它实际上是“处理不当” - 它以一种非常无益的方式完全掩盖了实际问题。)
答案 1 :(得分:1)
如果添加PRAGMA AUTONOMOUS_TRANSACTION,则可以在SELECT中使用的函数内执行DML。例如:
create or replace function UFN_PURGEDATA(INPUTID IN VarChar2) return number is
pragma autonomous_transaction;
begin
DELETE FROM MyTable WHERE MyTable.ID=INPUTID;
COMMIT;
return 1;
EXCEPTION WHEN OTHERS THEN
return 0;
end UFN_PURGEDATA;
/
但是如果可能的话,你肯定想避免这种方法。通常,如果函数在SELECT中使用,则无法知道函数执行的次数。
答案 2 :(得分:0)
是的,您可以使用Oracle中的用户定义函数删除行,但不能从SELECT语句中删除。
您的代码存在一些问题:
- 如果您的函数没有引发异常,则不返回值
- 您不能在SELECT语句中使用执行DML的函数;如果删除异常块,则会得到ORA-14551
答案 3 :(得分:0)
为什么不用OUT参数返回数字来创建一个过程(而不是函数)?如果不执行自治事务处理技巧,Oracle不希望您运行具有“副作用”的函数(用于选择)(可理解为什么我们不希望select导致DML更改)。