Estoy intentando hacer dos cosas usando las funciones PHP OCI Oracle:
- Ejecute un procedimiento de paquete dentro de una base de datos Oracle.
- Una vez que se haya ejecutado el paquete, consulte una tabla temporal para obtener los resultados de la operación del procedimiento.
Puedo hacer esto con éxito usando el software SQL Developer proporcionado por Oracle. Mi consulta es extremadamente básica y se puede ver a continuación:
BEGIN
PKG_KTY_SEARCH.PR_PRICE_LIST();
END;
/
SELECT * FROM kty_web.KTY_PROD_PRICE_TEMP;
Este código anterior funciona perfectamente y obtengo una tabla completa de resultados en SQL Developer.
Estoy intentando hacer lo mismo en PHP usando OCI. Mi código se puede ver a continuación:
<?php
// Load up the system.
require('../../system/init.php');
global $config;
$oracleDb = oci_new_connect($config['oracleDb']['username'], $config['oracleDb']['password'], $config['oracleDb']['connectionString']);
$firstStid = oci_parse($oracleDb, "BEGIN PKG_KTY_SEARCH.PR_PRICE_LIST(); END;");
oci_execute($firstStid);
$secondStid = oci_parse($oracleDb, "SELECT * FROM kty_web.KTY_PROD_PRICE_TEMP");
oci_execute($secondStid);
oci_fetch_all($secondStid, $result);
echo json_encode($result);
echo "<br />Import complete!";
?>
Sin embargo, esto no devuelve errores y un conjunto de resultados vacío. No puedo entender por qué. ¿Alguien ve algo obvio aquí que me estoy perdiendo?
Conjunto de resultados devuelto por PHP
{"PRODUCT_ID":[],"CUST_ROLE":[],"MIN_QTY":[],"MAX_QTY":[],"PRICE":[]}
Mi cadena de conexión es la siguiente:
$config['oracleDb']['connectionString'] = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = " . $config['oracleDb']['host'] . ")(PORT = " . $config['oracleDb']['port'] . ")))(CONNECT_DATA=(SID=" . $config['oracleDb']['sid'] . ")))";
Estoy usando PHP7.1.22 y la base de datos Oracle 11g . Puedo consultar tablas normales y obtener resultados sin problemas dentro de PHP y obtener un conjunto de resultados completo.
oci_execute()
llamadas, lo que significa al menos dos "viajes de ida y vuelta" a la base de datos. Para obtener rendimiento y escalabilidad, ¿puede agregar la consulta al primer bloque anónimo y devolver un CURSOR DE REF con los resultados de la consulta?Respuestas:
¿La tabla temporal se define como
on commit delete rows
o comoon commit preserve rows
?Por defecto,
oci_execute
emitirá implícitamente uncommit
después de cada llamada exitosa. Suponiendo que su tabla temporal se define comoon commit delete rows
, eso eliminará las filas antes de la consulta posterior. Puede cambiar ese comportamiento pasando un segundo parámetro opcionalSin embargo, suponiendo que haga esto, deseará hacer un
oci_commit
pedido explícito para cerrar la transacción que ha abierto.fuente