2008-10-09 3 views
4

하디. 다음을 고려하십시오.PL/SQL 평가 주문

SQL> DECLARE 
    2  b1 BOOLEAN; 
    3  b2 BOOLEAN; 
    4  FUNCTION checkit RETURN BOOLEAN IS 
    5  BEGIN 
    6  dbms_output.put_line('inside checkit'); 
    7  RETURN TRUE; 
    8  END checkit; 
    9 
10  PROCEDURE outp(n VARCHAR2, p BOOLEAN) IS 
11  BEGIN 
12  IF p THEN 
13   dbms_output.put_line(n||' is true'); 
14  ELSE 
15   dbms_output.put_line(n||' is false'); 
16  END IF; 
17  END; 
18 BEGIN 
19  b1 := TRUE OR checkit; 
20  outp('b1',b1); 
21  b2 := checkit OR TRUE; 
22  outp('b2',b2); 
23 END; 
24/

b1 is true 
inside checkit 
b2 is true 

PL/SQL procedure successfully completed 

SQL> 

OR 문의 결과는 순서에 따라 다릅니다. 함수 호출을 먼저 배치하면 다른 용어의 값과 관계없이 함수가 실행됩니다. OR 구문은 TRUE가 얻어 질 때까지 왼쪽에서 오른쪽으로 평가되고, 그 시점에서 처리가 멈추고 결과는 TRUE로 평가됩니다.

내 질문은 내가 신뢰할 수있는 것입니까? 또는 PL/SQL의 향후 릴리스에서이 동작이 변경 될 수 있습니까? 변수가 변경 될 수있는 경우, 다른 변수를 작성하지 않고 별도의 대입 문을 사용하지 않고도 신뢰할 수있는 함수를 평가할 수있는 방법이 있습니까?

답변

8

예. PL/SQL은 왼쪽에서 오른쪽으로 논리 표현식 short circuit evaluation을 수행합니다.

+0

퍼펙 사실이다. 그냥 내가 뭘 찾고 있었는지! – DCookie

+0

"pl/sql complete boolean evaluation"에 대한 Google에서 정확히 동일한 링크를 제공했습니다. – JosephStyons

+0

그게 내가 시도한 것보다 나은 검색입니다 : "PLSQL force evaluation". 감사! – DCookie

1

변경 될 수있는 경우 다른 변수를 만들고 별도의 지정 문을 사용하지 않고도 신뢰할 수있는 함수를 평가할 수있는 방법이 있습니까? 당신이 기능은 단순히 TRUE 또는 FALSE, 예를 들어, 반환이 아닌 다른 무언가를한다는 것을 의미하는, 그렇게 논리적으로 불필요한 경우에도 evaulated해야 할 것을 요구하는 경우

아마도 테이블을 업데이트합니다. PL/SQL 함수가 "부작용"을 일으키는 것은 바람직하지 않습니다.

+0

일련의 편집 기능. 각 문제는 메시지를 편집하고 현재 레코드를 건너 뛸 경우 표시기를 반환합니다. 건너 뛰기 플래그는 FALSE를 시작하고 검사에 실패하면 TRUE로 설정됩니다. 특정 검사를 통과하면 건너 뛰기 플래그를 FALSE로 재설정하지 않습니다. – DCookie

+0

플래그에 대한 IN OUT 매개 변수가있는 프로 시저로이 함수를 바 \ 수 있습니다. 프로 시저에서는 검사에 실패하면 플래그를 TRUE로 설정하지만 검사가 실패하지 않으면 그대로 두었습니다. l_flag : = FALSE; do_check1 (l_flag); do_check2 (l_flag); do_check3 (l_flag); –

1

문서에는 단락 회로 평가가 IF, CASE 및 CASE 표현식에 적용된다고 나와 있습니다. 인용 된 예제에도 적용되지만 기술적으로 문서화되지는 않을 것이라고 확신합니다. 오라클과의 협상을 통해이 티켓을 발급받을 가치가 있습니다.

0

왼쪽에서 오른쪽으로 OR 문과 오른쪽에서 왼쪽으로 AND 문을 평가합니다. 나는 그것의 어떤 문서도 발견하지 못했다.

0

정확하게 "오른쪽에서 왼쪽으로의 AND 및"문은 무엇을 의미합니까?
이 Oracle 문서 내지 => 다음 예에서


유효이 FALSE 값을 갖는 경우, 전체 표현식이 완료의 값에 관계없이 FALSE 수득 알 :

유효을 수행

다음 예제 순서를 확인할 수 있습니다

:

DECLARE
B1의 BOOLEAN;
b2 부 울린;

FUNCTION의 checkit (V 번호)
RETURN BOOLEAN


DBMS_OUTPUT BEGIN을한다.put_line ('checkit 내부 :'|| v);
RETURN TRUE;
END checkit;

PROCEDURE의 OUTP는 (N VARCHAR2, 부울 P)는 P

THEN
DBMS_OUTPUT.PUT_LINE는 (N || '참')는 IF

BEGIN이고;
ELSE
DBMS_OUTPUT.put_line (n || '는 거짓')입니다.
끝 IF;
끝;
BEGIN
b1 : = checkit (1) AND checkit (2);
outp ('b1', b1);
b2 : = checkit (3) AND checkit (4);
outp ('b2', b2);
끝; checkit 내부 1
: checkit 내부


checkit 내부
3 : 2
B1은 checkit 내부
사실 4
B2는