运行填充临时表的存储过程,然后从临时表中进行选择
P粉551084295
P粉551084295 2023-09-09 14:20:33
[PHP讨论组]

我有一个填充全局临时表的存储过程。

CREATE GLOBAL TEMPORARY TABLE temptable
(
...
)
ON COMMIT DELETE ROWS;

我想运行存储过程,然后选择添加到临时表中的行。

$conn = oci_connect(...);
$sql = "BEGIN POPULATETEMPTABLE END;"
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);
oci_free_statement($stmt);

$sql = "SELECT ... FROM temptable";
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);

while ($row = oci_fetch_assoc($stmt))
{
    ...
}

oci_free_statement($stmt);
oci_close($conn);

该代码未获取任何行。所以我决定将选择放在数据库的同一个往返中:

$conn = oci_connect(...);
$sql = "
    BEGIN POPULATETEMPTABLE END;
    SELECT ... FROM temptable
"
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);

while ($row = oci_fetch_assoc($stmt))
{
    ...
}

oci_free_statement($stmt);
oci_close($conn);

这给了我错误:

PLS-00103: Encountered the symbol "SELECT"

如果我将 SELECT 放在 BEGIN ... END 内;然后我得到这个错误:

PLS-00428: an INTO clause is expected in this SELECT statement

如何在 PHP 中运行填充临时表的存储过程,然后从中进行选择?

它可以在 SQL Developer 中运行,但不能在 PHP 中运行。

使用:

PHP 8.1.4
Oracle 19.0.0.0.0

P粉551084295
P粉551084295

全部回复(1)
P粉432930081

第一个问题是因为 oci_execute() 默认提交,因此调用 POPULATETEMPTABLE 插入的任何行都会被 ON COMMIT DELETE ROWS 清除; 定义。

通过更改为修复此问题:

$sql = "BEGIN POPULATETEMPTABLE END;"
$stmt = oci_parse($conn, $sql);
oci_execute($stmt, OCI_NO_AUTO_COMMIT);

将 SELECT 放入 PL/SQL 块中的第二个问题是因为这是无效的 PL/SQL。使用参考游标或隐式结果集。请参阅 OCI8 文档或 地下 PHP 和 Oracle 手册

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号