PHPOCI - 无法从临时表中的Oracle存储过程中获取结果。

问题描述 投票:8回答:1

我试图使用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中得到了一整张表的结果。

我试图在PHP中使用OCI做同样的事情。我的代码可以在下面看到。

<?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中查询正常的表并顺利得到结果,并得到一个完整的结果集。

php oracle oci
1个回答
1
投票

临时表是否被定义为 on commit delete rows 或作为 on commit preserve rows?

默认的。oci_execute 将隐含地发出一个 commit 在每一次成功调用后,都会有一个临时表。 假设你的临时表被定义为 on commit delete rows,这将在后续查询之前删除这些记录。 你可以通过传递一个可选的第二个参数

oci_execute($firstStid, OCI_DEFAULT);

然而,假设你这样做,你会想做一个明确的 oci_commit 以关闭您所打开的交易。

© www.soinside.com 2019 - 2024. All rights reserved.