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
相关产品推荐
相关产品推荐

