php - PHP/OCI - 无法从临时表中的 Oracle 过程中获取结果
问题描述
我正在尝试使用 PHP OCI Oracle 函数做两件事:
- 在 Oracle 数据库中运行包过程。
- 包运行后,查询临时表以获取过程操作的结果。
我可以使用 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.22和Oracle 11g数据库。我能够查询普通表并在 PHP 中毫无问题地获得结果并获得完整的结果集。
解决方案
临时表是定义为on commit delete rows
还是定义为on commit preserve rows
?
默认情况下,每次成功调用后oci_execute
都会隐式发出一个。commit
假设您的临时表定义为on commit delete rows
,这将删除后续查询之前的行。您可以通过传递可选的第二个参数来更改该行为
oci_execute($firstStid, OCI_DEFAULT);
但是,假设您这样做,您将需要执行显式操作oci_commit
以关闭您打开的事务。
推荐阅读
- microsoft-cognitive - QnA Maker 服务未显示在“我的知识库”中
- python - 由于数据库输入错误,切换到特定类别的列
- python - 如何在Django中动态调用模板中的视图函数
- node.js - 在 express.js 中使用 .unless 来避免对几个路由进行 jsonwebtoken 验证
- jquery - 使用asp.net通用(testUpload.ashx Page)处理程序上传图像在jquery ajax调用中引发跨域访问错误
- c# - 从绘制的表格生成 C# 代码
- sql-server - 左外连接 3 个表 -SQL SERVER
- wordpress - 为 Genesis Framework 上的 WooCommerce 页面强制使用不同的布局
- mysql - 多动态行到多列 MySQL
- python - 计算 Pandas 系列浮点数中的出现次数