我可以在oracle中使用用户定义的函数删除行吗?

时间:2011-05-11 14:18:19

标签: plsql oracle9i user-defined-functions

我创建了一个用户定义的函数来删除一些数据。它不适用于删除,但适用于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

4 个答案:

答案 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更改)。