2008-10-09 67 views
4

你好。考慮以下內容:PL/SQL評估排序

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版本中這種行爲會改變嗎?如果它可以改變,是否有辦法強制我可以依賴的函數進行評估(無需創建另一個變量並使用單獨的賦值語句)?

回答

8

是的。 PL/SQL從左到右執行邏輯表達式的short circuit evaluation

+0

PERFECTO。正是我在找的! – DCookie 2008-10-09 16:42:00

+0

我的谷歌「pl/sql完整布爾評估」給了我完全相同的鏈接。 – JosephStyons 2008-10-09 16:42:23

1

如果它可以改變,是否有辦法強制我可以依賴的函數進行評估(無需創建另一個變量並使用單獨的賦值語句)?

如果您需要即使在邏輯上多餘的情況下也必須避免該功能,這意味着它不是僅僅返回TRUE或FALSE,而是執行其他操作。也許它更新了一張桌子。對PL/SQL函數來說,這種「副作用」並不被認爲是好的做法。

1

在文檔中指出短路評估適用於IF,CASE和CASE表達式:我敢打賭,它也適用於您引用的示例,但它在技術上沒有記錄。爲了得到它的確認,可能值得與甲骨文就此行爲提出一張票。

0

它從左向右評估OR語句,從右向左評估AND語句。我沒有發現自己的任何文件。

0

你是什麼意思,「......和AND語句從右到左」?
這是來自Oracle文檔=>

在以下示例中,注意到,當有效有FALSE的值,整個表達式不管產生的完成的值FALSE:

有效和做過

您可以在下面的例子檢查順序:

DECLARE
B1布爾值;
b2 BOOLEAN;

FUNCTION checkit(ⅴNUMBER)
RETURN BOOLEAN
IS
BEGIN
DBMS_OUTPUT。put_line('checkit:'|| v);
RETURN TRUE;
END checkit;

PROCEDURE OUTP(N VARCHAR2,第BOOLEAN)
IS
BEGIN
如果P
THEN
DBMS_OUTPUT.PUT_LINE(N || '爲真');
ELSE
DBMS_OUTPUT.put_line(n ||'is false');
END IF;
END;
BEGIN
b1:= checkit(1)AND checkit(2);
outp('b1',b1);
b2:= checkit(3)AND checkit(4);
outp('b2',b2);
END;


內部checkit:1
內部checkit:2
b1爲真
內部checkit:3
內checkit:4
b2爲真