다중커서라고 해야 될까요 프로시저 출력에 관해 질문드립니다. 0 6 5,647

by 미역 [PL/SQL] 커서 [2018.03.28 18:47:16]


안녕하세요. 고수님들께 질문 드립니다.

다중커서라고 해야될지 용어를 잘모르겠습니다만 보통 프로시저에서 쿼리한 목록을 out cursor 로 받아서 처리중인데

단일 검색결과가 아닌 여러번의 결과를 커서로 받아서 처리해야될 경우가 생겼습니다.

 

create or replace PROCEDURE SP1

( c1 OUT SYS_REFCURSOR,

c2 OUT SYS_REFCURSOR)

AS
BEGIN
        FOR t_list IN
        ( SELECT ID from T1 ) 
    LOOP
        OPEN C1 FOR
        SELECT Col1, Col2 FROM T2 WHERE ID = t_list.ID;

        OPEN C2 FOR
        SELECT Col3, Col4, Col5 FROM T3 WHERE ID = t_list.ID;

    END LOOP;
END SP1;

 

대충 이런식으로 쿼리를 만들었는데 생각하는것처럼 데이터가 나오지 않네요.

테이블 T1 의 ID 를 받아서 루프를 돌면서 T2, T3 의 내용을 테이블row형태로 가져오고 싶은데 출력을 어떻게 해야될지 모르겠습니다.

각테이블의 내용은 T1의 ID에 따라서 여러건씩 select 됩니다. 방식에 문제가 있다면 다르게 처리해도 상관없습니다. 

오라클은 11g 사용중입니다. 

 

by 마농 [2018.03.29 08:57:51]

루프 안에서 계속 커서를 오픈하네요? 이러면 안될 것 같아요.
커서 오픈을 한번만 해야 하지 않을까? 생각되네요?
FOR LOOP 구문은 빼고
t1 을 IN 조건으로 해서 커서 한번만 오픈하는 걸로 바꿔보세요.
OPEN c1 FOR SELECT id, col1, col2 FROM t2 WHERE id IN (SELECT id FROM t1);


by 미역 [2018.03.29 12:21:52]

제가 설명을 부실하게 해서 그런지 원하는 결과는 아니지만 답변에 감사드립니다. 

참고로 기존 MSSQL 의 프로시저 내용을 오라클로 옮기는거였는데 오라클 지식이 얕아서 방법을 찾지 못하겠습니다.

내용은 아래와 같은데 변환 가능하시면 부탁좀 드리겠습니다. 입력파라미터는 없습니다.

DECLARE @I int
DECLARE @CNT int
SET @I = 1
DECLARE @TBL TABLE
(
	IDX int identity(1,1),
	ID int
)

INSERT INTO @TBL (ID)
	SELECT ID from T1

SELECT @CNT = @@rowcount

WHILE @I <= @CNT
BEGIN

	DECLARE @ID INT
	SELECT @ID = ID FROM @TBL WHERE IDX = @I

	-- OUTPUT
	SELECT COL1, COL2 FROM T2 WHERE ID = @ID
	SELECT COL3, COL4, COL5 FROM T3 WHERE ID = @ID

	SET @I = @I + 1

END

by 마농 [2018.03.29 13:08:55]

ID 별로 col1 col2 col3 col4 col5 를 출력하는 것 같은데요.
그냥 SQL 로 조인하고 정렬해서 뽑으면 되는 문제는 아닌지?
각 테이블의 키와 관계가 어떻게 되나요?


by 미역 [2018.03.29 13:28:36]

단순히 ID 값으로 T2 T3 내용을 열거하는 식입니다.(로그성이라고나 할까요) T1 의 ID만 PK이고 셀렉트한 ID 리스트에서 1개씩 루프돌면서 T2, T3의 테이블 내용을 가져옵니다. ID 당 T2,T3 테이블 서치한내용이 한셋트로 계속 반복되는 형태입니다.


by 마농 [2018.03.29 13:32:54]
SELECT b.id
     , b.col1
     , b.col2
     , null col3
     , null col4
     , null col5
  FROM t1 a
     , t2 b
 WHERE a.id = b.id
 UNION ALL
SELECT b.id
     , null col1
     , null col2
     , b.col3
     , b.col4
     , b.col5
  FROM t1 a
     , t3 b
 WHERE a.id = b.id
 ORDER BY 1, 2, 3, 4, 5, 6
;

 


by 미역 [2018.03.29 14:33:05]

많은 도움 되었습니다. 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입