我遇到了一个庞大的遗留 PL/SQL 过程的问题,它具有以下逻辑:
l_elapsed := dbms_utility.get_time - l_timestamp;
wherel_elapsed
和l_timestamp
是类型PLS_INTEGER
并l_timestamp
保存先前调用的结果get_time
在批处理运行期间,这条线突然开始失败ORA-01426: numeric overflow
文档get_time
有点含糊,可能是故意的,但它强烈表明返回值没有绝对意义,几乎可以是任何数值。所以我怀疑它被分配给 a PLS_INTEGER
,它只能支持 32 位整数。然而,互联网上充斥着人们正在做这种事情的例子。
当我get_time
手动调用时发现了确凿的证据,它返回一个值-214512572,这可疑地接近 32 位有符号整数的最小值。我想知道在第一次调用get_time
和下一次调用之间的时间间隔内,Oracle 的内部计数器是否从其最大值和最小值翻转,从而在尝试从另一个中减去一个时导致溢出。
这是一个可能的解释吗?如果是这样,这是该get_time
功能的固有缺陷吗?我可以等着看今晚批次是否再次失败,但我很想在那之前得到这种行为的解释。