gpt4 book ai didi

从 Oracle 全局临时表中选择的 PHP 问题

转载 作者:搜寻专家 更新时间:2023-10-31 21:18:39 34 4
gpt4 key购买 nike

我有一个 Oracle 全局临时表,它是“ON COMMIT DELETE ROWS”。

我有一个循环,其中我:

  • 插入全局临时表
  • 从全局临时表中选择(后处理)
  • 提交,以便在循环的下一次迭代之前清除表

插入是通过调用 oci_execute($stmt, OCI_DEFAULT) 完成的。通过调用 oci_fetch_all($stmt, $result, 0, -1, OCI_FETCHSTATEMENT_BY_ROW | OCI_ASSOC) 进行检索。之后,进行提交:oci_commit()。

问题是检索有时会起作用,有时我会遇到以下错误之一:

  • ORA-08103: 对象不再存在
  • ORA-01410: ROWID 无效

好像 session 无法“看到”它之前插入的记录。

您知道是什么原因造成的吗?

谢谢。

最佳答案

你在使用连接池吗?如果是这样,则可能是不同的调用在不同的 session 中执行。

更好的解决方案是使用单个 PL/SQL 过程来填充临时表并在单个调用中返回结果集。然后提出了一个更好的解决方案:完全取消临时表。

Oracle中很少有需要使用临时表的情况。大多数事情都可以通过纯 SQL 或批量收集到嵌套表中来解决。在插入和随后的选择之间,您对临时表中的数据进行了哪些实际操作?

编辑

临时表会影响性能 - 行会写入磁盘。 PL/SQL 集合保留在( session )内存中,因此速度更快。当然,因为它们在 session 内存中,所以它们不会解决您遇到的连接池问题。

您需要将数据分块的原因是因为您不想一次性将 200,000 行传递给您的 PHP?如果我想进一步帮助你,我想我需要更多的背景信息。

关于从 Oracle 全局临时表中选择的 PHP 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2765276/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com