PHP / OCI: no se pueden obtener resultados del procedimiento de Oracle dentro de una tabla temporal

8

Estoy intentando hacer dos cosas usando las funciones PHP OCI Oracle:

  1. Ejecute un procedimiento de paquete dentro de una base de datos Oracle.
  2. 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.

ZettaGeek
fuente
1
Quizás este hilo pueda ser útil: stackoverflow.com/questions/41506335/…
Eduardo Almeida
1
Gracias por pasar esto, Eduardo. Lo revisaré con mi DBA y obtendré sus comentarios sobre esto.
ZettaGeek
2
Aunque parezca una conexión de base de datos o un problema de privilegios, aún debe agregar algunos errores de verificación en su código. Revise los ejemplos de error del manual OCI8 . También revise el Manual PHP y Oracle subterráneo .
Christopher Jones
2
No está relacionado con la solución, pero esto puede ser útil: está haciendo dos 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?
Christopher Jones

Respuestas:

1

¿La tabla temporal se define como on commit delete rowso como on commit preserve rows?

Por defecto, oci_executeemitirá implícitamente un commitdespués de cada llamada exitosa. Suponiendo que su tabla temporal se define como on commit delete rows, eso eliminará las filas antes de la consulta posterior. Puede cambiar ese comportamiento pasando un segundo parámetro opcional

oci_execute($firstStid, OCI_DEFAULT);

Sin embargo, suponiendo que haga esto, deseará hacer un oci_commitpedido explícito para cerrar la transacción que ha abierto.

Justin Cave
fuente
Esto funcionó! No puedo creer que fuera así de simple. Gracias justin! :)
ZettaGeek