Php和oracle OCI查询

mkshixfv  于 2023-04-20  发布在  Oracle
关注(0)|答案(3)|浏览(137)

我有一个问题与此代码

$stmt = oci_parse($db, $sql);
$isQueryOk = oci_execute($stmt);
if ($isQueryOk) {
    while (($row = oci_fetch_assoc($stmt)) != false) {
        array_push($results, $row);
    }
    echo json_encode($results);
} else {
    $msg = "Error FETCHING ALL [$sql] on " . mb_strtoupper($dbTable) . "!";
}

问题是,如果oci_fetch_assoc($stmt)返回20000行,while (($row = oci_fetch_assoc($stmt)) != false) { array_push($results, $row); }需要很多时间。有没有一种方法可以不使用WHILE循环返回echo json_encode($results);
先谢谢你了。

64jmpszr

64jmpszr1#

或者尝试使用另一种方法推送您的数组。“注意:如果你使用array_push()向数组中添加一个元素,最好使用$array[] =,因为这样就没有调用函数的开销。

$results[] = $row;
7fhtutme

7fhtutme2#

我不确定它是否会更快,但正如Marcos Sedrez所写的那样,你可以尝试使用oci_fetch_all。你需要传递一个标志来按行返回(而不是按列返回,默认情况下),以匹配你当前的输出格式:

oci_fetch_all($stmt, $output, 0, -1, OCI_FETCHSTATEMENT_BY_ROW);
json_encode($output);

请参阅the documentation了解更多信息。

a9wyjsp7

a9wyjsp73#

错误消息不会输出到任何地方,因此即使有错误,也不会显示
这里是固定代码

$stmt = oci_parse($db, $sql);
if ($stmt === false) {
    $error = oci_error($db);
    $msg = "Error PARSING [$sql] on {$dbTable}: {$error['message']}";
} else {
    $isQueryOk = oci_execute($stmt);
    if ($isQueryOk) {
        $results = array();
        while (($row = oci_fetch_assoc($stmt)) !== false) {
            array_push($results, $row);
        }
        echo json_encode($results);
    } else {
        $error = oci_error($stmt);
        $msg = "Error EXECUTING [$sql] on {$dbTable}: {$error['message']}";
    }
}

if (isset($msg)) {
    error_log($msg);
    http_response_code(500);
    echo 'Internal Server Error';
}

相关问题