如何编写PLSQL异常语句校验demand输入仅为HIGH/LOW/AVG格式
PLSQL存储过程参数校验异常处理实现
本次修改的核心逻辑如下:
- 新增自定义参数非法异常,绑定自定义错误码便于上层应用捕获
- 执行查询前先对输入的demand参数做合法性校验,统一转为大写后匹配,兼容用户大小写输入
- 异常抛出时输出明确的提示信息,降低排查成本
完整修改后的存储过程代码
CREATE OR REPLACE PROCEDURE get_productdetails( p_reqid OUT requirement.req_id%type, p_pid OUT requirement.p_id%type, p_rstaffid OUT requirement.r_staff_id%type, p_demand requirement.demand%type ) IS -- 自定义参数非法异常 e_invalid_demand EXCEPTION; PRAGMA EXCEPTION_INIT(e_invalid_demand, -20001); CURSOR c_demand IS SELECT req_id,p_id,r_staff_id from requirement where demand = upper(p_demand); BEGIN -- 先做参数合法性校验 IF UPPER(p_demand) NOT IN ('HIGH','LOW','AVG') THEN RAISE e_invalid_demand; END IF; FOR i in c_demand Loop DBMS_OUTPUT.PUT_LINE('需求ID :'||i.req_id); DBMS_OUTPUT.PUT_LINE('产品ID :'||i.p_id); DBMS_OUTPUT.PUT_LINE('负责员工ID :'||i.r_staff_id); END LOOP; EXCEPTION WHEN e_invalid_demand THEN DBMS_OUTPUT.PUT_LINE('错误:demand参数仅允许为HIGH/LOW/AVG三种值,请按照指定格式输入'); -- 可根据业务需要选择是否向上抛出异常 RAISE; WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('程序执行异常,错误信息:'||SQLERRM); RAISE; END get_productdetails;
关键修改说明
- 新增的参数校验逻辑会先把用户输入的
p_demand转为大写后再做判断,用户输入小写的high/low/avg也能正常通过校验,兼容性更强 - 自定义异常绑定了错误码
-20001,上层调用该存储过程的程序可以直接通过错误码判断是否是参数非法问题,无需解析错误文本 - 额外新增了OTHERS异常捕获分支,避免其他未预见的错误直接抛出无明确提示
内容的提问来源于stack exchange,提问作者Keth
相关产品推荐
相关产品推荐

