programing

Oracle Forms에서 PL/SQL 부울 변수 평가

muds 2023. 7. 30. 18:12
반응형

Oracle Forms에서 PL/SQL 부울 변수 평가

내가 가지고 있다고 가정해 보세요.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

초기 테스트에 따르면 이 동작은 Oracle Forms 내에서 실행되는 PL/SQL 코드로 제한되며 데이터베이스 내에서 직접 실행되는 PL/SQL 코드로 제한되지 않습니다.

저는 이것을 명확하게 비교함으로써 극복할 수 있습니다.is_viewable로.FALSE:

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

나는 여전히 왜 그런지 궁금합니다.NOT is_viewable절대로 평가하지 않는TRUE.

업데이트: 디버거가 올바른 값을 표시하지 않았으며 이 질문은 더 이상 유효하지 않습니다.혼란스럽게 해서 죄송합니다.

SQL Plus에서 이를 테스트하여 다음 세 가지 상황(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>

따라서 예상 출력을 생성할 수 있는 유일한 코드 경로는 조건부로 들어가는 값이 거짓인 경우입니다.만약 그것이 여러분이 보고 있거나 기대하고 있는 것이 아니라면, 여러분의 절차에서 또는 부작용으로 다른 일이 일어나고 있는 것이 틀림없습니다.

NOT is_viewable로 평가함.TRUE만일의 경우에만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;

변수가 어떤 값으로 설정됩니까?값이 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로 설정하는 것은 아닐까요?

is_viewable은 선언될 때 초기 값을 설정해야 합니다.Oracle은 BUILEANS가 선언될 때 BUILEANS의 기본값을 설정하지 않습니다.선언될 때 부울 값 설정 블록 내부의 값을 설정하는 것이 항상 최선의 방법은 아닙니다.함수를 만들고 있는데 블록이 실패하면 값 없이 함수가 반환될 수 있지만 블록 외부에서 선언되고 예외 처리기가 있으면 오류가 발생하여 처리됩니다.이 방법은 항상 이러한 방식으로 블록을 설정하는 것이 좋습니다.

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 

변경 사항이 있는지 확인하려면 다음을 수행합니다.

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

양식의 버전은 무엇입니까?
방금 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을 추가했습니다.

언급URL : https://stackoverflow.com/questions/1876669/evaluation-of-pl-sql-boolean-variables-in-oracle-forms

반응형