有人可以帮我编写一个自定义函数来删除旧记录并同时返回总计数吗?这是我目前拥有的。删除部分工作正常,但不知何故返回计数器什么也没有。
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/