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" 解决方案,我在其中打开光标:

  1. 首先检查是否有行
  2. 进行预操作并关闭
  3. 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;