Ada*_*ter 12 oracle plsql boolean oracleforms
假设我BOOLEAN
在Oracle表单中的PL/SQL块中有一个变量:
DECLARE
is_viewable BOOLEAN;
BEGIN
is_viewable := ...;
IF NOT is_viewable THEN
raise_my_error(); // pseudo-code
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
在使用调试器多次单步执行此代码后,我确定raise_my_error()
永远不会被调用.澄清:
raise_my_error()
如果没有被调用is_viewable = TRUE
raise_my_error()
如果没有被调用is_viewable = FALSE
初步测试表明,此行为仅限于在Oracle Forms中运行的PL/SQL代码,而不是直接在数据库中运行的PL/SQL代码(尽管我可能错了).
我可以通过明确地比较is_viewable
来解决这个问题FALSE
:
IF is_viewable = FALSE THEN
raise_my_error();
END IF;
Run Code Online (Sandbox Code Playgroud)
我仍然很好奇为什么NOT is_viewable
永远不会评估TRUE
.
更新:我的调试器似乎没有显示正确的值,并且此问题不再有效.抱歉这个混乱.
Dou*_*ter 15
我们可以在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;
/
Run Code Online (Sandbox Code Playgroud)
哪个产生:
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>
Run Code Online (Sandbox Code Playgroud)
因此,唯一可能产生预期输出的代码路径是进入条件的值是否为false.如果这不是您所看到或期望的,那么您的程序中必须发生其他事情或作为副作用.
NOT is_viewable
评估为TRUE
当且仅当is_viewable
is FALSE
。
在你的情况下,is_viewable
可能被设置为NULL
;也许表单调试器在这种情况下显示“FALSE”,导致混乱。
试试这个代码:
IF NOT is_viewable THEN
raise_my_error();
ELSIF is_viewable IS NULL THEN
raise_another_error();
END IF;
Run Code Online (Sandbox Code Playgroud)
变量被设置为什么值?请理解,如果值为 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;
Run Code Online (Sandbox Code Playgroud)
当然,我不知道 Oracle Forms 会如何做不同的事情,但也许它以某种方式将变量设置为 null?
归档时间: |
|
查看次数: |
88783 次 |
最近记录: |