Oracle存储过程:验证输入是否为数字的非正则实现方法
验证VARCHAR2变量是否为数值的非正则方法(Oracle PL/SQL)
针对你的存储过程问题,除了正则表达式,还有以下几种实用方法来验证brand_code是否为可转换的数值:
1. 利用TO_NUMBER+异常捕获
这是PL/SQL中最经典的验证方式,通过尝试将字符串转换为数字,捕获转换失败的异常来判断有效性。可以封装成辅助函数,也可直接在存储过程内处理:
辅助函数实现
CREATE OR REPLACE FUNCTION is_numeric(p_str VARCHAR2) RETURN BOOLEAN IS v_num NUMBER; BEGIN v_num := TO_NUMBER(p_str); RETURN TRUE; EXCEPTION WHEN VALUE_ERROR OR INVALID_NUMBER THEN RETURN FALSE; END;
修改后的存储过程
CREATE OR REPLACE PROCEDURE p1(brand_code VARCHAR2) IS a VARCHAR2(22); BEGIN IF is_numeric(brand_code) THEN SELECT DESCRIPTION INTO a FROM UDA_VALUES WHERE CODE = TO_NUMBER(brand_code); ELSE -- 处理非数值场景,比如返回默认值或抛出自定义异常 a := '非有效品牌编码'; -- 也可执行:RAISE_APPLICATION_ERROR(-20001, '输入的品牌编码不是有效数字'); END IF; END;
2. 使用VALIDATE_CONVERSION函数(Oracle 12c+)
Oracle 12c及以上版本提供了VALIDATE_CONVERSION函数,直接返回1(可转换)或0(不可转换),无需处理异常,代码更简洁:
CREATE OR REPLACE PROCEDURE p1(brand_code VARCHAR2) IS a VARCHAR2(22); BEGIN IF VALIDATE_CONVERSION(brand_code AS NUMBER) = 1 THEN SELECT DESCRIPTION INTO a FROM UDA_VALUES WHERE CODE = TO_NUMBER(brand_code); ELSE -- 处理非数值逻辑 a := '非有效品牌编码'; END IF; END;
3. 使用DBMS_ASSERT.IS_NUMBER函数
Oracle的DBMS_ASSERT包提供了IS_NUMBER过程,当输入不是有效数字时会抛出异常,可通过捕获异常判断:
注意:需先给当前用户授予执行权限:GRANT EXECUTE ON DBMS_ASSERT TO your_user;
CREATE OR REPLACE PROCEDURE p1(brand_code VARCHAR2) IS a VARCHAR2(22); BEGIN DBMS_ASSERT.IS_NUMBER(brand_code); -- 执行到此处说明输入为有效数字 SELECT DESCRIPTION INTO a FROM UDA_VALUES WHERE CODE = TO_NUMBER(brand_code); EXCEPTION WHEN OTHERS THEN IF SQLCODE = -20000 THEN -- DBMS_ASSERT抛出的异常码 -- 处理非数值逻辑 a := '非有效品牌编码'; ELSE -- 转发其他异常 RAISE; END IF; END;
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

