PL / SQL - 如果找到游标,则执行前导操作

时间:2015-03-20 13:25:51

标签: oracle plsql

我有一个像这样的简单光标:

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;

现在,我有一个"脏"我打开游标的解决方案:

  1. 首先检查是否有行
  2. 采取预先行动并关闭
  3. 再次打开/获取以处理行,然后再次关闭

2 个答案:

答案 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;