2

流水线函数的文档说 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,但不幸的是我没有找到任何关于这个主题的具体内容。

4

1 回答 1

1
  1. 通常 DML 限制只涉及修改(UPDATE,DELETE ...)语句,因此 SELECT 应该没问题。我将尝试从 Oracle 中找到具体的声明。

  2. 视图将是您将常用查询模块化的第一个工具。

  3. 函数相对于视图有一个缺点:如果从另一个 SELECT 调用它们,它们不会在与主 SELECT 相同的时间点执行。对 SELECT 的每次调用都是一致的,但由于 SELECT 在函数代码中而不是在主 SQL 中,因此您可能会返回不一致的结果。这对于视图和子选择是不可能的:如果一个大语句调用一个视图,则视图是在与主查询相同的时间点构建的。

更新:关于您对参数化查询的评论

您可以构建参数化视图,即依赖于执行前设置的变量的视图。这是 AskTom 上的一个示例,展示了如何使用userenv('client_info')or进行操作dbms_session.set_context

于 2009-10-21T06:46:55.637 回答