验证数字

适用版本

1.[[Oracle APEX19.2]]

背景

APEX在上传数据时验证非数字类型的数据时. 报错无效的数字.经排查应是下面 where 条件导致的,数据中含有类似1,200.22, 这样的数据在隐式转换数字时报错.

1
2
3
4
5
6
  
v_query_string := q'!SELECT
*  FROM 
apex_collections 
WHERE collection_name = 'LOAD_CONTENT'   and !' || v_conllection_col || '=0';
 

操作

整的测试数据验证下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
-- 加些 异常数据
INSERT INTO TEMP (VAR)VALUES ('1,200.22' );  
INSERT INTO TEMP (VAR)VALUES ('1,200.22kg' );  
INSERT INTO TEMP (VAR)VALUES ('$100.00' );  
INSERT INTO TEMP (VAR)VALUES ('50%' );  
INSERT INTO TEMP (VAR)VALUES ('0%' );  
INSERT INTO TEMP (VAR)VALUES ('-0%' );  
INSERT INTO TEMP (VAR)VALUES ('-10' );
--加些  正常数据 
begin
for i in 1..9 
loop
    INSERT INTO TEMP (VAR)  
    SELECT round(DBMS_RANDOM.VALUE(1, 31),3)  
    FROM DUAL;

end loop
end;

方案1 通过cast验证 (更新貌似不靠谱)

1
2
3
SELECT *  
FROM TEMP 
 where   cast(VAR as float default 99999999999999 on conversion error) = 99999999999999;

方案2 通过VALIDATE_CONVERSION 验证

1
2
3
4
  
SELECT *  
FROM TEMP 
where VALIDATE_CONVERSION(VAR as number) = 0;

VALIDATE_CONVERSION 文档 是Oracle 12.2 及以上版本提供的一个非常实用的内置函数,用于判断某个表达式是否可以成功转换为目标数据类型,而不会抛出异常。
– 如果 expr能成功转换为指定类型(如 NUMBER, DATE 等),返回 1– •
– 如果 转换会失败(例如字符串 ‘abc’ 转成数字),返回 0– •
– 如果 expr 是 NULL,也返回 1(视为可转换)

这是一个脚注 1

Licensed under CC BY-NC-SA 4.0
最后更新于 2025-12-03 15:07
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计