首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

PL/SQL 程式設計實例:依薪資遞增調薪且總額不超過上限

     編輯:關於SqlServer

需求:從薪資最低的員工開始,每人調漲 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;
/

關鍵邏輯說明

  1. 游標排序:ORDER BY sal 確保從最低薪資開始調整,符合「照顧弱勢」業務邏輯。
  2. 試算機制:先在變數 v_total_sal 累加預估漲幅,若超限則扣回並終止,避免實際 UPDATE 後再回滾。
  3. 交易控制:整個區塊以單一交易提交(COMMIT),若中途發生例外會自動回滾,保證資料一致性。
  4. 效能考量:逐筆 UPDATE 適合中小資料量;大量資料建議改用集合式寫法或 FORALL 批次處理。

擴充建議

  • 將上限 50,000 參數化為傳入變數,提高重用性。
  • 加入例外處理區塊(EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE;)記錄錯誤日誌。
  • 若需記錄調薪明細,可建立暫存表或寫入稽核表。

此範例展示 PL/SQL 控制流程與業務邏輯結合的典型模式,適合初學者理解游標迴圈與條件控制的實務應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved