评估Oracle Forms中的PL/SQL布尔变量

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.如果这不是您所看到或期望的,那么您的程序中必须发生其他事情或作为副作用.


Jef*_*emp 5

NOT is_viewable评估为TRUE当且仅当is_viewableis 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)


dcp*_*dcp 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;
Run Code Online (Sandbox Code Playgroud)

当然,我不知道 Oracle Forms 会如何做不同的事情,但也许它以某种方式将变量设置为 null?