存储过程命中ORA-06502:PL / SQL:数值或值错误

时间:2014-09-15 03:47:19

标签: oracle stored-procedures weblogic11g osb jca

我在从OSB 11g到JCA Adapter调用存储过程时遇到问题。 我得到的错误是:

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1

错误很短,没有任何追加错误描述。它只发生在生产环境中,当我将数据库指向UAT时没有问题。 更令人惊讶的是,如果我传入的变量之一少于128个字符,它将在生产环境中起作用。 (否则我会点击上面的错误)。 正确定义存储过程类型和长度。使表格列能够处理4000个字符。

Oracle 9i DB共享相同的主要次要构建版本。存储过程位于包中。我提取出来并使用winmerge比较来自两个数据库环境的存储过程,它显示它们彼此镜像。

在生产环境中手动执行存储过程可以正常工作,提供了一个足够大的varchar大小。我设法通过声明变量大小小于我传入的数据长度来模拟ORA-06502错误。

我甚至从两次执行中捕获网络转储,发现存在轻微差异。 (注意:我正在重用相同的数据源,只更改WLS中的ip和用户名,并在每次执行前重新启动)

当我指向生产环境(1有问题)时,tcpdump看起来如下所示:

BEGIN packagename.stored_proc_name(V_value1=>:1 , v_value2=>:2, v_value3=>:3); END .... {variable1}... {variable2}... {variable3}) 

当我指向UAT环境(成功1)时,转储看起来更短,没有BEGIN; END标记

.... {variable1}... {variable2}... {variable3}) 

还有什么可能出错?感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

  

" 存储过程位于包中。我使用winmerge提取并比较了来自两个数据库环境的存储过程并显示   他们互相镜像。"

这与代码无关,问题是数据特定的。在UAT中,您可能没有类似数据的生产,因此您无法复制该问题。

您的错误消息只是在第1行说错误,这没有多大帮助。你是否在没有格式化的情况下执行代码?如果格式化代码并执行它,并删除所有异常处理,您将正确地知道行号。例如:

SQL> declare
  2    num number;
  3  begin
  4    num := 'a';
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 4

看,它清楚地表明错误在第4行。

如果您有EXCEPTION阻止,请务必使用dbms_utility.format_error_stackdbms_utility.format_error_backtrace来记录错误详情。否则,错误行号永远不会正确。