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
答案 0 :(得分:0)
错误的直接原因是第二个FETCH语句。它从光标S获取,但您将光标关闭在上方。将其更改为从光标D获取将更正错误条件。
但是,您的程序还有其他问题。
“select count(empno)...”是多余的,因为你对结果一无所知。
游标S和D是相同的,不能同时打开,因此只需要其中一个。可以关闭然后重新打开相同的光标。
无论您使用2个游标还是只重复使用1个游标,都无法保证返回相同的行。
您的更新将无法执行您想要的操作。它将更新表中每行的sal列执行循环的数量(在本例中为AA中的数字)。因此,如果您的示例中AA为3,则每行将更新为1500.这是因为更新中没有where子句。因此,Oracle会更新每一行。