oci_get_implicit_resultset

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

oci_get_implicit_resultset — Oracle Database Implicit Result Sets가 있는 상위 명령문 리소스에서 다음 하위 명령문 리소스를 반환합니다.


설명

oci_get_implicit_resultset(resource $statement): resource|false

저장된 또는 익명의 Oracle PL/SQL 블록을 실행한 후 쿼리 결과의 연속 집합을 가져오는 데 사용되며, 여기서 해당 블록은 Oracle Database 12(또는 그 이상) DBMS_SQL.RETURN_RESULT PL/SQL 함수를 사용하여 쿼리 결과를 반환합니다. 이를 통해 PL/SQL 블록이 쿼리 결과를 쉽게 반환할 수 있습니다.

자식 명령문은 oci_fetch(), oci_fetch_all(), oci_fetch_array(), oci_fetch_object(), oci_fetch_assoc() 또는 oci_fetch_row()와 같은 OCI8 가져오기 함수와 함께 사용할 수 있습니다.

자식 문은 부모 문의 프리페치 값을 상속하거나 oci_set_prefetch()로 명시적으로 설정할 수 있습니다.


매개변수

statement
oci_parse()에 의해 생성되고 oci_execute()에 의해 실행되는 유효한 OCI8 문 식별자. 명령문 식별자는 암시적 결과 집합을 반환하는 SQL 문과 연결되거나 연결되지 않을 수 있습니다.

반환 값

statement에서 사용 가능한 다음 자식 명령문에 대한 명령문 핸들을 반환합니다. 자식 문이 존재하지 않거나 모든 자식 문이 oci_get_implicit_resultset()에 대한 이전 호출에 의해 반환된 경우 false를 반환합니다.


Examples

예제 #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>New Implicit Result Set:</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):"&nbsp;")."</td>\n";
        }
        echo "</tr>\n";
    }
    echo "</table>\n";
}

// Output is:
//    New Implicit Result Set:
//     Beijing 190518
//     Bern    3095
//     Bombay  490231
//    New Implicit Result Set:
//     CN
//     CH
//     IN

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

?>
                    
                  

예제 #2 자식 statement 핸들을 개별적으로 가져오기

                   
 <?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);

 // Output is:
 //    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);   // Set the prefetch before fetching from the child statement
  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):"&nbsp;")."</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);

// Note: oci_fetch_all and oci_fetch() cannot be used in this manner
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):"&nbsp;")."</td>\n";
    }
    echo "</tr>\n";
}
echo "</table>\n";

// Output is:
//    Beijing 190518
//    Bern 3095
//    Bombay 490231
//    CN
//    CH
//    IN

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

?>
                       
                     

노트

메모: 많은 수의 행을 반환하는 쿼리의 경우 oci8.default_prefetch를 늘리거나 oci_set_prefetch()를 사용하여 성능을 크게 향상시킬 수 있습니다.