【问题标题】:PHP/OCI - Unable to get results from Oracle procedure within a temporary tablePHP/OCI - 无法从临时表中的 Oracle 过程中获取结果
【发布时间】:2020-07-24 16:38:53
【问题描述】:

我正在尝试使用 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;

上面的代码完美运行,我在 SQL Developer 中获得了完整的结果表。

我正在尝试使用 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 中毫无问题地获得结果并获得完整的结果集。

【问题讨论】:

  • 也许这个帖子有用:stackoverflow.com/questions/41506335/…
  • 感谢您传递此信息,Eduardo。将与我的 DBA 一起审查并获得他们对此的反馈。
  • 虽然这听起来像是数据库连接或权限问题,但您仍应在代码中添加一些错误检查。查看OCI8 manual error examples。另请查看The Underground PHP and Oracle Manual
  • 与解决方案无关,但这可能有用:您正在进行两次oci_execute() 调用,这意味着至少两次“往返”到数据库。为了性能和可扩展性,您可以将查询添加到第一个匿名块并返回带有查询结果的 REF CURSOR。

标签: php oracle oracle-call-interface


【解决方案1】:

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

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

oci_execute($firstStid, OCI_DEFAULT);

但是,假设您这样做,您将需要明确地执行 oci_commit 以关闭您打开的事务。

【讨论】:

  • 这成功了!不敢相信事情就这么简单。谢谢贾斯汀! :)
猜你喜欢
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2016-03-27
  • 2013-12-23
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多