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

时间:2010-05-04 12:38:15

标签: php sql oracle

我有一个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

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

你知道造成这种情况的原因是什么吗?

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

Oracle中几乎没有需要使用临时表的情况。大多数东西都可以用纯SQL解决,也可以大量收集到嵌套表中。在插入和后续选择之间,您对临时表中的数据进行了哪些实际操作?

修改

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

您是否需要将数据分块,因为您不希望一下子向您的PHP传递200,000行?如果我能帮助你,我想我需要更多的背景。