Oracle PlSql翻译函数问题

Oracle PlSql翻译函数问题,oracle,plsql,oracle11g,ora-01722,ora-06502,Oracle,Plsql,Oracle11g,Ora 01722,Ora 06502,我创建了一个光标来选择实际数据,并在其中循环输出原始值和转换为数字后的值。应用程序偶尔抛出无效的数字错误。下面是我的测试,不包括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_num

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

我不再收到06502错误。从我发布的原始代码行来看,假设要翻译的字符串中不存在任何字符,那么对于导致无效数字错误的原因是否有任何建议?或者,有没有更好的方法来完成原始开发人员试图做的事情

以下是变量声明:

v_answer varchar2(2000);
v_number number;
v_instr number;

首先,TRANSLATE没有替换“标记信息”,因为相关错误可能会提供有关您的2的一些信息。我想看看变量声明,基于我为ORA-06502阅读的内容,看看我的编辑。我来看看标签。谢谢你能告诉我有没有更好的方法来完成这项工作吗:用数字代替翻译解码INSTRhra_ans.answer_text',1,2,0,UPPERhra_ans.answer_text,0,'abcdefghijklmnopqurstwxyz+:','',?我认为删除Translate并使用to_numberTRIMRegexp_替换decode instrha_ans.answer_text','1,2,0,UPPERhra_ans.answer_text,0',[^0-9.]',。有什么想法吗?
AND TO_NUMBER(REPLACE(TRANSLATE ( decode( INSTR(hra_ans.answer_text, '.',1 , 2), 0 , UPPER(hra_ans.answer_text) , 0),'ABCDEFGHIJKLMNOPQURSTWVXYZ+<>:',' '), ' ','')) 
CASE v_instr 
                                                 WHEN 0 THEN UPPER(v_answer)
                                                 ELSE '0'
v_answer varchar2(2000);
v_number number;
v_instr number;
  v_number := TO_NUMBER(REPLACE(TRANSLATE (CASE TO_CHAR(v_instr) 
                                             WHEN '0' THEN UPPER(v_answer)
                                             ELSE '0' 
                                           END,'ABCDEFGHIJKLMNOPQURSTWVXYZ+<>:',' '), ' ',''));
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;