管道函数的文档说DML在SQL语句中使用时不允许使用DML(通常 SELECT),在大多数示例中,管道式功能用于数据生成或转换(接受CUSTOR作为参数),但不发出任何DML语句。

现在,从技术上讲,可以使用Oracle的任何错误使用选择(ORA 14551 不会发生)。但是,我经历了选择的可重复性奇怪行为。虽然 PRAGMA AUTONOMOUS_TRANSACTION不是 被使用,由 SELECT 似乎 不是 始终考虑当前的本地交易,这对我来说就像一个错误。更令人不安的是,当使用分布式事务(例如通过Oramt而不是本地交易)时,使用交易。

编辑: 事实证明,奇怪的效果似乎与查询中的一些陈述有关,有时可以使用,有时不起作用(取决于甲骨文优化器的当前情绪,至少在10克中)。在某些情况下,我得到了一个ORA-32036,然后就不会再次发生代码。现在看来有时会因ORA-32036而失败的查询是也无法使用正确的事务的查询,并且可能与管道式函数无关。

所以我的具体问题是:

  • 是否有任何官方声明,是否有任何官方声明是否存在 SELECT在管道上的表函数中,允许其交易上下文是什么?

  • 是否有另一种方法可以在SQL语句中模块化常用查询(就像表函数一样 TABLE())?

  • 有没有人经历过这种行为,并且可能对此有更多的了解?我已经研究了Metalink,但不幸的是,我没有找到有关该主题的任何特定内容。

有帮助吗?

解决方案

  1. 通常,DML限制仅涉及修改(更新,删除...)语句,因此选择应该可以。我将尝试从Oracle找到一个具体的说明。

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

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

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

您可以构建参数化视图,即在执行之前设置的变量取决于视图。 这是Asktom上的一个示例 展示您如何做到这一点 userenv('client_info') 或者 dbms_session.set_context.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top