初學者編寫薪資調整過程時常見問題:
THEN、END IF、分號)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 控制事務 |
DBMS_OUTPUT.PUT_LINE 打印中間變量。%TYPE 錨定變量類型,表結構變更自動適配。RAISE_APPLICATION_ERROR 返回友好碼。