database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 33174 게시물 읽기
No. 33174
[질문] pro*c에서 배열에 fetch 할 때 힙과 스택 문제...
작성자
KS(skipio)
작성일
2008-03-05 10:34ⓒ
2008-03-05 14:49ⓜ
조회수
3,165


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 ;

[Top]
No.
제목
작성자
작성일
조회
33177RAC구성에서 DB추가시...
쇼다운
2008-03-05
1470
33176초보적인 select 질문 하나 드립니다. [6]
왕초보
2008-03-05
1455
33175조건 수정이 가능한가요??
홍광표
2008-03-05
933
33174[질문] pro*c에서 배열에 fetch 할 때 힙과 스택 문제...
KS
2008-03-05
3165
33173언두 테이블스페이스 삭제에 관한 질문입니다.
younglee
2008-03-05
1168
33172index column 가공시 index를 타는지.. [4]
김상진
2008-03-05
1405
33171between 과 <>= 의 연산자 [2]
김상진
2008-03-05
1452
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다