2017-04-14 80 views
0
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; 

我對光標有點混淆。在我的代碼我wana顯示僱員的名字和工資。例如,如果用戶在第一個遊標中放置3,則只會顯示3名具有(姓名和薪水)的員工。第二個遊標將執行相同的操作,但它將更改同一3名員工的工資並再次顯示。在PL/SQL中使用兩個光標

ORA-01001: invalid cursor 

回答

0

您的錯誤的直接原因是第二個FETCH語句。它從光標S提取,但是你關閉了上面的光標。改變從光標D讀取的內容將糾正錯誤狀況。

但是,您的程序有其他問題。

  1. 「select count(empno)...」是多餘的,因爲您對結果不做任何處理。

  2. 遊標S和D是相同的,不能同時打開,所以只需要其中的一個。關閉然後重新打開相同的光標很好。

  3. 無論您使用2個遊標還是僅重用1,都無法保證返回相同的行。

  4. 您的更新將不會執行您表明的要求。它將更新表中每一行的sal列的循環次數(在這種情況下是AA中的數字)。所以如果你的例子中的AA是3,那麼每一行的sal就會被1500更新。這是因爲更新中沒有where子句。因此Oracle更新每一行。