2013-02-13 6 views
0

교차 I가 내가 지금처럼 PL/SQL 프로 시저에서 커서로 결과 집합을로드오라클 11g PL/SQL 커서는 쿼리

select distinct name from table1 
intersect 
select distinct name from table2; 

다음 쿼리 : 일부

cursor c1 is (select distinct name from table1 
intersect 
select distinct name from table2); 

결과 집합의 마지막 값이 커서에 복제 된 이유입니다. 쿼리 자체를 실행할 때 발생하지 않습니다. 왜 이런 일이 일어나고 있는거야? 루프에 대한

코드 :

var table.col%type; 

BEGIN 
OPEN c1; 
LOOP  
BEGIN 
    exit when c1%NOTFOUND; 
    FETCH c1 into var;  
    INSERT INTO table values (col1, var); 
    commit; 
EXCEPTION 
WHEN DUP_VAL_ON_INDEX THEN   
CONTINUE; 
END; 
END LOOP;  
END; 
+0

두 개의 다른 SELECT 문에서 공통 요소 만 선택하는 SQL 집합 연산 – user2001117

+3

어떻게 커서를 루핑합니까? 몇 가지 코드를 보여줄 수 있습니까? –

+0

루핑 코드가 질문에 추가되었습니다. 프로 시저를 실행 한 후 데이터가 삽입 될 테이블을 쿼리하면 마지막 값이 두 번 삽입됩니다. – sotn

답변

2

EXIT WHEN .. 절은 FETCH 후에 와야한다.

커서가 반환 할 레코드가 10 개 있다고 가정 해 보겠습니다. 첫 번째 가져 오기가 시작되기 전에 %NOTFOUNDNULL으로 계산되고 처리는 다음 문장 인 FETCH으로 이동합니다. 이제 10th 반복으로 빨리 감기면 FETCH가 10 번째 레코드를 가져오고 대상 테이블에 삽입됩니다. 루프가 진행되고 EXIT WHEN %NOTFOUND이 가져 오기 전이므로 마지막 반복에서 가져온 값이 그대로 유지되고 컨트롤이 앞으로 이동하게되어 가져 오기가 레코드를 가져올 수 없지만 코드는 아무 것도 삽입하지 않습니다 10 번째 반복에서 검색 한 마지막 행 이제 다음 루프에서, c1%NOTFOUNDTRUE로 평가되고 루프는

var table.col%type; 

BEGIN 
OPEN c1; 
LOOP  
BEGIN 

FETCH c1 into var;  
exit when c1%NOTFOUND;  
INSERT INTO table values (col1, var); 
commit; 
EXCEPTION 
WHEN DUP_VAL_ON_INDEX THEN   
CONTINUE; 
END; 
END LOOP;  
END; 
-2

이것은 당신이 명시 적 커서와 함께 볼 수있는 문제의 전형적인 종료됩니다.

첫 번째 선택은 단일 SQL 문이어야합니다.

커서를 사용해야하는 경우 가능하면 암시 적으로 사용해야합니다.

+1

-1 이것은 명시 적 커서와 관련된 문제가 아니며 명시 적 커서가 사용되는 방식 때문입니다. "첫 번째 선택은 단일 SQL 문이어야합니다"라는 정서에 동의해야합니다. –

+0

모든 기술을 잘 사용할 수도 있고 좋지 않을 수도 있습니다. Jeffrey 및 명시 적 커서도 예외는 아닙니다. 암시 적 커서와 비교할 때 더 많은 로직과 코드가 필요하며 많은 경우 속도가 느려지고 코딩 오류가 발생하기 쉽습니다. 잘 쓰여진 명시 적 커서조차도 일반적으로 암시 적 커서보다 느리고 열등합니다. http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1205168148688 –

+0

나는 이와 관련하여 논쟁을하지 않았습니다. 그러나 귀하의 게시물은 질문에 대한 답변이 아닙니다 ("왜 이런 일이 일어 났습니까?"), 댓글로 더 적절할 것입니다. –