가변배열 사용예제
가변배열을 사용하는 DBIO 출력 예제를 다음과 같이 설명한다. 데이터베이스에 접근하여 가져온 데이터를 ProMapper에서 정의한 가변배열 구조체에 담는다.
이 사용예제는 가변배열 사용의 대표적인 경우로 애플리케이션 프로그램을 작성하는데 참고한다.
/**************************************
* KIND : Intermediary Module Function
* NODE ID : 1
* NAME : 가변 출력 처리
* DESCRIPTION :
*************************************/
static long innerModule1(test_biz2Context *context)
{
long rc = RC_NRM;
// Variables Declaration
long fetchCnt = 0; /* */
long fetchRc = 0; /* */
// Variables Initialization
{
/**************************************
* KIND : DBIO Fetch Loop
* NODE ID : 2
* NAME : testdev_meta_pf990 Fetch loop
* DESCRIPTION :
*************************************/
testdev_meta_pf990In temporaryInput2;
testdev_meta_pf990Out temporaryOutput2[10];
bzero(&temporaryInput2, sizeof(testdev_meta_pf990In));
bzero(temporaryOutput2, sizeof(testdev_meta_pf990Out) * 10);
//DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:DBIO_DYNAMIC_PARAMETER
NODEID3----------------//
//TODO Auto-generated method stub
//DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:DBIO_DYNAMIC_PARAMETER
NODEID3------------------//
① PFM_TRYNJ(pfmDbioOpenCursorArray("testdev_meta_pf990",
&temporaryInput2, NULL, FMWDBIO_NOLOCK));
//START_OF_CODE:testdev_meta_pf990 Fetch loop DBIO_FETCH_LOOP
while (1)
{
{
//DO_NOT_MODIFY_THIS_LINE-----------START_OF_CODE:BEFORE_CODE
NODEID3------------------//
// TODO Auto-generated method stub
//DO_NOT_MODIFY_THIS_LINE-----------END_OF_CODE:BEFORE_CODE
NODEID3--------------------//
/**************************************
* KIND : DBIO_FETCH Callee Info
* NAME : testdev_meta_pf990
* EXEC : FETCH
* INPUT : testdev_meta_pf990In
* OUTPUT : testdev_meta_pf990Out
* ARRAY INPUT : NONE
* ARRAY OUTPUT : testdev_meta_pf990BundleOut
* DYNAMIC STRUCTURE : NONE
*************************************/
② PFM_TRYNJ(pfmDbioFetchArray("testdev_meta_pf990", 10,
&temporaryOutput2));
//DO_NOT_MODIFY_THIS_LINE-----------
START_OF_CODE:DBIO_FETCH_EXCEPTION NODEID3--------//
fetchRc = rc;
if (fetchRc != RC_NRM)
{
③ if (fetchRc == RC_NFD && pfmDbioGetRecordCount() == 0 )
{
PFM_ERR("TRSE001001", "조건에 맞는 데이터가 존재하지
않습니다 [%ld]", rc);
PFM_TRY(pfmDbioCloseCursorArray("testdev_meta_pf990"));
return fetchRc;
}
else if(fetchRc != RC_NFD ) {
PFM_ERR("TRSE001001", "[FAIL] Fetch Result rc=[%ld]
ErrCode[%ld], ErrorString[%s]", rc, pfmDbioGetErrorNo(),
pfmDbioGetErrorString());
④ PFM_TRY(pfmDbioCloseCursorArray("testdev_meta_pf990"));
return fetchRc;
}
}
⑤ if(fetchRc==RC_NRM||(fetchRc==RC_NFD &&
pfmDbioGetRecordCount()%AS_TESTDEV_META_PF990>0 ))
{
PFM_DBG("가변 출력 처리를 위한 처리");
/* 최대 출력 건수 초과인지 Check */
if( pfmVarrayCount(OUTPUT->test) >= 25 )
{
PFM_ERR("TRSE001001", "최대 출력 건수 초과입니다.
할당된 건수:[%ld] 건 ", pfmVarrayCount(OUTPUT->test));
return RC_ERR;
}
/* 가변 배열 정의 건수 */
if( rc==RC_NFD)
{
fetchCnt = pfmDbioGetRecordCount() % AS_TESTDEV_META_PF990;
}
else
{
fetchCnt = AS_TESTDEV_META_PF990;
}
/* 가변 배열로 할당 */
⑥ for( int i = 0; i < fetchCnt; i++){
pfmVarrayAppend( OUTPUT->test, &temporaryOutput2[i]);
OUTPUT->cnt++;
}
}
/* 마지막 처리인 경우 break */
if(fetchRc == RC_NFD )
{
PFM_DBG("rc=[%ld]로 break처리", rc);
⑦ break;
}
//DO_NOT_MODIFY_THIS_LINE-----------
END_OF_CODE:DBIO_FETCH_EXCEPTION NODEID3----------//
//DO_NOT_MODIFY_THIS_LINE-----------
START_OF_CODE:AFTER_CODE NODEID3------------------//
// TODO Auto-generated method stub
//DO_NOT_MODIFY_THIS_LINE-----------
END_OF_CODE:AFTER_CODE NODEID3--------------------//
}
}
//END_OF_CODE:testdev_meta_pf990 Fetch loop DBIO_FETCH_LOOP
PFM_TRY(pfmDbioCloseCursorArray("testdev_meta_pf990"));
//DO_NOT_MODIFY_THIS_LINE-----------
START_OF_CODE:DBIO_FETCH_LOOP_EXCEPTION NODEID2------------//
// TODO Auto-generated method stub
//DO_NOT_MODIFY_THIS_LINE-----------
END_OF_CODE:DBIO_FETCH_LOOP_EXCEPTION NODEID2--------------//
}
return RC_NRM;
FMW_CATCH:
return rc;
}
다음은 위 소스의 내용 중 각 번호에 대한 설명이다.
① 여러 건의 FETCH Exec 타입으로 생성된 DBIO의 경우 Cursor를 Open한 후 반복 실행하여 데이터를 배열 크기만큼 가져온다.
② 여러 건의 DBIO 파라미터는 맵 ID와 한 번에 FETCH할 데이터 개수, 출력 구조체가 있다.
③ FETCH Exec 타입으로 생성된 DBIO가 Not Found 에러를 반환하는 경우 실제로 데이터가 존재하지 않는 것인지 아니면 FETCH 배열 개수를 채우지 못해 RC_NFD를 반환하는 경우인지에 대한 예외처리를 해줘야 한다.
④ 오류가 발생되는 경우를 처리하는 부분으로 DBIO 오류가 발생한 경우 Cursor를 Close한다.
⑤ RC_NRM인 경우와 마지막으로 FETCH 처리를 할 때 RC_NFD이면서 배열 개수를 채우지 못한 경우 DBIO의 결과 값으로 처리한다.
⑥ fetch_cnt는 실제 데이터베이스에서 가져온 데이터의 개수이다. 따라서 출력 구조체가 가변일 때는 fetch_cnt만큼 pfmVarrayAppend API를 사용하여 출력 구조체에 추가해야 한다. 또한 출력 구조체의 가변인자를 OUTPUT→cnt를 통해 데이터의 개수를 처리한다.
⑦ FETCH 배열 개수를 채우지 못해 에러를 반환하는 경우 더 이상 데이터가 없는 것으로 판단하여 while 문을 빠져 나온다.