我创建了一个光标来选择实际数据,并循环输出原始值和转换为数字后的值。应用程序偶尔会抛出无效数字错误。下面是我的测试(不包括 select 语句)代码和输出。
LOOP
FETCH myCursor into v_answer;
EXIT WHEN myCursor%notfound;
DBMS_OUTPUT.PUT_LINE('Raw answer: ' || v_answer );
v_instr := INSTR(v_answer, '.',1 , 2) ;
v_number := TO_NUMBER(REPLACE(TRANSLATE (CASE v_instr
WHEN 0 THEN UPPER(v_answer)
ELSE 0
END,'ABCDEFGHIJKLMNOPQURSTWVXYZ+<>:',' '), ' ',''));
DBMS_output.put_line('As number: ' || v_number);
这是输出:
Raw answer: 4
As number: 4
Raw answer: 3
As number: 3
Raw answer: 1.00
As number: 1
Raw answer: <3
我收到:
PL/SQL: numeric or value error: 字符到数字转换错误
...当原始答案为“<3”时。
请注意,应用程序使用的实际代码如下所示:
AND TO_NUMBER(REPLACE(TRANSLATE ( decode( INSTR(hra_ans.answer_text, '.',1 , 2), 0 , UPPER(hra_ans.answer_text) , 0),'ABCDEFGHIJKLMNOPQURSTWVXYZ+<>:',' '), ' ',''))
并且是动态 sql 字符串中 where 子句的一部分。我已经用 case 语句替换了 decode 语句,因为我得到了一个函数或伪列 'DECODE' 可能在 SQL 语句中使用,只有错误。
最后,我的问题是:
- 为什么翻译功能不能代替小于号和
- ORA-1722 和 ORA-06502 错误之间有什么区别(用外行的话来说)?
编辑:我注意到当我将 case 语句更改为:
CASE v_instr
WHEN 0 THEN UPPER(v_answer)
ELSE '0'
,
我不再收到 06502 错误。通过查看我发布的原始代码行,对于可能导致无效数字错误的原因是否有任何建议(假设要翻译的字符串中不存在任何字符)?或者,有没有更好的方法来完成原始开发人员试图做的事情?
以下是变量声明:
v_answer varchar2(2000);
v_number number;
v_instr number;