在PL / SQL中使用两个游标

时间:2017-04-14 00:44:08

标签: plsql

DECLARE
     AA NUMBER;
     CURSOR S IS SELECT ENAME, SAL
     FROM EMP;
     CURSOR D IS SELECT ENAME, SAL
     FROM EMP;
     NAME EMP.ENAME%TYPE;
     SALARY EMP.SAL%TYPE;
     C NUMBER;
BEGIN
   AA := :NUMBER_OF_EMP;
   SELECT COUNT(EMPNO) INTO C FROM EMP;
    OPEN S;
     FOR A IN 1..AA LOOP
        FETCH S INTO NAME, SALARY;
        DBMS_OUTPUT.PUT_LINE('NAME : '||NAME||'   SALARY :'||SALARY); 
     END LOOP;
CLOSE S;
  DBMS_OUTPUT.PUT_LINE('  ');
    OPEN D;
      FOR A IN 1..AA LOOP
        FETCH S INTO NAME, SALARY;
         UPDATE EMP
         SET SAL = SAL + 500;
        DBMS_OUTPUT.PUT_LINE('NAME : '||NAME||'   SALARY :'||SALARY); 
     END LOOP;
    CLOSE D;
END;

我对光标很困惑。在我的代码中,我会显示员工的姓名和薪水。例如,如果用户在第一个游标中放置3,则只显示3名员工(姓名和工资)。第二个游标将执行相同的操作,但它将更改相同3名员工的工资并再次显示它。

ORA-01001: invalid cursor 

1 个答案:

答案 0 :(得分:0)

错误的直接原因是第二个FETCH语句。它从光标S获取,但您将光标关闭在上方。将其更改为从光标D获取将更正错误条件。

但是,您的程序还有其他问题。

  1. “select count(empno)...”是多余的,因为你对结果一无所知。

  2. 游标S和D是相同的,不能同时打开,因此只需要其中一个。可以关闭然后重新打开相同的光标。

  3. 无论您使用2个游标还是只重复使用1个游标,都无法保证返回相同的行。

  4. 您的更新将无法执行您想要的操作。它将更新表中每行的sal列执行循环的数量(在本例中为AA中的数字)。因此,如果您的示例中AA为3,则每行将更新为1500.这是因为更新中没有where子句。因此,Oracle会更新每一行。