【问题标题】:Using `SELECT` to call a function使用 `SELECT` 调用函数
【发布时间】:2015-12-22 15:07:21
【问题描述】:

我偶尔会遇到使用SELECT...INTO...FROM DUAL 调用函数的例子——例如:

SELECT some_function INTO a_variable FROM DUAL;

被使用,而不是

a_variable := some_function;

我对此的看法是,这不是一个好的做法,因为 A) 不清楚正在调用函数,并且 B) 效率低,因为它强制从 PL/SQL 引擎转换到 SQL 引擎(也许今天的问题不大)。

谁能解释为什么会这样做,例如这在早期的 PL/SQL 编码中是否有必要调用函数?我正在查看的代码可能最早可以追溯到 Oracle 8。

感谢任何见解。

【问题讨论】:

  • 我认为非常旧的 Oracle 版本(例如 Oracle 8 和 9)实际上并不支持函数赋值。
  • 请注意,select function from dual 还确保所述函数不会更改数据库状态 - 没有提交或其他 DDL,没有像更新/插入/删除这样的 DML。不过,我非常怀疑这就是原因。
  • 我认为从来没有必要以这种方式调用函数 - 这是 Oracle 7 函数文档:docs.oracle.com/cd/A57673_01/DOC/dcommon/oin/index.htm 虽然它没有显示赋值语句,但它确实显示了 @ 987654328@。我认为一些程序员就是这样做的——可能是他们在 PL/SQL 之前在 Forms 2.3 中使用的语言的回归(那叫什么?)
  • @TonyAndrews docs.oracle.com/cd/A57673_01/DOC/dcommon/oin/index.htm ,“避免错误”部分中的代码显示通过:=从用户定义的函数sign()分配一个变量,所以它在Oracle 7中工作。感谢链接顺便说一句,阅读并记录对更现代版本所做的更改很有趣。
  • 此部分确认 variable := function(); 在 Oracle 7 中是允许的:docs.oracle.com/cd/A57673_01/DOC/server/doc/PLS23/… expression: This is an arbitrarily complex combination of variables, constants, literals, operators, and function calls. The simplest expression consists of a single variable. For the syntax of expression, see "Expressions" on page 10 - 41. When the assignment statement is executed, the expression is evaluated and the resulting value is stored in the assignment target. The value and target must have compatible datatypes.

标签: oracle plsql


【解决方案1】:

这种做法可以追溯到之前 PLSQL 和 Oracle 7。如前所述,在 Oracle7 中分配是可能的(当然还有最佳实践)。

在 Oracle 7 之前,有两个广泛使用的工具需要使用 Select ... into var from dual;

一方面,曾经有一个名为 RPT 的 Oracle 工具,一种报告生成器。 RPT 可用于创建批处理。它有两种宏,可以组合起来实现我们今天使用的 PLSQL。我的第一个 Oracle 工作涉及调试由一个程序生成的 PLSQL,该程序采用 RPT 批处理并将它们自动转换为 PLSQL。 2000 年后不久,我扔掉了我唯一的 RPT 手册。

另一方面,Oracle Forms 2.x 及其菜单组件。 Oracle 菜单中的上下文切换通常是通过 Select ... from dual 来完成的; 我仍然记得当我发现一个难以处理的 Bug 是由总共 6 个 引起时我是多么自豪strong> Dual 表中的记录。

很抱歉,我无法证明这一切,但现在正是回首往事的时候,得到答案真的很有趣。

【讨论】:

  • 感谢您的信息!顺便说一句 - 我喜欢你的头像。我住在俄亥俄州欣克利附近,那里的火鸡秃鹰(当地称为“秃鹰”)是当地的标志(它们在欣克利岭上升的气流中冲浪——它就在我对面的马路)所以我在夏天经常看到这些动物,这就是为什么我可以从图片中识别出这只鸟的原因。我只是试着继续前进,希望他们不要不耐烦:-)。此外,我女儿在当地一家鸟类救援组织做志愿者,该组织治疗一些受伤的秃鹰(尽管它们的秃鹰更令人印象深刻:-)。无论如何,谢谢你的回答。
  • 另外 - 感谢您指出我的一些同事的编码习惯比我自己的更萎缩! ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多