我在SELECT語句中使用用戶定義的函數時遇到了一些有趣的行爲。何時在Oracle中的查詢中評估用戶定義函數?
我有一對存儲過程,讀取和清除單個表中的數據。這些存儲過程由多個來源使用。
以我的觀察,看來該用戶定義的功能有時評估任意,並不總是立即後或SELECT語句的執行,它是在使用。
例如期間,在存儲過程中,我有一個select語句可能看起來像這樣:
SELECT Something, MyFunction(Something) FROM Somewhere;
然後調用另一個存儲過程,從表中清除數據。清除的數據量由另一個表進行管理,該表存儲最大ID讀取。這樣一來,清除操作不應刪除存儲過程正在執行的另一個實例尚未讀取的任何數據。
在我的測試代碼中,MyFunction只是返回表中某處的行數。因此,我會想象它應該總是等於SELECT語句返回的行數。然而,在我運行此存儲過程的兩個實例的情況下,我得到的結果是這樣的:
首先查詢實例:
Something MyFunction(Something)
--------- ---------------------
A 3
B 3
C 3
第二查詢實例:
Something MyFunction(Something)
--------- ---------------------
A 0
B 0
C 0
爲什麼第二個查詢返回所有行,但在同一個表上運行的用戶定義函數報告表中沒有更多行?
有無論如何,我可以確保第二個查詢實例是一致的,因爲用戶定義的函數仍然可以看到父存儲過程正在看到的相同數據?
我不確定明白:在2個電話之間做了y你可以清理桌子嗎? – Sebas
對此感到抱歉。爲了說明,有一個存儲過程(1)執行SELECT語句,並且(2)在SELECT語句之後調用清除過程。 – acee
我明白了,所以函數返回正確的結果不是嗎?選擇不行,或者說不同的行不應該被返回。確認了嗎? – Sebas