PHP Unconference Europe 2015

oci_get_implicit_resultset

(PECL OCI8 >= 2.0.0)

oci_get_implicit_resultsetDevuelve el siguiente recurso de sentencia hija desde un recurso de sentencia padre que posee Conjuntos de resultados implícitos de Oracle Database 12c

Descripción

resource oci_get_implicit_resultset ( resource $statement )

Usado para obtener conjuntos consecutivos de resultados de consultas destpués de la ejecución de un bloque almacenado o anónimo de PL/SQL de Oracle cuando dicho bloque devuelve resultados de consultas con la función de PL/SQL DBMS_SQL.RETURN_RESULT de Oracle. Esto permite a los bloques de PL/SQL devolver fácilmente resultados de consultas.

La sentencia hija puede usarse con cualquier función de obtención de OCI8: oci_fetch(), oci_fetch_all(), oci_fetch_array(), oci_fetch_object(), oci_fetch_assoc() or oci_fetch_row()

Las sentencias hijas heredan el valor de precarga de sus sentencias padres, o se puede establecer explícitamente con oci_set_prefetch().

Parámetros

statement

Un identificador de sentencia OCI8 válido creado mediante oci_parse() y ejecutada por oci_execute(). El identificador de sentencia podría o no estar asociado con una sentencia SQL que devuelva Conjuntos de resultados implícitos.

Valores devueltos

Devuelve un gestor de sentencia para la siguiente sentencia hija disponible en statement. Devuelve FALSE cuando no existan sentencias hijas, o todas las sentencia hijas han sido devueltas por llamadas anteriores a oci_get_implicit_resultset().

Ejemplos

Ejemplo #1 Obtener Conjuntos de resultados implícitos en un blucle

<?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>Nuevo Conjunto de resultados implícitos:</h2>\n";
    echo 
"<table>\n";
    while ((
$row oci_fetch_array($stid_cOCI_ASSOC+OCI_RETURN_NULLS)) != false) {
        echo 
"<tr>\n";
        foreach (
$row as $item) {
            echo 
"  <td>".($item!==null?htmlentities($itemENT_QUOTES|ENT_SUBSTITUTE):"")."</td>\n";
        }
        echo 
"</tr>\n";
    }
    echo 
"</table>\n";
}

// La salida es:
//    Nuevo Conjunto de resultados implícitos:
//     Beijing 190518
//     Bern    3095
//     Bombay  490231
//    Nuevo Conjunto de resultados implícitos:
//     CN
//     CH
//     IN

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

?>

Ejemplo #2 Obtener gestores de sentencias hijas individualemente

<?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_1OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);
$row oci_fetch_array($stid_2OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);
$row oci_fetch_array($stid_1OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);
$row oci_fetch_array($stid_2OCI_ASSOC+OCI_RETURN_NULLS);
var_dump($row);

// La salida es:
//    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);

?>

Ejemplo #3 Establecer explícitamente la Cuenta de precarga

<?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_c200);   // Set the prefetch before fetching from the child statement
echo "<table>\n";
while ((
$row oci_fetch_array($stid_cOCI_ASSOC+OCI_RETURN_NULLS)) != false) {
    echo 
"<tr>\n";
    foreach (
$row as $item) {
        echo 
"  <td>".($item!==null?htmlentities($itemENT_QUOTES|ENT_SUBSTITUTE):"")."</td>\n";
    }
    echo 
"</tr>\n";
}
echo 
"</table>\n";

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

?>

Ejemplo #4 Ejemplo de Conjunto de resultados implícitos sin usar oci_get_implicit_resultset()

Todos los resultados de todas las consultas son devueltas consecutivamente.

<?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 y oci_fetch() no se pueden usar de esta manera
echo "<table>\n";
while ((
$row oci_fetch_array($stidOCI_ASSOC+OCI_RETURN_NULLS)) != false) {
    echo 
"<tr>\n";
    foreach (
$row as $item) {
        echo 
"  <td>".($item!==null?htmlentities($itemENT_QUOTES|ENT_SUBSTITUTE):"")."</td>\n";
    }
    echo 
"</tr>\n";
}
echo 
"</table>\n";

// La salida es:
//    Beijing 190518
//    Bern 3095
//    Bombay 490231
//    CN
//    CH
//    IN

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

?>

Notas

Nota:

Para consultas que devuelven un gran número de filas, se puede mejorar el rendimiento significativamente incrementando oci8.default_prefetch o utilizando oci_set_prefetch().

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top