首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PL/SQL 存儲過程編寫指南:常見錯誤與修正範例

     編輯:程式設計綜合問答

典型錯誤場景

初學者編寫薪資調整過程時常見問題:

  • 語法結構不完整 (缺少 THEN、END IF、分號)
  • 日期比較邏輯錯誤
  • 更新語句未指定 WHERE 條件導致全表更新

修正後的標準範例

CREATE OR REPLACE PROCEDURE adjust_salary (
    p_empno   IN  emp.empno%TYPE,
    p_pct     IN  NUMBER DEFAULT 10  -- 百分比參數化
) AS
    v_hiredate emp.hiredate%TYPE;
    v_months   NUMBER;
BEGIN
    -- 1. 查詢入職日期
    SELECT hiredate INTO v_hiredate FROM emp WHERE empno = p_empno;

    -- 2. 計算任職月數
    v_months := MONTHS_BETWEEN(SYSDATE, v_hiredate);

    -- 3. 基礎調薪 10%
    UPDATE emp
    SET sal = sal * (1 + p_pct / 100)
    WHERE empno = p_empno;

    -- 4. 滿 5 年 (60 月) 額外加薪 5%
    IF v_months > 60 THEN
        UPDATE emp
        SET sal = sal * 1.05
        WHERE empno = p_empno;
    END IF;

    COMMIT;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        RAISE_APPLICATION_ERROR(-20001, '員工編號不存在: ' || p_empno);
    WHEN OTHERS THEN
        ROLLBACK;
        RAISE;
END adjust_salary;
/
SHOW ERRORS

關鍵修正點解析

原問題修正方案
month_between(date1,date2) 參數順序/類型使用 MONTHS_BETWEEN(較晚日期, 較早日期),返回正數
更新語句無 WHERE所有 UPDATE 必須帶 WHERE empno = p_empno
百分比寫法 1 + 10%PL/SQL 不支持百分號字面量,改用 1 + 10/100 或參數化
缺少異常處理添加 EXCEPTION 區塊捕獲 NO_DATA_FOUND 等
隱式提交風險顯式 COMMIT/ROLLBACK 控制事務

調試技巧

  1. 使用 DBMS_OUTPUT.PUT_LINE 打印中間變量。
  2. SQL Developer / PL/SQL Developer 中設置斷點單步執行。
  3. 先在 SQL Worksheet 測試單條 SQL,再組裝進過程。

最佳實踐建議

  • 所有業務邏輯參數化,避免硬編碼。
  • 使用 %TYPE 錨定變量類型,表結構變更自動適配。
  • 異常處理區分業務異常與系統異常,業務異常用 RAISE_APPLICATION_ERROR 返回友好碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved