select 문을 수행하는데 runtime까지 어떤 select 문을 수행할지 모릅니다.
dynamic을 써야된느데 여러개의 튜플을 한꺼번에 fetch해서 메모리에 올려놓을 경우,
스택에 자리잡는 배열로 아래와 같이 코딩하면 문제없이 돌아가는데
malloc으로 힙에 자리를 만들면 segmentation fault가 나네요.
수천개의 튜플이면 몇메가정도 되는데 이걸 스택에 다 집어넣을 순 없고
힙이나 스택 관련한 pro*c 레퍼런스는 찾을수가 없군요...
도와주세요 고수님들~~
EXEC SQL
BEGIN DECLARE SECTION ;
int i, j, k ;
int nColNum ; /* 실제 컬럼 갯수 */
int nMaxRow ; /* 읽어올 최대 row 갯수 */
int nTotalRow ; /* 지금까지 읽은 row 갯수 */
int nReadRow ; /* 읽어온 row 갯수 */
int nDataType ; /* DB에서 읽어올 데이터 타입. 모두 스트링으로 읽도록 한다 */
short* pIndi ; /* 인디케이터 포인터 */
char szDescOut[32] ;
char szQuery[DBB_LEN_QUERY] ; /* 수행할 쿼리문 */
char szConnectInfo[DBB_LEN_QUERY] ; /* 접속 관련 정보 */
char* szRecord[DBB_NUM_MAXCOL][DBB_NUM_MAXROW] ; /* 레코드 저장 배열 */
EXEC SQL
END DECLARE SECTION ;
short snIndi[DBB_NUM_MAXCOL][DBB_NUM_MAXROW] ; /* 인디케이터 배열 */
/* 초기화 */
memset(&szQuery, 0x00, DBB_LEN_QUERY) ;
memset(&szConnectInfo, 0x00, DBB_LEN_QUERY) ;
nMaxRow = DBB_NUM_MAXROW ;
memset(&szDescOut, 0x00, 32) ;
sprintf(szDescOut, "szDescOut") ;
nDataType = DBB_DATATYPE_CHAR ;
/* 에러처리 */
EXEC SQL
WHENEVER SQLERROR goto ERROR ;
/* DB에 연결 */
sprintf(szConnectInfo, "%s/%s@%s", DBB_USER_NAME, DBB_USER_PASSWD, DBB_DBNAME) ;
EXEC SQL
CONNECT :szConnectInfo ;
/* 테이블을 저장할 메모리 할당 */
for ( i = 0 ; i < DBB_NUM_MAXCOL ; i++)
for (j = 0 ; j < DBB_NUM_MAXROW ; j++)
{
szRecord[i][j] = (char*)malloc(DBB_LEN_COL) ;
memset(szRecord[i][j], 0x00, DBB_LEN_COL) ;
}
/* 출력 디스크립터 선언 */
EXEC SQL FOR :nMaxRow
ALLOCATE DESCRIPTOR LOCAL :szDescOut ;
/* 쿼리문 준비 및 커서 선언 */
sprintf(szQuery, "SELECT * from %s", pszTableName) ;
EXEC SQL FOR :nMaxRow
PREPARE S FROM :szQuery ;
EXEC SQL
DECLARE C CURSOR FOR S ;
EXEC SQL FOR :nMaxRow
OPEN C ;
EXEC SQL FOR :nMaxRow
DESCRIBE OUTPUT S USING DESCRIPTOR :szDescOut ;
EXEC SQL
GET DESCRIPTOR :szDescOut :nColNum = COUNT ;
for (i = 0 ; i < nColNum ; i++)
{
j = i + 1 ;
EXEC SQL FOR :nMaxRow
SET DESCRIPTOR :szDescOut VALUE :j
TYPE = :nDataType ;
pIndi = (short*)&snIndi[i] ;
EXEC SQL FOR :nMaxRow
SET DESCRIPTOR :szDescOut VALUE :j
REF DATA = :szRecord[i], REF INDICATOR = :pIndi ;
}
/* 레코드 fetch */
nTotalRow = 0 ;
for (;;)
{
for ( i = 0 ; i < DBB_NUM_MAXCOL ; i++)
for (j = 0 ; j < DBB_NUM_MAXROW ; j++)
memset(szRecord[i][j], 0x00, DBB_LEN_COL) ;
EXEC SQL FOR :nMaxRow
FETCH C INTO DESCRIPTOR :szDescOut ;
if ((sqlca.sqlerrd[2] - nTotalRow) < nMaxRow)
nReadRow = sqlca.sqlerrd[2] - nTotalRow ;
else
nReadRow = nMaxRow ;
}
for (i = 0 ; i < nReadRow ; i++) { <---------------------- 여기서부터가 문제.
for (j = 0 ; j < nColNum ; j++) {
if (snIndi[j][i] == -1)
printf("NULL ") ;
else {
printf("[%s] ", szRecord[j][i]) ;
}
}
printf("\n") ;
}
nTotalRow += nReadRow ;
if (nReadRow != nMaxRow)
break ;
}
for ( i = 0 ; i < DBB_NUM_MAXCOL ; i++)
for (j = 0 ; j < DBB_NUM_MAXROW ; j++)
free(szRecord[i][j]) ;
EXEC SQL
DEALLOCATE DESCRIPTOR :szDescOut ;
EXEC SQL
COMMIT WORK RELEASE ;
|