需求:從薪資最低的員工開始,每人調漲 10%,但調薪後全員薪資總額不得超過 50,000(原文邏輯為 60,000,此以 50,000 為例)。需輸出調薪人數與調薪後總薪資。展示游標、變數控制、條件判斷與交易控制的完整 PL/SQL 區塊。
SET SERVEROUTPUT ON;
DECLARE
CURSOR c_emp IS
SELECT empno, sal FROM emp ORDER BY sal; -- 由低到高
v_empno emp.empno%TYPE;
v_sal emp.sal%TYPE;
v_total_sal NUMBER; -- 目前薪資總額
v_cnt NUMBER := 0; -- 調薪人數計數
BEGIN
-- 初始化總薪資
SELECT SUM(sal) INTO v_total_sal FROM emp;
OPEN c_emp;
LOOP
EXIT WHEN v_total_sal > 50000; -- 超過上限停止
FETCH c_emp INTO v_empno, v_sal;
EXIT WHEN c_emp%NOTFOUND;
-- 試算調薪後總額
v_total_sal := v_total_sal + v_sal * 0.1;
IF v_total_sal > 50000 THEN
-- 超過上限,回滾試算並跳出
v_total_sal := v_total_sal - v_sal * 0.1;
EXIT;
ELSE
-- 確認調薪
UPDATE emp SET sal = sal * 1.1 WHERE empno = v_empno;
v_cnt := v_cnt + 1;
END IF;
END LOOP;
CLOSE c_emp;
COMMIT;
DBMS_OUTPUT.PUT_LINE('調薪後總薪資: ' || v_total_sal);
DBMS_OUTPUT.PUT_LINE('調薪人數: ' || v_cnt);
END;
/
ORDER BY sal 確保從最低薪資開始調整,符合「照顧弱勢」業務邏輯。v_total_sal 累加預估漲幅,若超限則扣回並終止,避免實際 UPDATE 後再回滾。COMMIT),若中途發生例外會自動回滾,保證資料一致性。FORALL 批次處理。EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE;)記錄錯誤日誌。此範例展示 PL/SQL 控制流程與業務邏輯結合的典型模式,適合初學者理解游標迴圈與條件控制的實務應用。