oracle:sql語句中in數量大於1000問題
阿新 • • 發佈:2020-11-23
系統報出一SQL異常,內容如下:
100000: SQLSTATE[HY000]: General error: 1795 OCIStmtExecute: ORA-01795: maximum number of expressions in a list is 1000
(/var/www/PDO_OCI-1.0/oci_statement.c:142)]
找出拋異常時執行的SQL語句,內容類似:SELECT * FROM test T WHERE T.DUMMY IN (‘1’, ‘2’, ‘3’, …),只是IN後括號裡的主鍵值多了些,其它沒啥特別的。
看ORA-01795中給出的內容是SQL語句的 expressions 中list接受的最大值是1000,查了下ORA-01795的說明,確定問題出在IN後括號裡的主鍵值超過1000上。
解決思路用IN,但是把條件分成多個少於1000的IN即:SELECT * FROM DUAL T WHERE T.DUMMY IN (‘1’, ‘2’, ‘3’,…,‘1000’) OR IN (‘1001’, ‘1002’, …, ‘2000’) OR …
附程式碼:
foreach ($tableNameArr as $key => $v) { $tableNameArrTemp[] = $v; if (($key+1) % 500 ==0 || $tableNameArrCount == ($key +1)) { $tableNameListStr .= "'" . implode("','", $tableNameArrTemp) . "'"; if ($tableNameArrCount != ($key +1)) { $tableNameListStr .= ') or TABLE_NAME in ('; } $tableNameArrTemp = []; } }