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

Oracle PL/SQL 封裝計算器:用 Switch-Case 實現四則運算

     編輯:程式設計綜合問答

需求

編寫一個 Oracle Package(計算器),包含四個函數分別實現兩數加、減、乘、除。初學者困惑:單函數只能 RETURN 一個值,四種運算如何在一個包裡組織?

核心思路:增加運算符參數 + Switch-Case 分發

不必寫四個獨立函數,設計一個通用函數接收「運算符」參數,內部 CASE 分支處理:

完整 Package 代碼示例

規格部

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。
  • 重載:Oracle 支持同名函數重載,可再提供 calculate(p_expr VARCHAR2) 解析字符串表達式。
  • 上下文切換:若在 SQL 中頻繁調用,考慮 PRAGMA UDF(12c+)減少上下文切換開銷。

為何不建議寫四個單獨函數?

方案優點缺點
四函數 add/sub/mul/div語義直觀、調用簡單代碼冗餘、擴展運算符需加函數、維護成本高
單函數 + 運算符參數邏輯集中、易擴展(如加 %、^)、符合開閉原則調用端需記住運算符字符串

採用「參數化運算符 + CASE 分發」模式,既滿足「一個 Package 含四種運算」的要求,又為未來擴展留有餘地。

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