我有一个像这样的简单光标:
CURSOR emp_cur
IS
SELECT *
FROM employee
WHERE age > 20;
在我的程序中,我只想在光标中有员工的情况下做一些预操作。在那个预先行动之后,我处理所有行。
我需要这个,因为只有当游标中存在员工时我需要清理一些表格,否则我应该"返回"。
所以代码可以是:
OPEN emp_cur;
/* Here i need to do pre-action only if emp_cur has rows*/
IF /* has rows*/
THEN
/* do some actions*/
END IF;
LOOP
FETCH emp_cur INTO emp_rec;
EXIT WHEN emp_cur%NOTFOUND;
END LOOP;
CLOSE emp_cur;
现在,我有一个"脏"我打开游标的解决方案:
答案 0 :(得分:3)
首先检查是否有行
在 FETCH 之前,您无法了解行。
来自文档link,
在游标或游标变量打开之后但在第一个之前 fetch,%FOUND返回NULL。在任何提取之后,如果是,则返回TRUE last fetch返回一行,如果最后一次获取没有返回a,则返回FALSE 行。
获取行后,在处理行之前,您可以使用%FOUND 。
例如,
OPEN c1;
LOOP
FETCH c1 INTO my_ename, my_salary;
IF c1%FOUND THEN -- fetch succeeded
-- Do something
ELSE -- fetch failed, so exit loop
EXIT;
END IF;
END LOOP;
答案 1 :(得分:1)
稍微思考一下我写了这个程序,避免循环中的IF。我知道,有点“奇怪”但是我认为唯一有用的东西:
OPEN emp_cur;
FECTH emp_cur INTO emp_rec;
IF emp_cur%FOUND
THEN
-- pre actions
END IF;
LOOP
EXIT WHEN emp_cur%NOTFOUND;
-- do something in the loop
FECTH emp_cur INTO emp_rec; -- First fetch was done before the if
END LOOP;
CLOSE emp_cur;