1. 程式人生 > 資料庫 >oracle:sql語句中in數量大於1000問題

oracle:sql語句中in數量大於1000問題

系統報出一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 = [];
    }
}