是否允许使用管道的PL/SQL表函数?
-
22-09-2019 - |
题
管道函数的文档说DML在SQL语句中使用时不允许使用DML(通常 SELECT
),在大多数示例中,管道式功能用于数据生成或转换(接受CUSTOR作为参数),但不发出任何DML语句。
现在,从技术上讲,可以使用Oracle的任何错误使用选择(ORA 14551 不会发生)。但是,我经历了选择的可重复性奇怪行为。虽然 PRAGMA AUTONOMOUS_TRANSACTION
是 不是 被使用,由 SELECT
似乎 不是 始终考虑当前的本地交易,这对我来说就像一个错误。更令人不安的是,当使用分布式事务(例如通过Oramt而不是本地交易)时,使用交易。
编辑: 事实证明,奇怪的效果似乎与查询中的一些陈述有关,有时可以使用,有时不起作用(取决于甲骨文优化器的当前情绪,至少在10克中)。在某些情况下,我得到了一个ORA-32036,然后就不会再次发生代码。现在看来有时会因ORA-32036而失败的查询是也无法使用正确的事务的查询,并且可能与管道式函数无关。
所以我的具体问题是:
是否有任何官方声明,是否有任何官方声明是否存在
SELECT
在管道上的表函数中,允许其交易上下文是什么?是否有另一种方法可以在SQL语句中模块化常用查询(就像表函数一样
TABLE()
)?有没有人经历过这种行为,并且可能对此有更多的了解?我已经研究了Metalink,但不幸的是,我没有找到有关该主题的任何特定内容。
解决方案
通常,DML限制仅涉及修改(更新,删除...)语句,因此选择应该可以。我将尝试从Oracle找到一个具体的说明。
视图将是您模块化常用查询的第一个工具。
函数具有视图的缺点:如果从另一个选择中调用它们,则它们不会在与主选择的时间点相同的时间点执行。每个调用选择是一致的,但是由于选择在功能代码中,而不是在主SQL中,您可能会返回不一致的结果。视图和子选项是不可能的:如果大语句调用视图视图,则视图在与主查询的时间点相同的时间点构建。
更新: :关于您对参数化查询的评论
您可以构建参数化视图,即在执行之前设置的变量取决于视图。 这是Asktom上的一个示例 展示您如何做到这一点 userenv('client_info')
或者 dbms_session.set_context
.