PL/SQL - 找到光标时的预操作
PL/SQL - Pre actions if cursor is found
我有一个像这样的简单游标:
CURSOR emp_cur
IS
SELECT *
FROM employee
WHERE age > 20;
在我的程序中,我只想在光标中有员工时做一些预操作。在该预操作之后,我处理所有行。
我需要这个,因为只有当那个游标中存在员工时我才需要清理一些表,否则我应该 "RETURN".
所以代码可以是:
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;
现在,我有一个 "dirty" 解决方案,我在其中打开光标:
- 首先检查是否有行
- 进行预操作并关闭
- Open/fetch 再次处理行,然后再次关闭
First to check if there are rows
在 FETCH 之前,您无法了解这些行。
来自文档 link ,
After a cursor or cursor variable is opened but before the first
fetch, %FOUND returns NULL. After any fetches, it returns TRUE if the
last fetch returned a row, or FALSE if the last fetch did not return a
row.
获取行后,在处理行之前,您可以使用 %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;
稍微考虑一下,我编写了这个避免在循环内使用 IF 的过程。我知道,有点 "strange" 但这是我认为唯一可行的方法:
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;
我有一个像这样的简单游标:
CURSOR emp_cur
IS
SELECT *
FROM employee
WHERE age > 20;
在我的程序中,我只想在光标中有员工时做一些预操作。在该预操作之后,我处理所有行。
我需要这个,因为只有当那个游标中存在员工时我才需要清理一些表,否则我应该 "RETURN".
所以代码可以是:
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;
现在,我有一个 "dirty" 解决方案,我在其中打开光标:
- 首先检查是否有行
- 进行预操作并关闭
- Open/fetch 再次处理行,然后再次关闭
First to check if there are rows
在 FETCH 之前,您无法了解这些行。
来自文档 link ,
After a cursor or cursor variable is opened but before the first fetch, %FOUND returns NULL. After any fetches, it returns TRUE if the last fetch returned a row, or FALSE if the last fetch did not return a row.
获取行后,在处理行之前,您可以使用 %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;
稍微考虑一下,我编写了这个避免在循环内使用 IF 的过程。我知道,有点 "strange" 但这是我认为唯一可行的方法:
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;