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