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

「右から左へのANDステートメント」とは正確にはどういう意味ですか?
これはoracleドキュメントからのものです=>

次の例では、validの値がFALSEの場合、doneの値に関係なく、式全体がFALSEになることに注意してください。

有効かつ完了

次の例で順序を確認できます。

b1
ブール値を宣言します。
b2ブール値;

FUNCTION checkit(v NUMBER)
RETURN BOOLEAN
IS
BEGIN
DBMS_OUTPUT.put_line('inside checkit:' || v);
真に戻る;
checkitを終了します。

PROCEDURE outp(n VARCHAR2、p BOOLEAN)
IS
BEGIN
IF p
THEN
DBMS_OUTPUT.put_line(n ||'はtrue');
ELSE
DBMS_OUTPUT.put_line(n ||'はfalse');
END IF;
終わり;
BEGIN
b1:= checkit(1)AND checkit(2);
outp('b1'、b1);
b2:= checkit(3)AND checkit(4);
outp('b2'、b2);
終わり;


チェックイットの内側:1
チェックイットの内側:2b1
はチェックイットの
内側:3チェックイットの
内側:4b2
は真

于 2010-03-05T08:17:45.970 に答える
0

OR ステートメントは左から右に評価され、AND ステートメントは右から左に評価されます。私はそれに関するドキュメントを見つけられませんでした。

于 2009-02-28T20:10:59.847 に答える
0

これは「短絡評価」と呼ばれ、PL/SQL を含むほとんどの言語で標準になっています。

于 2008-10-09T16:41:45.777 に答える