【问题标题】:PlSql Translate function questionPlSql 翻译函数问题
【发布时间】:2011-10-05 14:58:12
【问题描述】:

我创建了一个光标来选择实际数据,并循环输出原始值和转换为数字后的值。应用程序偶尔会抛出无效数字错误。下面是我的测试(不包括 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:数字或值错误:字符到数字的转换错误

...当原始答案为“

请注意,应用程序使用的实际代码如下所示:

AND TO_NUMBER(REPLACE(TRANSLATE ( decode( INSTR(hra_ans.answer_text, '.',1 , 2), 0 , UPPER(hra_ans.answer_text) , 0),'ABCDEFGHIJKLMNOPQURSTWVXYZ+<>:',' '), ' ','')) 

and 是动态 sql 字符串中 where 子句的一部分。我已经用 case 语句替换了 decode 语句,因为我得到了一个函数或伪列 'DECODE' 可能在 SQL 语句中使用,只有错误。

最后,我的问题是:

  1. 为什么翻译函数不能替换小于号和
  2. 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;

【问题讨论】:

  • 相关错误的标签信息可能会提供有关您的 #2 的一些信息。我想根据我为 ORA-06502 阅读的内容查看变量声明
  • 查看我的编辑。我会检查标签。谢谢!

标签: oracle plsql oracle11g ora-01722 ora-06502


【解决方案1】:

首先,TRANSLATE 没有替换“

  v_number := TO_NUMBER(REPLACE(TRANSLATE (CASE TO_CHAR(v_instr) 
                                             WHEN '0' THEN UPPER(v_answer)
                                             ELSE '0' 
                                           END,'ABCDEFGHIJKLMNOPQURSTWVXYZ+<>:',' '), ' ',''));

来自this post on asktom.com

ORA-1722 是无效号码。我们试图明确地或 将字符串隐式转换为数字,但失败了。

发生这种情况的原因有很多。它通常发生在 SQL 中 仅(在查询期间)不在 plsql 中(plsql 抛出不同的 此错误例外)。

编辑:

您对 regexp_replace 的使用看起来不错,但如果我编写此代码,我会使用 CASE 而不是 DECODE,因为我认为它更易于阅读:

v_number := CASE WHEN INSTR(v_answer, '.',1 , 2) = 0 THEN -- has 0 or 1 period
                     TO_NUMER(REGEXP_REPLACE(v_answer,'[^0-9.]',''))
                 ELSE 0  -- has more than one period
            END;

【讨论】:

  • 你能告诉我是否有更好的方法来完成这个:TO_NUMBER(REPLACE(TRANSLATE ( decode( INSTR(hra_ans.answer_text, '.',1 , 2), 0 , UPPER(hra_ans .answer_text) , 0),'ABCDEFGHIJKLMNOPQURSTWVXYZ+:',' '), ' ',''))?我在想删除翻译并使用 to_number(TRIM(Regexp_replace ( decode( INSTR(hra_ans.answer_text, '.',1 , 2), 0 , UPPER(hra_ans.answer_text) , 0),'[^0- 9.]',''))。有什么想法吗?
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 2012-10-27
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多