본문 바로가기

IT/CPP,Pro C

Pro C 다중 Fetch 하기

Pro C로 프로그래밍을 하다보면, 조회해야하는 데이터 양이 많아서, 한번에 여러 라인을 패치해야 할 경우가 있습니다. 이때, 특정 배열 크기 만큼 지속적으로 패치하여, 결과셋 모두를 가져와 처리하는 코드에 대하여 기술 합니다.

 

struct LOOKUP_INFO		lookupInfo[100];
int nLoop = 0;
int nFetchCnt = 0;
int isContinue = TRUE;

EXEC SQL DECLARE Cur_Lookup_contract CURSOR FOR
		// 조회 쿼리 

EXEC SQL OPEN Cur_Lookup_contract;

while(isContinue)
{
	/* 1. LOOKUP 조회 */
	memset(&lookupInfo, 0, sizeof(lookupInfo));
	EXEC SQL FETCH Cur_Lookup_contract INTO :lookupInfo;

	if(sqlca.sqlcode != 0 && sqlca.sqlcode != 1403)
	{
    	//에러 처리
		isContinue = FALSE;
	}
	else
	{
		if(sqlca.sqlcode == 1403)
		{
			isContinue = FALSE;
		}

		nLoop = sqlca.sqlerrd[2] - nFetchCnt;
		nFetchCnt = sqlca.sqlerrd[2];
        
		for(int i = 0; i < nLoop; i++)
		{
        	//데이터 처리
		}
	}
}

위의 코드는 쿼리를 실행하여 100 로우씩 데이터를 fetch 해오는 구문입니다. 모든 결과셋을 가져올때까지 반복하게 됩니다. 만약, 중간에 멈추길 원한다면 isContinue 의 값을 종료 조건에 변경하시면 됩니다.

 

sqlca 구조체는 Pro#C에서 쿼리 결과를 저장하는 구조체입니다. 위에서 사용한 멤버변수들의 의미는 다음과 같습니다.

Member 변수 의미
sqlcode

쿼리 결과에 대한 코드입니다.

에러 발생시 오라클 에러 코드가 나옵니다.

0: 성공

1403: 더이상의 데이터셋 없음

sqlerrd[2] 총 fetch된 row 수

의미 있는 라인별 설명입니다.

if(sqlca.sqlcode != 0 && sqlca.sqlcode != 1403)
{
	//에러 처리
	isContinue = FALSE;
}

fetch 했을때, sqlcode 가 0, 1403이 아니면 에러 처리 하고, 이번 fetch 이후, while 문 종료 하고자 합니다.

if(sqlca.sqlcode == 1403)
{
	isContinue = FALSE;
}

sqlcode가 1403 인 경우, 이번 fetch 처리 이후, while 문을 종료 하고자 함입니다.

nLoop = sqlca.sqlerrd[2] - nFetchCnt;
nFetchCnt = sqlca.sqlerrd[2];
        
for(int i = 0; i < nLoop; i++)
{
	//데이터 처리
}

이번 fetch에서 가져온 row 수를 구하여 해당 수만큼 for 문을 반복 처리하는 구문입니다.

 

위 처럼 pro c를 처리하면, 쿼리 결과의 데이터 수가 많을 경우, 1 row 단위로 fetch 하여 서버로 통신이 일어나는 트래픽을 최소화 하여, 좀더 빠른 처리를 할 수 있습니다.