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