oci_get_implicit_resultset
(PHP 5 >= 5.6.0, PHP 7, PECL OCI8 >= 2.0.0)
oci_get_implicit_resultset — Oracle Database の暗黙の結果セットを持つ親ステートメント・リソースから次の子ステートメント・リソースを返す
説明
oci_get_implicit_resultset
( resource $statement
) : resource
ストアドまたは匿名の Oracle PL/SQL ブロックを実行後、 クエリの結果の連続したセットを取得するために使用されます。 そのブロックは、Oracle Database 12 (またはそれ以降) の DBMS_SQL.RETURN_RESULT PL/SQL 関数によりクエリの結果を返します。 これにより、PL/SQL ブロックはクエリ結果を簡単に返すことができます。
子ステートメントは、任意の OCI8 取得関数とともに使用できます。 その関数は、oci_fetch()、oci_fetch_all()、 oci_fetch_array()、oci_fetch_object()、 oci_fetch_assoc() または oci_fetch_row() です。
子ステートメントは、それらの親ステートメントのプリフェッチ値を継承するか、 または oci_set_prefetch() により明示的に設定することができます。
パラメータ
statement
- oci_parse() により作成され、 oci_execute() により実行される 有効な OCI8 ステートメント ID 。 そのステートメント ID は、 暗黙の結果セットを返す SQL 文に関連づけられているかもしれませんし、 いないかもしれません。
返り値
statement
上で使用可能な
次の子ステートメントに対する文ハンドラを返します。
子ステートメントが存在しないか、
または oci_get_implicit_resultset() への前の呼び出しにより、
すべての子ステートメントが返されていた場合、
false
を返します。
例
例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// 新規の暗黙の結果セット:// CN// CH// INoci_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 および 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// INoci_free_statement($stid);oci_close($conn);?>
注意
注意:
大量の行を返すクエリの場合、 oci8.default_prefetch を増やすか oci_set_prefetch() を使えばパフォーマンスが劇的に向上します。