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 하여 서버로 통신이 일어나는 트래픽을 최소화 하여, 좀더 빠른 처리를 할 수 있습니다.