2012-06-30 2 views
1

나는 PL/SQL 커서를 연구 중이다. 커서 속성에 문제가 있습니다. 암시 적 및 명시 적 커서에서 %FOUND, %NOTFOUND의 기본값은 무엇입니까? 나는 PDF를 통과하고cusor 속성에서 % NOTFOUND의 기본값은 무엇입니까?

나는 처음 페치 %의 NOTFOUND이 NULL로 평가하기 전에이 문장

LOOP 
FETCH c1 INTO my_ename, my_sal, my_hiredate; 
EXIT WHEN c1%NOTFOUND; 
... 
END LOOP; 

을 발견했다. 따라서 FETCH가 성공적으로 실행되지 않으면 루프는 종료되지 않습니다. WHEN 조건이 인 경우에만 EXIT WHEN 문이 실행되기 때문입니다. 안전을 위해, 대신 다음 EXIT 문을 사용 : 커서가 열려 있지

EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL; 

경우, %NOTFOUND 그것을 참조는 INVALID_CURSOR를 발생시킵니다.

답변

3

질문에 대한 대답으로 "기본"값이 없습니다. %NOTFOUND은 커서가 열릴 때 인스턴스화되는 "변수"입니다. 그 시점의 값은 null입니다. 당신이 원한다면 당신이 기본값으로 부를 수 있다고 생각합니다. 커서를 처음으로 가져온 후에는 값이 반환 될 행이 있는지 여부에 따라 false가됩니다. 커서가 닫히면 "변수"가 더 이상 존재하지 않습니다.

에서 인용하려면 11gr2 documentation :

%의 NOTFOUND은 (FOUND %의 논리적 반대) 반환 명시 적 커서 후
NULL 열하지만 가장 최근의 인출하면 전에 먼저
FALSE 페치 명시 적 커서의 10g documentation has a useful table that demonstrates this

그렇지 않으면


TRUE 행을 반환

 
+----------------+--------+--------------+ 
|  stage  | when | return value | 
+----------------+--------+--------------+ 
| open   | before | exception | 
|    | after | null   | 
| first fetch | before | null   | 
|    | after | false  | 
| next fetch(es) | before | false  | 
|    | after | false  | 
| last fetch  | before | false  | 
|    | after | true   | 
| close   | before | true   | 
|    | after | exception | 
+----------------+--------+--------------+

그러나 오라클 설명서에는 직접적인 모순이있는 것으로 보입니다. 11g 설명서에는 사용자가 설명한 것과 비슷한 내용이 있습니다. 문구가있는 바로 위의 주장을

참고 모순되는 것처럼 보인다 : 예 6-16에서, FETCH 경우 행을 반입하지를, 다음 C1 % NOTFOUND 는 항상 NULL이며, 루프는 종료되지 않습니다. 무한한 루핑을 방지하려면 대신이 EXIT 문을 사용하십시오. EXIT WHEN c1 % NOTFOUND 또는 (c1 % NOTFOUND IS NULL);

10g documentation은 더 분명하고 약간 다르게 표시됩니다. 이것은 직접적인 모순이 아닙니다.

% NOTFOUND는 NULL로 평가됩니다. FETCH never 이 성공적으로 실행되면 EXIT WHEN 조건은 TRUE가 아니며 루프는 종료되지 않습니다.안전을 기하기 위해 다음 EXIT 문을 대신 사용할 수 있습니다.

EXIT c1 % NOTFOUND 또는 c1 % NOTFOUND가 NULL 인 경우;

일반적으로 나는 설명서를 신뢰하고 EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL을 작성하는 것이 현명하다고 말합니다.

가져 오기가 어떤 상황에서 성공적으로 실행되지 않을지 알 수 없습니다. I've asked the question. 가져 오기가 잠금 등으로 인해 값을 반환하지 않으면 코드의 일부에 도달하여 실패 여부를 확인할 수 없습니다.

René Nyffenegger은 그의 블로그에 %NOTFOUND이 어떻게 작동하는지에 대한 좋은 설명 인 코드가 있습니다.

관련 문제