2009-12-09 14 views
11

私はOracleのフォームでのPL/SQLブロック内BOOLEAN変数があるとフォームraise_my_error()決してが呼び出されると決定しました。明確にする:is_viewable = TRUE 評価は

  • raise_my_error()is_viewable = FALSE
  • 最初のテストは、この動作は、PL/SQLコードの実行に制限されていることを示唆している場合ではないが呼び出されますがない場合

    • raise_my_error()は呼び出されませんOracle Forms内ではPL/SQLコードがデータベース内で直接実行されるわけではありません(間違っている可能性もありますが)。

      私は明示的にFALSEis_viewableを比較することによって、これを回避することができます

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

      NOT is_viewableTRUEと評価されたことがない、なぜ私はまだ興味があります。

      更新:私のデバッガでは正しい値が表示されていないようで、この質問はもう有効ではないようです。その混乱をお詫び申し上げます。

    +0

    [フレンドリーリマインダ]あなたは経験豊かなユーザーとして、回答を受け入れることを忘れてしまったと思います(dcpまたはJeffrey's)。 –

    +0

    @AlexanderMalakhov:私はいくつかの機会に答えを受け入れたいと思っていますが、コードが正しく動作しているように見えるので、質問は答えられないようです。私が間違っていない限り、 'is_viewable = FALSE'は' TRUE'か '' is_viewable''のいずれかに評価されるのに対し、 'NOT is_viewable'は**常に** FALSE(' is_viewable'の値にかかわらず) 'is_viewable'の値に応じて' FALSE'を返します。問題が発生しなくなったので、私は答えを確認することはできません。 :( –

    +0

    私は似ていた(wrt "正解無し、検証できない")[質問](http://stackoverflow.com/questions/2233856/oracle-forms-6i-crashes-with-0xc0000005-at私の質問に答えてくれる人はほとんどいないので、私は(最も正しい)回答を受け入れることにしました。私の戦略に従わない人はまったく問題はありません(あなたがSOコミュニティのためにすばらしい仕事をしているので、それ以上です) –

    答えて

    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に変数を設定するのですか?

    +0

    ヒントありがとう!私はすでに 'NULL'値の問題を理解しましたが、' is_viewable'が 'TRUE'に設定され、' is_viewable'が 'FALSE'に設定されている(デバッガ経由で)この現象が見られました。正直言って、もしそれが 'NULL'に設定されていたら何が起こるかを見てみることはしなかった...それは状況をもっと助けるだろうとは思わない。 –

    4

    NOT is_viewableTRUEと評価されるのは、is_viewableFALSEの場合のみです。

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

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

    IF NOT is_viewable THEN 
        raise_my_error(); 
    ELSIF is_viewable IS NULL THEN 
        raise_another_error(); 
    END IF; 
    
    1

    を、それは何も変更かどうかを確認するために、これを試してみてください:

    IF is_viewable THEN 
        NULL; 
    ELSE 
        raise_my_error(); 
    END IF; 
    
    +1

    このコードは、潜在的にバグを隠すことに言及する価値があります。例えば。 'myBool:=(sum1 = sum2)'、 'sum1 = 0'と' sum2 is null'です。おそらくこれは、Nullの代わりにこれが 'True'であることを望むでしょう。 –

    13

    を私たちが真(3つの各状況で何が起こるか見るためにSQLPlusをでこれをテストすることができます、偽、ヌル):生成

    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の場合です。それがあなたが見ているか期待しているものでないなら、あなたの処置で、あるいは副作用として何かが起こっているはずです。

    +0

    きちんと説明されています...ありがとうございます – artapart

    1

    Formsのバージョンは何ですか?
    私は、フォームビルダ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に追加されました。

    +0

    はい、フォームのバージョンは便利でしょう。また、Oracleクライアントのバージョン。そして、データベースの。古いバージョンのFormsには、独自のPL/SQLインタープリタがあり、これが影響を受ける可能性があります。 –

    2

    is_viewableの宣言時に初期値を設定する必要があります。 BOOLEANSが宣言されている場合、BOOLEANSのデフォルト値は設定されません。ブロック内の値を設定することが宣言されているときに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