2014-01-14 66 views
0

問題: 根據以下條件編寫一個PL/SQL塊,給每個員工提高薪水: 另存爲q3.sql不需要測試腳本。 •員工人數少於1000人可以提高6% •員工人數在1000人以上且3000人以下人數增加8% •員工人數大於3000人增加12% 每次增加時,使用dbms_output打印消息「,你剛剛得到了百分之n的提升,你的新薪水是」。當所有加註完成後,回滾交易並打印信息,「他,他,他......只是在開玩笑!」跳過一條記錄並使用以前的記錄數據

它做了正確的計算,並且沒有返回任何錯誤,雖然它正在對上一條記錄進行計算,然後跳過下一條記錄。

SET SERVEROUTPUT ON 
DECLARE 
CURSOR sal_cursor IS 
    SELECT ename, sal 
    FROM EMP 
FOR UPDATE OF sal NOWAIT; 
    V_sal emp.sal%TYPE; 
    V_ENAME EMP.Ename%TYPE; 
BEGIN 
    FOR emp_record IN sal_cursor 
LOOP 
    FETCH sal_cursor INTO V_Ename, V_Sal; 
    IF (V_SAL <= 1000) THEN 
     UPDATE emp 
     SET EMP.sal = (emp_record.sal * 1.06) 
     WHERE CURRENT OF sal_cursor; 
     v_sal := v_sal * 1.06; 
    ELSIF V_SAL > 1000 AND V_sal <= 3000 THEN 
     UPDATE emp 
     SET EMP.sal = (emp_record.sal * 1.08) 
     WHERE CURRENT OF sal_cursor; 
     v_sal := v_sal * 1.08; 
    ELSE 
     UPDATE emp 
     SET EMP.sal = (emp_record.sal * 1.12) 
     WHERE CURRENT OF sal_cursor; 
     v_sal := v_sal * 1.12; 
    END IF; 
    DBMS_OUTPUT.PUT_LINE(V_ENAME || ', you just got an n percent raise 
    and your new salary is ' || v_sal); 
END LOOP; 
DBMS_OUTPUT.PUT_LINE('He, he, he... just kidding!'); 
ROLLBACK; 
END; 

回答

0

您在混合two ways of handling cursors - 顯式和隱式CURSOR FOR循環。您可以比較從該語法頁面鏈接的示例。

FOR emp_record IN sal_cursor方法自動提取每行到emp_record變量。您的顯式FETCH然後讀取下一個記錄。 (我有點驚訝它不抱怨它)。

SET SERVEROUTPUT ON 
DECLARE 
CURSOR sal_cursor IS 
    SELECT ename, sal 
    FROM EMP 
FOR UPDATE OF sal NOWAIT; 
    V_sal emp.sal%TYPE; 
BEGIN 
    FOR emp_record IN sal_cursor 
LOOP 
    IF (emp_record.sal <= 1000) THEN 
     v_sal := emp_record.sal * 1.06; 
    ELSIF emp_record.sal > 1000 AND emp_record.sal <= 3000 THEN 
     v_sal := emp_record.sal * 1.08; 
    ELSE 
     v_sal := emp_record.sal * 1.12; 
    END IF; 

    UPDATE emp 
    SET EMP.sal = v_sal 
    WHERE CURRENT OF sal_cursor; 

    DBMS_OUTPUT.PUT_LINE(emp_record.ename || ', you just got an n percent raise 
    and your new salary is ' || v_sal); 
END LOOP; 
DBMS_OUTPUT.PUT_LINE('He, he, he... just kidding!'); 
ROLLBACK; 
END; 

你也可以使用一個CASE語句來指派新的價值;或者使用三個獨立的UPDATE語句和RETURNING子句來填充v_sal,但不知道您是否已經瞭解了這些內容。

如果您要在PL/SQL塊中使用ROLLBACK,那麼也應該有一個異常處理程序並在出現錯誤時進行回滾。

0

FOR語句已經從遊標中提取記錄。所以不要在下面的行中執行FETCH。

相關問題