2016-10-18 2 views
3

У меня есть prolem с этим кодомPhp и оракул OCI запрос

$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); } занимает много времени,. Есть ли способ, которым я могу вернуть echo json_encode($results); без цикла WHILE.

Заранее спасибо.

+0

Использование oci_fetch_all: http://php.net/manual/en/function.oci-fetch-all.php –

+0

я пробовал, но не может форматировать, как ключ => значение пары. Возвращает ex: {EMPRESA: [«CLCA», «CMIP», «CPP»], VAL: [«CLCA», «CMIP», «CPP»]}, и мне нужно [{EMPRESA: «CLCA», VAL: CLCA "}, {EMPRESA:" CMIP ", VAL:" CMIP "}, {EMPRESA:" CPP ", VAL:" CPP "}] –

ответ

2

ИЛИ попробуйте использовать другой способ для нажатия на ваш массив. Примечание. Если вы используете array_push() для добавления одного элемента в массив, лучше использовать $ array [] =, потому что таким образом нет накладных расходов на вызов функции ». http://php.net/manual/en/function.array-push.php

$results[] = $row; 
1

Я не уверен, что это будет значительно быстрее, но как Marcos Sedrez wrote вы можете попробовать oci_fetch_all. Вам нужно будет передать его флаг, чтобы вернуться по строкам (вместо по столбцам, по умолчанию), чтобы соответствовать вашему текущему формату вывод:

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

См the documentation для получения дополнительной информации.

Смежные вопросы