我遇到了一个庞大的遗留 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功能的固有缺陷吗?我可以等着看今晚批次是否再次失败,但我很想在那之前得到这种行为的解释。