流水线函数的文档说 DML 在 SQL 语句(通常是 a )中使用时是不允许的SELECT
,并且在大多数示例中,流水线函数用于数据生成或转换(接受 custor 作为参数),但不发出任何DML 语句。
现在,从技术上讲,可以使用 SELECTs 而不会出现 Oracle 的任何错误(不会出现ORA 14551 )。但是,我遇到了可重现的选择奇怪行为;即使PRAGMA AUTONOMOUS_TRANSACTION
没有被使用,检索到的行似乎并不总是考虑当前的本地事务,这对我来说就像一个错误。更令人不安的是,当使用分布式事务(例如通过 ORAMTS 而不是本地事务)时,会使用事务。SELECT
编辑:事实证明,奇怪的效果似乎与查询中的某些 WITH 语句有关,这些语句有时有效,有时无效(取决于 Oracle 优化器的当前情绪,至少在 10g 中)。在某些情况下,我得到一个 ORA-32036,然后它又没有发生,根本没有更改代码。现在看起来,有时使用 ORA-32036 失败的查询似乎也未能使用正确的事务,并且可能与流水线功能无关。
所以我的具体问题是:
是否有任何(最好是官方的)声明是否
SELECT
允许流水线表函数中的 s 以及它们的事务上下文是什么?是否有另一种模块化可以在 SQL 语句中使用的常用查询的方法(就像表函数可以使用
TABLE()
)?有没有人也经历过这种行为,并且可能对此了解更多?我研究了metalink,但不幸的是我没有找到任何关于这个主题的具体内容。