适用版本
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(视为可转换)
这是一个脚注 。