运行填充临时表的存储过程,然后从临时表中进行选择
P粉551084295
P粉551084295 2023-09-09 14:20:33
0
1
471

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

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 手册

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板