我在與其具有下述邏輯一個龐大的遺留PL/SQL程序問題:dbms_utility.get_time可以翻轉嗎?
l_elapsed := dbms_utility.get_time - l_timestamp;
其中l_elapsed
和l_timestamp
是PLS_INTEGER
類型和l_timestamp
的保持先前的呼叫的到get_time
在批量運行期間,此行突然啓動失敗ORA-01426: numeric overflow
關於get_time
的文檔有點含糊,可能故意這樣,但它的s強烈建議返回值沒有絕對的意義,並且可以是幾乎任何數字值。所以我很懷疑看到它被分配到一個PLS_INTEGER
,它只能支持32位整數。然而,interweb充滿了人們正在做這種事情的例子。當調用get_time
手動,它返回的-214512572的值,這是可疑接近一個32位帶符號整數的最小值
吸菸槍被發現。我想知道從第一次調用到get_time
到第二次調用之間的時間間隔內,Oracle的內部計數器是否從最大值和最小值翻轉過來,導致在嘗試從另一箇中減去一個溢出時發生溢出。
這是一個可能的解釋嗎?如果是這樣,這是get_time
函數的固有缺陷嗎?我可以等一下,看看批次今晚是否再次失敗,但我很想在此之前獲得對此行爲的解釋。
唉,真是一團糟。感謝您的澄清。我現在可以安心地休息,知道我可以等到DBA從假期中恢復過來,然後把地獄般的東西強加給他。 – skaffman 2009-07-06 10:54:37