我有一个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()。
问题是检索有时会起作用,有时我会收到以下错误之一:
好像会话无法“看到”之前插入的记录。
你知道造成这种情况的原因是什么吗?
感谢。
答案 0 :(得分:2)
您使用的是连接池吗?如果是这样,则可能是在不同的会话中执行不同的调用。
更好的解决方案是使用单个PL / SQL过程填充临时表并在单个调用中返回结果集。然后提出了一个更好的解决方案:完全取消临时表。
Oracle中几乎没有需要使用临时表的情况。大多数东西都可以用纯SQL解决,也可以大量收集到嵌套表中。在插入和后续选择之间,您对临时表中的数据进行了哪些实际操作?
修改强>
临时表的性能受到影响 - 行被写入磁盘。 PL / SQL集合保留在(会话)内存中,因此速度更快。当然,因为它们处于会话内存中,所以它们无法解决连接池的问题。
您是否需要将数据分块,因为您不希望一下子向您的PHP传递200,000行?如果我能帮助你,我想我需要更多的背景。