5

你好。考虑以下:

SQL> DECLARE
  2     b1   BOOLEAN;
  3     b2   BOOLEAN;
  4     FUNCTION checkit RETURN BOOLEAN IS
  5     BEGIN
  6        dbms_output.put_line('inside checkit');
  7        RETURN TRUE;
  8     END checkit;
  9  
 10     PROCEDURE outp(n VARCHAR2, p BOOLEAN) IS
 11     BEGIN
 12        IF p THEN
 13           dbms_output.put_line(n||' is true');
 14        ELSE
 15           dbms_output.put_line(n||' is false');
 16        END IF;
 17     END;
 18  BEGIN
 19     b1 := TRUE OR checkit;
 20     outp('b1',b1);
 21     b2 := checkit OR TRUE;
 22     outp('b2',b2);
 23  END;
 24  /

b1 is true
inside checkit
b2 is true

PL/SQL procedure successfully completed

SQL> 

请注意,OR 语句的结果取决于顺序。如果我先调用函数,则无论其他项的值如何,都会执行该函数。似乎从左到右评估 OR 语句,直到获得 TRUE,此时处理停止并且结果为 TRUE。

我的问题是,这是我可以依靠的东西吗?或者这种行为会在未来的 PL/SQL 版本中改变吗?如果它可以改变,有没有办法强制评估我可以依赖的函数(不创建另一个变量并使用单独的赋值语句)?

4

6 回答 6

9

是的。PL/SQL从左到右执行逻辑表达式的短路求值。

于 2008-10-09T16:39:07.480 回答
1

如果它可以改变,有没有办法强制评估我可以依赖的函数(不创建另一个变量并使用单独的赋值语句)?

如果您要求即使在逻辑上多余的情况下也必须评估该函数,这意味着它执行的操作不是简单地返回 TRUE 或 FALSE,例如它可能会更新表。PL/SQL 函数具有这样的“副作用”并不是一种好的做法。

于 2008-10-09T16:58:58.393 回答
1

在文档中,它指出短路评估适用于 IF、CASE 和 CASE 表达式:我敢打赌,它也适用于您引用的示例,但从技术上讲并没有记录它这样做。可能值得向 Oracle 提出关于这种行为的罚单以确认它。

于 2008-10-09T19:01:45.510 回答
0

这称为“短路评估”,它是大多数语言的规范,包括 PL/SQL

于 2008-10-09T16:41:45.777 回答
0

它从左到右评估 OR 语句,从右到左评估 AND 语句。我没有找到任何关于它的文档。

于 2009-02-28T20:10:59.847 回答
0

“..and AND statements from right to left”到底是什么意思?
这是来自 oracle 文档=>

在下面的示例中,请注意当 valid 的值为 FALSE 时,无论 done 的值如何,整个表达式都会产生 FALSE:

有效并完成

您可以在以下示例中检查订单:

声明
b1 布尔值;
b2 布尔值;

FUNCTION checkit (v NUMBER)
RETURN BOOLEAN
IS
BEGIN
DBMS_OUTPUT.put_line ('inside checkit:' || v);
返回真;
结束检查;

PROCEDURE outp (n VARCHAR2, p BOOLEAN)
IS
BEGIN
IF p
THEN
DBMS_OUTPUT.put_line (n || 'is true');
ELSE
DBMS_OUTPUT.put_line (n || '为假');
万一;
结尾;
BEGIN
b1 := checkit (1) AND checkit (2);
输出('b1',b1);
b2 := checkit (3) AND checkit (4);
输出('b2',b2);
结尾;


内部 checkit:1
内部 checkit:2
b1 为真
内部 checkit:3
内部 checkit:4
b2 为真

于 2010-03-05T08:17:45.970 回答