次のロジックを持つ巨大なレガシー 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
は少しあいまいですが、おそらく意図的にそうしていますが、戻り値に絶対的な意味はなく、ほとんどすべての数値である可能性があることを強く示唆しています。PLS_INTEGER
そのため、32ビット整数のみをサポートできるに割り当てられているのを見るのは疑わしいです。しかし、インターウェブには、まさにこの種のことをしている人々の例がたくさんあります.
get_time
手動で呼び出したときに喫煙銃が見つかりました。値-214512572を返しています。これは、32 ビット符号付き整数の最小値に疑わしいほど近い値です。最初の呼び出しと次の呼び出しの間に経過した時間の間にget_time
、Oracle の内部カウンターが最大値と最小値からロールオーバーし、一方を他方から減算しようとするとオーバーフローが発生したのではないかと思っています。
これはありそうな説明ですか?get_time
もしそうなら、これは関数に固有の欠陥ですか? 今夜バッチが再び失敗するかどうかを待つこともできますが、それまでにこの動作の説明を知りたいと思っています.