简单程序引发 ORA-06502

Simple Procedure raise ORA-06502

有我的代码的简化版本一直在提高我的 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

首先,总是 return 值为 1。

SELECT count(*) 
      INTO w_count
      FROM dual

限定词是什么并不重要。

最后,我只是 运行 您在 Oracle 11R2 中的简化代码示例,它没有引发异常。

我添加了以下语句来代替您的 "do something" 评论:

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

结果是:

w_new_value: 12345. w_count: 1

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

祝你好运。

我自己找到了答案,我认为对其他知识有用。

我的数据库脚本的真正问题是语言。
Oracle 的意大利语 "version" 接受 , 而不是 . 以将 VARCHAR2 翻译成 NUMBER ,这与大多数其他国家/地区不同。

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

这个技巧最终允许数据库像 NUMBER

一样使用我的 VARCHAR2 参数