2013-11-04 41 views
2

假設我有對證100000分的UID爲一個更新語句 - 目前我的代碼將闖入1000 UID塊這樣的:單個Oracle語句中OR子句的最大數量是多少?

[...] WHERE UID IN (..., '998', '999', '1000') 
OR UID IN ('1001', '1002', ...) 
OR (..., etc., ...) 

有沒有你可以有最大數量的OR子句?也就是說,在我上面的例子中,它會生成100個OR子句,每個子句有1000個IN子句。

+7

我會把UID的另一個表,並在更新語句加入。 – acfrancis

+0

這些100,000個用戶從哪裏來?當然,這些值存儲在數據庫的某個地方,對吧?如果是這樣,那麼可以使用在您的IN語句中返回UID值的查詢,而不是顯式列出100,000個獨立的文字值。 –

+0

在這個過程的不同部分,100,000個使用者都被安裝到一個deque上 - 在這種情況下,不能真正做到這一點。 – MrDuk

回答

1

好了,不完全是。這就是1000項IN列表的多少個OR子句將在我的系統上運行,但是這個數字可能對每個人都不相同。有 沒有database limit正好覆蓋了這種情況。它可能是下注落在:

上的SQL語句可以持續多久的限制取決於許多因素, 包括數據庫配置,磁盤空間和內存

當我嘗試23,我在SQL得到這個錯誤*加:

ERROR at line 1: 
ORA-03113: end-of-file on communication channel 
Process ID: 2452 
Session ID: 135 Serial number: 165 

這不是真正的錯誤,只是意味着在服務器崩潰和SQL * Plus失去了聯繫。奇怪的是,當我查看警報日誌時,沒有錯誤。有跟蹤文件,但仍然沒有ORA-錯誤消息。我看到的只有上百行:

*** 2013-11-04 21:59:48.667 
minact-scn master-status: grec-scn:0x0000.00821c54 gmin-scn:0x0000.0081d656 gcalc-scn:0x0000.00821c54 
minact-scn master-status: grec-scn:0x0000.00823b45 gmin-scn:0x0000.0081d656 gcalc-scn:0x0000.00823b46 

這裏的教訓是避免可笑的大型SQL語句。您必須以另一種方式來完成,比如將數據加載到表中。而不要試圖建立一些只是夠小。它今天可能工作,但明天會在不同的環境中失敗。


--Find the maximum number of IN conditions with 1000 items. 
--Change the first number until it throws an error. 
--This code uses dynamic SQL, but I found that static SQL has the same limit. 
declare 
    c_number_of_ors number := 22; 

    v_in_sql varchar2(4000); 
    v_sql clob; 
    v_count number; 
begin 
    --Comma-separate list of 1000 numbers. 
    select listagg(level, ',') within group (order by 1) 
    into v_in_sql 
    from dual connect by level <= 1000; 

    --Start the statement. 
    v_sql := 'select count(*) from dual '; 
    v_sql := v_sql || 'where 1 in ('||v_in_sql||')'; 

    --Append more ORs to it. 
    for i in 1 .. c_number_of_ors loop 
     v_sql := v_sql || ' or '||to_char(i)||' in ('||v_in_sql||')'; 
    end loop; 

    --Execute it. 
    execute immediate v_sql into v_count; 
end; 
/
+0

很好的答案 - +1! – MrDuk

1

在單個查詢中沒有任何OR子句的限制。當您使用GROUP BY子句時,以及通常所有必須適合單個數據庫塊的非直接聚合函數(例如SUM,AVG)時,您可能會遇到限制問題。

+0

您是否恰好擁有這方面信息的來源? – MrDuk

相關問題