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

标签 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;

结束;

这就是我在 sql_plus 上调用函数的方式

SQL> VAR OUT_NUMBER
SQL> call DELETE_OLD(TO_DATE('20-05-2011', 'dd-MM-yyyy')) into :OUT_NUMBER;

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

感谢您的帮助!

最佳答案

您没有初始化 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 错误的可能性。在极少数情况下,像这样的临时提交确实有意义。

关于oracle - 如何获取自定义函数中删除的记录的总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6986756/

相关文章:

sql - 如何从 3 个不同的表中集体选择 100 行?

sql - 自动填充 "time_hour"表

sql - 查找任何值出现在另一列中的情况

Oracle:将 varchar2 字段中的 xml 实体转换为 utf-8 字符

linux - Oracle 在没有任何进程的情况下使用内存

oracle - 在 Ubuntu 12.04.1 LTS 上安装 Oracle Database 11g Express Edition

oracle - Oracle 是否有任何内置的哈希函数?

oracle - oracle表中自动填充日期

sql - 如何在 Oracle SQL 中用 JOIN 替换 IN 子句?

oracle 集合没有足够的值