如何在SQL及Oracle APEX中验证数字字段是否输入字符串?
在Oracle APEX中验证数字字段输入及SQL层面的检查方法
嘿,我来帮你搞定这个数字字段验证的问题!你原来的代码里:P2_SAL <> NUMBER这个写法是不对的——NUMBER是数据类型,不能直接和字段值做比较。下面分两部分给你讲正确的实现方式:
一、Oracle APEX页面验证的正确写法
在APEX的页面验证中,你可以用两种方式来检查用户是否输入了非数字内容:
方法1:使用APEX内置工具函数APEX_UTIL.IS_NUMERIC
这个函数专门用来判断字符串是否可以转换为数字,返回布尔值,用起来很省心:
BEGIN -- 先检查输入是否为有效数字 IF NOT APEX_UTIL.IS_NUMERIC(:P2_SAL) THEN RETURN '请输入数字格式的薪资'; END IF; -- 再检查薪资上限 IF :P2_SAL > 85000 THEN RETURN '薪资不能超过85000'; END IF; -- 验证通过返回NULL RETURN NULL; END;
方法2:通过PL/SQL异常捕获判断
如果用户输入的内容无法转换为数字,TO_NUMBER会抛出异常,我们可以捕获这个异常来做判断:
DECLARE l_sal NUMBER; BEGIN -- 尝试转换为数字,失败则进入异常块 l_sal := TO_NUMBER(:P2_SAL); -- 转换成功后检查薪资上限 IF l_sal > 85000 THEN RETURN '薪资不能超过85000'; END IF; RETURN NULL; EXCEPTION WHEN VALUE_ERROR THEN RETURN '请输入数字格式的薪资'; END;
另外,其实APEX还有内置验证类型可以直接用:你可以先加一个「数值格式检查」(Number Format Check)验证输入是否为数字,再单独加一个「范围验证」(Range Validation)检查薪资是否小于85000,不用写PL/SQL代码也能搞定!
二、SQL层面检查数字字段是否输入了字符串
如果要在SQL里判断某个字段(比如表中的salary列)是否包含非数字内容,有几种常用方法:
方法1:使用TRY_TO_NUMBER函数(Oracle 12c及以上版本支持)
这个函数会尝试把字符串转换为数字,转换失败则返回NULL,我们可以通过判断返回值是否为NULL筛选非数字记录:
SELECT employee_id, salary FROM employees WHERE TRY_TO_NUMBER(salary) IS NULL;
方法2:使用正则表达式REGEXP_LIKE
用正则匹配标准数字格式,匹配不上的就是非数字内容:
SELECT employee_id, salary FROM employees WHERE NOT REGEXP_LIKE(salary, '^-?\d+(\.\d+)?$');
正则说明:^-?表示可选负号,\d+表示至少一位整数,(\.\d+)?表示可选的小数部分。
方法3:PL/SQL块中通过异常捕获
如果要在PL/SQL里处理表数据,可以用异常捕获逐个检查:
DECLARE l_sal NUMBER; BEGIN FOR rec IN (SELECT salary FROM employees) LOOP BEGIN l_sal := TO_NUMBER(rec.salary); EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE('非数字薪资记录:' || rec.salary); END; END LOOP; END;
内容的提问来源于stack exchange,提问作者Astro
相关产品推荐
相关产品推荐

