Evaluation of PL/SQL boolean variables in Oracle Forms
We can test this in SQLPlus to see what happens in each of the 3 situations (true, false, null):
set serveroutput ondeclare 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;/
Which produces:
SQL> set serveroutput onSQL>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 ValueNull Value is NullPL/SQL procedure successfully completed.SQL>
So the only possible code path that can produce your expected output is if the value going into the conditional is false. If that is not what you are seeing or expecting then something else must be happening in your procedure or as a side effect.
What value is the variable being set to? Do understand that if the value is null, the the block will never execute. I'm not sure if that's your problem, but here's an example:
DECLAREis_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;
Of course, I don't know how Oracle Forms would be doing it differently, but maybe it's setting the variable to null somehow?
NOT is_viewable
evaluates to TRUE
if and only if is_viewable
is FALSE
.
In your case, is_viewable
is probably being set to NULL
; perhaps the Forms debugger shows you "FALSE" in this scenario causing confusion.
Try this code instead:
IF NOT is_viewable THEN raise_my_error();ELSIF is_viewable IS NULL THEN raise_another_error();END IF;