You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PL/SQL存储过程运行时字符输入问题及货币转换程序修复

修复加拿大元转换存储过程的编译错误

错误原因分析

你的存储过程存在3个导致编译或运行异常的问题:

  • 参数类型语法错误:Oracle PL/SQL不允许在存储过程参数的VARCHAR2类型后直接指定长度(如VARCHAR2(10)),这属于语法违规。
  • 未处理无效输入:若传入的货币标识不是E/Y/V/Z中的任意一个,v_result和v_new_currency会保持NULL值,导致输出语句出现异常。
  • 字符串转义错误:代码中使用的"是HTML转义字符,在PL/SQL中会被当作普通文本输出,无法解析为双引号。

修正后的存储过程代码

CREATE OR REPLACE PROCEDURE conversion(p_cad_dollars IN NUMBER, p_new_currency IN VARCHAR2) AS
    v_result NUMBER;
    v_new_currency VARCHAR2(20);
BEGIN
    IF p_new_currency = 'E' THEN
        v_result := p_cad_dollars * 1.50;
        v_new_currency := 'EURO';
    ELSIF p_new_currency = 'Y' THEN
        v_result := p_cad_dollars * 100;
        v_new_currency := 'YEN';
    ELSIF p_new_currency = 'V' THEN
        v_result := p_cad_dollars * 10000;
        v_new_currency := 'Viet Nam DONG';
    ELSIF p_new_currency = 'Z' THEN
        v_result := p_cad_dollars * 1000000;
        v_new_currency := 'Endora ZIP';
    ELSE
        -- 处理无效货币标识的情况
        DBMS_OUTPUT.PUT_LINE('Error: Invalid currency code. Valid codes are E, Y, V, Z.');
        RETURN; -- 提前退出过程,避免后续NULL值输出
    END IF;
    
    -- 直接使用双引号输出,无需HTML转义
    DBMS_OUTPUT.PUT_LINE('For "' || p_cad_dollars || '" dollars Canadian, you will have "' || v_result || '" ' || v_new_currency);
END;
/

可选:限制货币标识长度

如果需要限制输入的货币标识长度不超过10字符,可以在过程内部添加长度校验:

CREATE OR REPLACE PROCEDURE conversion(p_cad_dollars IN NUMBER, p_new_currency IN VARCHAR2) AS
    v_result NUMBER;
    v_new_currency VARCHAR2(20);
BEGIN
    -- 校验货币标识长度
    IF LENGTH(p_new_currency) > 10 THEN
        DBMS_OUTPUT.PUT_LINE('Error: Currency code cannot exceed 10 characters.');
        RETURN;
    END IF;

    IF p_new_currency = 'E' THEN
        v_result := p_cad_dollars * 1.50;
        v_new_currency := 'EURO';
    ELSIF p_new_currency = 'Y' THEN
        v_result := p_cad_dollars * 100;
        v_new_currency := 'YEN';
    ELSIF p_new_currency = 'V' THEN
        v_result := p_cad_dollars * 10000;
        v_new_currency := 'Viet Nam DONG';
    ELSIF p_new_currency = 'Z' THEN
        v_result := p_cad_dollars * 1000000;
        v_new_currency := 'Endora ZIP';
    ELSE
        DBMS_OUTPUT.PUT_LINE('Error: Invalid currency code. Valid codes are E, Y, V, Z.');
        RETURN;
    END IF;
    
    DBMS_OUTPUT.PUT_LINE('For "' || p_cad_dollars || '" dollars Canadian, you will have "' || v_result || '" ' || v_new_currency);
END;
/

测试方法

编译通过后,开启服务器输出并调用存储过程验证:

SET SERVEROUTPUT ON;
BEGIN
    conversion(100, 'E'); -- 转换100加元为欧元
    conversion(50, 'Y');  -- 转换50加元为日元
    conversion(20, 'X');  -- 传入无效代码,触发错误提示
END;
/

内容的提问来源于stack exchange,提问作者Varun Grover

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:15:39