我在从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})
还有什么可能出错?感谢任何帮助!
答案 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_stack
和dbms_utility.format_error_backtrace
来记录错误详情。否则,错误行号永远不会正确。