PL / SQL评估订单

时间:2008-10-09 16:36:11

标签: oracle plsql

你好。请考虑以下事项:

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的未来版本中发生变化?如果它可以改变,有没有办法强制我可以依赖的函数被评估(不创建另一个变量并使用单独的赋值语句)?

6 个答案:

答案 0 :(得分:9)

是。 PL / SQL从左到右执行short circuit evaluation个逻辑表达式。

答案 1 :(得分:1)

  

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

如果您要求必须对该函数进行评估,即使它在逻辑上是多余的,这意味着它除了简单地返回TRUE或FALSE之外还执行某些操作,例如:也许它会更新一张桌子。 PL / SQL函数不具备这种“副作用”的好习惯。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这称为“短路评估”,它是大多数语言的标准,including PL/SQL

答案 4 :(得分:0)

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

答案 5 :(得分:0)

你到底是什么意思“和从右到左的AND语句”?
这是来自oracle documentation =>

在下面的示例中,请注意,当valid的值为FALSE时,无论done值是什么,整个表达式都会返回FALSE:

有效并完成

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

DECLARE
   b1 BOOLEAN;
   b2 BOOLEAN;

功能检查(v NUMBER)
      返回BOOLEAN
   IS
   BEGIN
      DBMS_OUTPUT.put_line('check checkit:'|| v);
      返回正确;
   结束检查;

PROCEDURE outp(n VARCHAR2,p BOOLEAN)
   IS
   BEGIN
      如果p       THEN
         DBMS_OUTPUT.put_line(n ||'是真');
      ELSE
         DBMS_OUTPUT.put_line(n ||'为false');
      结束IF;
   END;
BEGIN
   b1:= checkit(1)AND checkit(2);
   outp('b1',b1);
   b2:= checkit(3)AND checkit(4);
   outp('b2',b2);
END;


内部检查:1
内部检查:2
b1是真的 内部检查:3
内部检查:4
b2是真的