当前位置: 首页 > 面试题库 >

是否允许在流水线PL / SQL表函数中使用SELECT?

闾丘玺
2023-03-14
问题内容

有关流水线函数的文档说,在SQL语句(通常是a
SELECT)中使用DML时是不允许的,并且在大多数示例中,流水线函数用于数据生成或转换(接受custor作为参数),但不发布任何DML。 DML语句。

现在,从技术上讲,可以使用SELECT而不会出现Oracle的任何错误(不会发生ORA 14551)。但是,我有选择的可重现的奇怪行为的经验;即使PRAGMA AUTONOMOUS_TRANSACTION没有 被使用,被检索的行SELECT似乎 并不
总是把当前本地事务考虑进去,这感觉就像我的错误。更令人不安的是,当使用分布式事务(例如,通过ORAMTS而不是本地事务)时,会使用该事务

编辑:
事实证明,这种奇怪的效果似乎与查询中的某些WITH语句有关,有时可能起作用,有时却不起作用(取决于Oracle优化器的当前状态,至少在10g中)。在某些情况下,我得到了ORA-32036,然后再次发生,即使不更改代码也不会发生。现在看来,有时因ORA-32036而失败的查询也是那些也未能使用正确事务的查询,并且它可能与流水线功能无关。

所以我的具体问题是:

  • 是否有任何(最好是官方的)声明是否SELECT允许流水线表函数中的以及它们的事务上下文是什么?

  • 有没有其他方法可以模块化可在SQL语句中使用的常用查询(就像表函数可以使用一样TABLE())?

  • 有没有人也经历过这种行为,也许对此有更多了解?我已经研究了metalink,但是不幸的是,我没有找到关于该主题的任何具体信息。


问题答案:
  1. 通常,DML限制仅涉及修改(UPDATE,DELETE …)语句,因此SELECT应该可以。我将尝试从Oracle查找特定声明。

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

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

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

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



 类似资料:
  • 问题内容: 所以我有一个功能可以检查预订表中有多少取消: 要在SQL中执行他,我使用: 我的结果是: 我的问题是有人可以帮助我在JAVA中调用该函数吗,我尝试过但没有运气。 问题答案: Java提供了这样的目的。 将打印与在pl / sql中相同的内容。根据文档, 创建一个CallableStatement对象以调用数据库存储过程。CallableStatement对象提供了用于设置其IN和OUT

  • 主要内容:1. 创建函数,2. 调用函数,3. PL/SQL递归函数在本章中,我们将讨论和学习PL/SQL中的函数。函数与过程(也叫程序)相同,只不过函数有返回一个值,而过程没有返回值。 因此,上一章中所有有关存储过程的内容也适用于函数。 1. 创建函数 使用语句创建独立函数。语句的简化语法如下: 其中, function-name是指定要创建的函数的名称。 [OR REPLACE]选项指示是否允许修改现有的函数。 可选参数列表包含参数的名称,模式和类型。 表示将

  • 问题内容: 我是管道功能概念的新手。我有一些关于 从数据库的角度来看: 管道功能到底是什么? 使用管道功能的好处是什么? 使用管道功能解决了哪些挑战? 使用管道功能有什么优化优势? 谢谢。 问题答案: 引用“问汤姆·甲骨文”: 流水线函数只是“您可以假装为数据库表的代码” 流水线函数使您(让我惊讶) 在您认为可以使用它的任何时候-从函数而不是表中选择*可能是“有用的”。 就优点而言:使用Pipel

  • 在下面的代码中,函数 不会执行,但是我可以在订阅者中打印错误。似乎不允许在映射器函数中使用链接。正确吗?如果是,为什么? 编辑:也尝试了平面图,但结果相同。

  • 问题内容: 我在这里的研究中得到了不同的答案。 有人可以验证Redis服务器只能存储任何数值的表示吗? 例如,如果我在lpush中使用具有双重类型的Java客户端(Jedis),在发送给Redis之前是否需要将其转换为等效于字符串类型的内容? 还是有一种方法可以发送诸如double之类的实际数字类型?如果是这样,是否有任何示例代码说明了如何实现此目的? 谢谢 问题答案: Redis将所有内容存储在

  • 我有一个函数,它在PL/SQL中返回一个布尔值。我曾尝试直接获取那个布尔值,但没有成功,所以现在我试图将其转换为字符串(我不想修改数据库): 此代码在数据库中正常工作: