編寫一個 Oracle Package(計算器),包含四個函數分別實現兩數加、減、乘、除。初學者困惑:單函數只能 RETURN 一個值,四種運算如何在一個包裡組織?
不必寫四個獨立函數,設計一個通用函數接收「運算符」參數,內部 CASE 分支處理:
CREATE OR REPLACE PACKAGE calc_pkg AS
FUNCTION calculate(
p_num1 IN NUMBER,
p_num2 IN NUMBER,
p_op IN VARCHAR2 -- '+', '-', '*', '/'
) RETURN NUMBER;
END calc_pkg;
CREATE OR REPLACE PACKAGE BODY calc_pkg AS
FUNCTION calculate(p_num1 IN NUMBER, p_num2 IN NUMBER, p_op IN VARCHAR2)
RETURN NUMBER IS
v_result NUMBER;
BEGIN
CASE p_op
WHEN '+' THEN v_result := p_num1 + p_num2;
WHEN '-' THEN v_result := p_num1 - p_num2;
WHEN '*' THEN v_result := p_num1 * p_num2;
WHEN '/' THEN
IF p_num2 = 0 THEN
RAISE_APPLICATION_ERROR(-20001, '除數不能為零');
END IF;
v_result := p_num1 / p_num2;
ELSE
RAISE_APPLICATION_ERROR(-20002, '不支持的運算符: ' || p_op);
END CASE;
RETURN v_result;
END calculate;
END calc_pkg;
SELECT calc_pkg.calculate(10, 5, '+') FROM dual; -- 15
SELECT calc_pkg.calculate(10, 5, '/') FROM dual; -- 2
-20000 ~ -20999)。NUMBER(38,10) 或 BINARY_DOUBLE,並考慮 ROUND。calculate(p_expr VARCHAR2) 解析字符串表達式。PRAGMA UDF(12c+)減少上下文切換開銷。| 方案 | 優點 | 缺點 |
|---|---|---|
四函數 add/sub/mul/div | 語義直觀、調用簡單 | 代碼冗餘、擴展運算符需加函數、維護成本高 |
| 單函數 + 運算符參數 | 邏輯集中、易擴展(如加 %、^)、符合開閉原則 | 調用端需記住運算符字符串 |
採用「參數化運算符 + CASE 分發」模式,既滿足「一個 Package 含四種運算」的要求,又為未來擴展留有餘地。