PHP/OCI-无法从临时表中的Oracle过程中获取结果



我正试图使用PHP OCI Oracle函数做两件事:

  1. 在Oracle数据库中运行包过程
  2. 包运行后,查询一个临时表以获取过程操作的结果

我能够使用Oracle提供的SQL Developer软件成功地完成这项工作。我的查询非常基本,可以在下面看到:

BEGIN
PKG_KTY_SEARCH.PR_PRICE_LIST();
END;
/
SELECT * FROM kty_web.KTY_PROD_PRICE_TEMP;

上面的代码运行得很好,我在SQLDeveloper中得到了完整的结果表。

我正试图用OCI在PHP中做同样的事情。我的代码如下:

<?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!";
?>

但是,这不会返回任何错误,并且返回一个空的结果集。我不明白为什么。有人看到我遗漏了什么吗?

从PHP返回的结果集

{"PRODUCT_ID":[],"CUST_ROLE":[],"MIN_QTY":[],"MAX_QTY":[],"PRICE":[]}

我的连接字符串如下:

$config['oracleDb']['connectionString'] = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = " . $config['oracleDb']['host'] . ")(PORT = " . $config['oracleDb']['port'] . ")))(CONNECT_DATA=(SID=" . $config['oracleDb']['sid'] . ")))";

我使用PHP7.1.22Oracle 11g数据库。我能够在PHP中查询正常的表并获得结果,而不会出现问题,并获得完整的结果集。

临时表定义为on commit delete rows还是on commit preserve rows

默认情况下,oci_execute将在每次成功调用后隐式发出commit。假设您的临时表被定义为on commit delete rows,这将在后续查询之前删除行。您可以通过传递可选的第二个参数来改变这种行为

oci_execute($firstStid, OCI_DEFAULT);

然而,假设您这样做,您将需要执行显式oci_commit,以便关闭您打开的事务。

最新更新