简单程序提出ORA-06502

时间:2015-04-01 14:51:50

标签: plsql

我的代码的简化版本一直在提高我ORA-06502:

declare     
    p_filter     varchar2(300) := '2012';
    p_value      varchar2(300) := '12345.000'; 
    w_new_value  number(13,3)  := null ;
    w_count      number(4)     := null ;   
BEGIN
    SELECT count(*) 
      INTO w_count
      FROM dual
      where p_filter = p_filter;
      --- more filters
    if w_count != 0 then
      w_new_value := p_value / w_count;
   else
      w_new_value := p_value;
   end if;       

   -- do something

end;
/

有人可以帮我一个忙吗?

数据库详细信息

  
      
  • nls_language = italian
  •   
  • nls_territory = italy
  •   
  • nls_currency =�
  •   
  • nls_iso_currency = italy
  •   
  • nls_numeric_characters = ,.
  •   
  • nls_calendar = gregorian
  •   
  • nls_date_format = dd-mon-rr
  •   
  • nls_date_language = italian
  •   
  • nls_characterset = we8iso8859p15
  •   
  • nls_sort = west_european
  •   
  • nls_time_format = hh24:mi:ssxff
  •   
  • nls_timestamp_format = dd-mon-rr hh24:mi:ssxff
  •   
  • nls_time_tz_format = hh24:mi:ssxff tzr
  •   
  • nls_timestamp_tz_format = dd-mon-rr hh24:mi:ssxff tzr
  •   
  • nls_dual_currency =�
  •   
  • nls_nchar_characterset = al16utf16
  •   
  • nls_comp = binary
  •   
  • nls_length_semantics = byte
  •   
  • nls_nchar_conv_excp = false
  •   

2 个答案:

答案 0 :(得分:0)

首先,始终返回值为1。

SELECT count(*) 
      INTO w_count
      FROM dual

限定符是什么并不重要。

最后,我刚刚在Oracle 11R2中运行了简化的代码示例,并没有抛出异常。

我添加了以下声明来代替您的“做某事”评论:

dbms_output.put_line('w_new_value: ' || w_new_value || '. w_count: ' || w_count);

结果是:

w_new_value: 12345. w_count: 1

所以,我认为你已经将你的例子简化为遗忘。您需要提供实际显示错误的内容。

祝你好运。

答案 1 :(得分:0)

我发现自己是这个问题,我认为对其他人来说很有用。

我的数据库脚本的真正问题是语言 Oracle的意大利语“版本”接受,而不是.,以便将VARCHAR2转换为NUMBER,而不像大多数其他国家/地区。

为了使代码运行良好,解决方案是 w_new_value := replace(p_value,'.',',') / w_count;

此技巧最终允许数据库使用我的VARCHAR2 param,如NUMBER