包/触发器的重新编译/重新验证(NOT EXECUTION)时出现ORA-01422错误

时间:2014-05-21 12:28:16

标签: oracle exception plsql

我遇到了一个问题,我正试图将程序包的执行授予另一个架构。

GRANT EXECUTE ON PP.PKG_PROF TO PPSERVICE;

看起来Oracle尝试在授予之前重新编译/重新验证包。但是它失败了,出现以下错误:

GRANT EXECUTE ON PP.PKG_PROF TO PPSERVICE
Error report -
SQL Error: ORA-04045: errors during recompilation/revalidation of PP.PKG_PROF
ORA-20000: ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 83
04045. 00000 -  "errors during recompilation/revalidation of %s.%s"
*Cause:    This message indicates the object to which the following
       errors apply.  The errors occurred during implicit
       recompilation/revalidation of the object.    
*Action:   Check the following errors for more information, and
       make the necessary corrections to the object.

但是,如果我查看第83行的代码,它会执行以下查询:

select 'x' into vtemp 
from cust_field_vals
where cust_fields = vin_cust_fields
and userid = vin_user_id;

vin_cust_fields和vin_user_id是在调用包中的过程时提供的基于参数的值。

我的问题是:oracle正在做什么?我理解“选择INTO” 理论上可以返回超过请求的行数(在这种情况下需要为1),但由于它不知道我的vin参数是什么,它如何进行评估?为什么重新编译/重新验证会抛出基本上等于数据异常的异常,它甚至不应该查看我正在尝试做的事情(即:我不是试图实际执行该过程)。 / p>

这不是我第一次看到这个,如果我没记错的话,我甚至认为这也是在重新编译触发器时发生的(不是在插入数据时)。

有什么想法?谢谢!

1 个答案:

答案 0 :(得分:1)

显然,问题是我尝试GRANT执行的包是"无效"即使没有实际的代码错误。首先编译正文是产生上述错误。如果我首先手动编译软件包规范,然后是正文,则错误消失并且授权正常执行。包中没有代码错误,它只是处于无法摆脱的无效状态。