如何获取自定义函数中删除的记录的总计数

时间:2011-08-08 18:27:17

标签: oracle

有人可以帮我写一个自定义功能来删除旧记录并同时返回总计数吗?这是我目前的情况。删除部分工作正常,但不知何故返回计数器都没有。

CREATE OR REPLACE FUNCTION DELETE_OLD(delete_date IN DATE) 
RETURN NUMBER IS
counter NUMBER;
BEGIN
  LOOP
    DELETE FROM MY_TEST_TABLE WHERE TEST_DATA_LOAD_DATE < delete_date AND ROWNUM   <= 100;
    counter := counter + SQL%ROWCOUNT;
COMMIT;
EXIT WHEN SQL%ROWCOUNT = 0;
  END LOOP;
  RETURN counter;

END;

这就是我在sql_plus

上调用函数的方法
SQL> VAR OUT_NUMBER
SQL> call DELETE_OLD(TO_DATE('20-05-2011', 'dd-MM-yyyy')) into :OUT_NUMBER;

当我打印OUT_NUMBER时,我什么也没看到。

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

您没有初始化COUNTER变量,因此它从NULL开始。将值添加到NULL将导致NULL,而不是值。因此,您至少需要将COUNTER初始化为0。

CREATE OR REPLACE FUNCTION DELETE_OLD(delete_date IN DATE) 
RETURN NUMBER IS
  counter NUMBER := 0;
BEGIN
  LOOP
    DELETE FROM MY_TEST_TABLE 
     WHERE TEST_DATA_LOAD_DATE < delete_date 
       AND ROWNUM   <= 100;
    counter := counter + SQL%ROWCOUNT;
    COMMIT;
    EXIT WHEN SQL%ROWCOUNT = 0;
  END LOOP;
  RETURN counter;
END;

那就是说,我会非常关注这种一般方法

  • 程序应该执行删除数据之类的操作。函数不应该修改数据,它们应该只进行计算。使用OUT参数创建过程比将其声明为函数更有意义。
  • 在这样的循环中删除数据没有多大意义。简单地执行删除所有需要删除的数据的DELETE语句会更加高效。
  • 向循环添加临时提交会降低代码速度并增加发生ORA-01555错误的可能性。很少有这样的临时提交真的有意义。

答案 1 :(得分:2)

如果要尝试添加计数器,则需要将计数器初始化为

COUNTER NUMBER :=0;

否则您尝试将rowcount添加为null。哪个永远是空的。