PHP 8.4.1 Released!

oci_get_implicit_resultset

(PHP 5 >= 5.6.0, PHP 7, PHP 8, PECL OCI8 >= 2.0.0)

oci_get_implicit_resultsetВозвращает следующий ресурс дочернего запроса из ресурса родительского запроса, имеющего неявные результирующие наборы Oracle Database

Описание

oci_get_implicit_resultset(resource $statement): resource|false

Используется для выборки последовательных наборов результатов запроса после выполнения хранимого или анонимного блока Oracle PL / SQL, когда этот блок возвращает результаты запроса Oracle Database 12 (или новее) с помощью PL/SQL функции DBMS_SQL.RETURN_RESULT. Это позволят блокам PL/SQL возвращать результаты запроса.

Дочерний запрос может быть использован с любой извлекающей функцией OCI8: oci_fetch(), oci_fetch_all(), oci_fetch_array(), oci_fetch_object(), oci_fetch_assoc() или oci_fetch_row()

Дочерний запрос наследует родительское значение предвыборки, либо можно указать его явно с помощью oci_set_prefetch().

Список параметров

statement

Корректный идентификатор запроса OCI8, созданный с помощью oci_parse() и запущенный с помощью oci_execute(). Идентификатор запроса может быть, а может и не быть связан с SQL-запросом, который возвращает неявные результирующие наборы (Implicit Result Set).

Возвращаемые значения

Возвращает обработчик запроса для следующего доступного для statement дочернего запроса. Возвращает false если такового нет или все дочерние запросы уже были возвращены предыдущими вызовами oci_get_implicit_resultset().

Примеры

Пример #1 Извлечение неявных результирующих наборов в цикле

<?php

$conn
= oci_connect('hr', 'welcome', 'localhost/pdborcl');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'DECLARE
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 FOR SELECT city, postal_code FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
OPEN c1 FOR SELECT country_id FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
END;'
;

$stid = oci_parse($conn, $sql);
oci_execute($stid);

while ((
$stid_c = oci_get_implicit_resultset($stid))) {
echo
"<h2>Новый неявный результирующий набор:</h2>\n";
echo
"<table>\n";
while ((
$row = oci_fetch_array($stid_c, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo
"<tr>\n";
foreach (
$row as $item) {
echo
" <td>".($item!==null?htmlentities($item, ENT_QUOTES|ENT_SUBSTITUTE):"")."</td>\n";
}
echo
"</tr>\n";
}
echo
"</table>\n";
}

// Вывод:
// Новый неявный результирующий набор:
// Beijing 190518
// Bern 3095
// Bombay 490231
// New Implicit Result Set:
// CN
// CH
// IN

oci_free_statement($stid);
oci_close($conn);

?>

Пример #2 Извлечение обработчиков дочерних запросов в индивидуальном порядке

<?php

$conn
= oci_connect('hr', 'welcome', 'localhost/pdborcl');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'DECLARE
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 FOR SELECT city, postal_code FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
OPEN c1 FOR SELECT country_id FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
END;'
;

$stid = oci_parse($conn, $sql);
oci_execute($stid);

$stid_1 = oci_get_implicit_resultset($stid);
$stid_2 = oci_get_implicit_resultset($stid);

$row = oci_fetch_array($stid_1, OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);
$row = oci_fetch_array($stid_2, OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);
$row = oci_fetch_array($stid_1, OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);
$row = oci_fetch_array($stid_2, OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);

// Вывод:
// array(2) {
// ["CITY"]=>
// string(7) "Beijing"
// ["POSTAL_CODE"]=>
// string(6) "190518"
// }
// array(1) {
// ["COUNTRY_ID"]=>
// string(2) "CN"
// }
// array(2) {
// ["CITY"]=>
// string(4) "Bern"
// ["POSTAL_CODE"]=>
// string(4) "3095"
// }
// array(1) {
// ["COUNTRY_ID"]=>
// string(2) "CH"
// }

oci_free_statement($stid);
oci_close($conn);

?>

Пример #3 Явное указание величины предвыборки

<?php

$conn
= oci_connect('hr', 'welcome', 'localhost/pdborcl');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'DECLARE
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 FOR SELECT city, postal_code FROM locations ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
END;'
;

$stid = oci_parse($conn, $sql);
oci_execute($stid);

$stid_c = oci_get_implicit_resultset($stid);
oci_set_prefetch($stid_c, 200); // Устанавливаем величину предвыборки до того как начинаем извлекать пезультаты из дочернего запроса
echo "<table>\n";
while ((
$row = oci_fetch_array($stid_c, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo
"<tr>\n";
foreach (
$row as $item) {
echo
" <td>".($item!==null?htmlentities($item, ENT_QUOTES|ENT_SUBSTITUTE):"")."</td>\n";
}
echo
"</tr>\n";
}
echo
"</table>\n";

oci_free_statement($stid);
oci_close($conn);

?>

Пример #4 Пример неявного результирующего набора без использования oci_get_implicit_resultset()

Все результаты всех запросов возвращаются последовательно.

<?php

$conn
= oci_connect('hr', 'welcome', 'localhost/pdborcl');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$sql = 'DECLARE
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 FOR SELECT city, postal_code FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
OPEN c1 FOR SELECT country_id FROM locations WHERE ROWNUM < 4 ORDER BY city;
DBMS_SQL.RETURN_RESULT(c1);
END;'
;

$stid = oci_parse($conn, $sql);
oci_execute($stid);

// Обратите внимание: oci_fetch_all and oci_fetch() нельзя использовать таким образом
echo "<table>\n";
while ((
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo
"<tr>\n";
foreach (
$row as $item) {
echo
" <td>".($item!==null?htmlentities($item, ENT_QUOTES|ENT_SUBSTITUTE):"")."</td>\n";
}
echo
"</tr>\n";
}
echo
"</table>\n";

// Вывод:
// Beijing 190518
// Bern 3095
// Bombay 490231
// CN
// CH
// IN

oci_free_statement($stid);
oci_close($conn);

?>

Примечания

Замечание:

Для запросов, которые возвращают большое количество рядов, производительность может быть значительно увеличена за счёт увеличения значения опции oci8.default_prefetch или вызова функции oci_set_prefetch().

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top