【发布时间】: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.