Oracle Forms에서 PL/SQL 부울 변수 평가
내가 가지고 있다고 가정해 보세요.BOOLEAN
Oracle 양식의 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
'programing' 카테고리의 다른 글
패치 가져오기 요청이 허용되지 않습니다. (0) | 2023.08.04 |
---|---|
데이터베이스 테이블을 만들 때 Zoomla! 3 설치가 중지됩니다. (0) | 2023.07.30 |
사용자가 인증되지 않은 경우 Ajax 요청을 어떻게 처리합니까? (0) | 2023.07.30 |
Spring Boot : 속성이 .properties 파일에 있음에도 불구하고 Spring은 항상 속성에 기본값을 할당합니다. (0) | 2023.07.30 |
웹 응용 프로그램의 SMS (0) | 2023.07.30 |