我的應用程式團隊正在嘗試使用由他們的程式即時構建的 SELECT 查詢從表中獲取 85,000 個值。
SELECT * FROM TEST_TABLE
WHERE (
ID IN (00001,00002, ..., 01000)
OR ID IN (01001,01002, ..., 02000)
...
OR ID IN (84001,84002, ..., 85000)
));
但我收到錯誤“ORA-00913 值太多”。
如果我將 in 子句減少到僅 65,000 個值,則不會出現此錯誤。IN CLAUSE 的值是否有任何限制(伴隨 OR 子句)
uj5u.com熱心網友回復:
問題不在于in串列;它是關于-or分隔復合條件數量的限制。我相信該限制不適用于or特定的,而是適用于使用or,and和 的任意組合的任何復合條件not,帶或不帶括號。而且,重要的是,這似乎沒有在任何地方記錄,也沒有被 Oracle 的任何人承認。
正如您已經清楚地知道,in串列中的專案限制為 1000 項- 您已經解決了這個問題。
決議器將in條件擴展為復合的、-or分隔的條件。適用于您的限制是我已經提到的限制。
限制是 65,535 個“原子”條件(與or, and,放在一起not)。撰寫例子來證實這一點并不難。
更好的問題是為什么(當然,還有如何解決它)。
我的懷疑:為了評估這種復合條件,編譯后的代碼必須使用一個堆疊,它很可能被實作為一個陣列。該陣列由無符號 16 位整數索引(為什么這么小,只有 Oracle 才能知道)。所以堆疊大小不能超過 2^16 = 65,536;實際上只少了一個,因為 Oracle 認為陣列索引從 1 開始,而不是從 0 開始——所以它們丟失了一個索引值 (0)。
解決方法:創建一個臨時表來存盤您的 85,000 個值。請注意,使用元組(原樣)的想法允許您克服單個in串列的 1000 個值限制,但它無法繞過 -or分隔復合條件中 65,535 個“原子”條件的限制;此限制適用于最一般的情況,無論條件最初來自何處(in串列或其他任何內容)。
關于 AskTom 的更多資訊 - 您可能想從底部開始(我的評論,這是執行緒中的最后一個):
https://asktom.oracle.com/pls/apex/f?p=100:11:10737011707014::::P11_QUESTION_ID:9530196000346534356#9545388800346146842
https://asktom.oracle.com/pls/apex/f?p=100:11:10737011707014::::P11_QUESTION_ID:778625947169#9545394700346458835
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/314304.html
