16

BOOLEANOracleフォームのPL/SQLブロック内に変数があるとします。

DECLARE
  is_viewable BOOLEAN;
BEGIN
  is_viewable := ...;

  IF NOT is_viewable THEN
    raise_my_error(); // pseudo-code
  END IF;
END;

デバッガーを使用してこのコードを数回ステップ実行した後、呼び出されraise_my_error() ないことがわかりました。明確にするために:

  • raise_my_error()次の場合は呼び出されませis_viewable = TRUE
  • raise_my_error()次の場合は呼び出されませis_viewable = FALSE

初期テストでは、この動作はOracleForms内で実行されるPL/ SQLコードに限定されており、データベース内で直接実行されるPL / SQLコードではないことが示されています(間違っている可能性があります)。

is_viewable明示的に比較することでこれを回避できますFALSE

IF is_viewable = FALSE THEN
  raise_my_error();
END IF;

NOT is_viewableなぜ評価されないのか、私はまだ興味がありTRUEます。

更新:デバッガーに正しい値が表示されておらず、この質問は無効になっているようです。その混乱について申し訳ありません。

4

6 に答える 6

19

これを SQLPlus でテストして、3 つの状況 (true、false、null) のそれぞれで何が起こるかを確認できます。

set serveroutput on

declare
  true_value boolean := true;
  false_value boolean := false;
  null_value boolean;
begin

    if not true_value then  --Should not pass
      dbms_output.put_line('True Value');
    end if;

    if not false_value then --Should pass
      dbms_output.put_line('False Value');
    end if;

    if null_value is null then --Just to make sure it is null
      dbms_output.put_line('Null Value is Null');
    end if;

    if not null_value then --Should not pass
      dbms_output.put_line('Null Value');
    end if;
end;
/

生成するもの:

SQL> set serveroutput on
SQL>
SQL> declare
  2    true_value boolean := true;
  3    false_value boolean := false;
  4    null_value boolean;
  5  begin
  6
  7      if not true_value then  --Should not pass
  8        dbms_output.put_line('True Value');
  9      end if;
 10
 11      if not false_value then --Should pass
 12        dbms_output.put_line('False Value');
 13      end if;
 14
 15      if null_value is null then --Just to make sure it is null
 16        dbms_output.put_line('Null Value is Null');
 17      end if;
 18
 19      if not null_value then --Should not pass
 20        dbms_output.put_line('Null Value');
 21      end if;
 22  end;
 23  /
False Value
Null Value is Null

PL/SQL procedure successfully completed.

SQL>

したがって、期待される出力を生成できる唯一の可能なコード パスは、条件に入る値が false の場合です。それがあなたが見ている、または期待しているものではない場合、あなたの手順または副作用として何か他のことが起こっているに違いありません.

于 2009-12-31T07:08:27.703 に答える
4

NOT is_viewableTRUEが である場合にのみに評価されis_viewableますFALSE

あなたの場合、is_viewableおそらくNULL;に設定されています。おそらく、Forms デバッガーは、このシナリオで "FALSE" を表示し、混乱を招きます。

代わりに次のコードを試してください。

IF NOT is_viewable THEN 
   raise_my_error();
ELSIF is_viewable IS NULL THEN
   raise_another_error();
END IF;
于 2009-12-10T03:15:20.363 に答える
4

変数に設定されている値は? 値が null の場合、ブロックは実行されないことを理解してください。それがあなたの問題かどうかはわかりませんが、例を次に示します。

DECLARE
is_viewable BOOLEAN;
BEGIN
  IF NOT is_viewable
  THEN
      /* this won't execute */
      dbms_output.put_line('nope');
  END IF;
  IF is_viewable
  THEN
      /* neither will this */
      dbms_output.put_line('nope');
  END IF;
END;

もちろん、Oracle Forms がどのように別の方法でそれを行うかはわかりませんが、何らかの方法で変数を null に設定しているのかもしれません。

于 2009-12-09T20:38:29.570 に答える
2

宣言時に is_viewable の初期値を設定する必要があります。Oracle は、宣言時に BOOLANS のデフォルト値を設定しません。宣言されているときに BOOLEAN の値を設定します。ブロック内で値を設定することが常に最善の方法であるとは限りません。関数を作成していてブロックが失敗した場合、関数が値なしで返される可能性がありますが、ブロックの外側で宣言され、例外ハンドラーがある場合は、エラーをキャッチして処理します。これは常に、この方法でブロックを設定することをお勧めします。

DECLARE 
    bTest BOOLEAN := FALSE;

BEGIN

--in your test check for the most likely thing that would happen 
--if bTest would in most instances evaluate to be FALSE then that should be your check

  IF NOT bTest THEN


   MESSAGE('True Passed');

  ELSE 

   MESSAGE('False Passed');


  END IF;

--in the event that an exception occurs or the block fails
--the function would still return a value

EXCEPTION WHEN NO_DATA_FOUND THEN
     bTest := FALSE;

WHEN OTHERS THEN
      bTest := FALSE;


END 
于 2011-06-01T03:49:01.097 に答える
1

フォームのバージョンは何ですか?
Forms Builder 6iで次のコードを試しましたが、期待どおりに機能します

DECLARE
    bTest BOOLEAN;
BEGIN
   bTest := FALSE;
    IF NOT bTest THEN
        MESSAGE('NOT FALSE passed'); 
        PAUSE;
    END IF;

    bTest := TRUE;
    IF bTest THEN
        MESSAGE('TRUE passed'); 
        PAUSE;
    END IF;

    bTest := NULL;
    IF bTest OR (NOT bTest) THEN
        MESSAGE('You will never see this message'); 
        PAUSE;
    END IF;
END;

これはあなたの環境で機能しますか?

例に追加されたnullを編集します。

于 2010-02-10T07:05:34.733 に答える
1

これを試して、何かが変わるかどうかを確認してください。

IF is_viewable THEN
    NULL;
ELSE
    raise_my_error();
END IF;
于 2009-12-16T18:46:14.083 に答える