2014-01-14 67 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。

相关问题