有人可以帮我写一个自定义功能来删除旧记录并同时返回总计数吗?这是我目前的情况。删除部分工作正常,但不知何故返回计数器都没有。
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时,我什么也没看到。
感谢您的帮助!
答案 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;
那就是说,我会非常关注这种一般方法
答案 1 :(得分:2)
如果要尝试添加计数器,则需要将计数器初始化为
COUNTER NUMBER :=0;
否则您尝试将rowcount添加为null。哪个永远是空的。