C와 Oracle을 연동할때 Data길이를 어떻게 정하는지..

thisnome의 이미지

C -> Pro*C -> Oracle data
위에서 처럼 연동을 하게 되는데요..

문제는..
Data값의 최대 길이가 문자열로 16바이트라고 한다면, Oracle에서는 16자리로 넣고 (varchar2 (16)), C에서는 문자열 마지막의 Null을 포함해서 char[17] 로 잡을텐데, 중간 어디쯤에서 그걸 16으로 바꿔줄지가 의문입니다.

Pro*C에서

char c_data[17]; /* c로부터 입력받은 data */

EXEC SQL BEGIN DECLARE SECTION;
	VARCHAR	proc_data[16];
EXEC SQL END DECLARE SECTION;

strncpy((char *) proc_data.arr, c_data, 16);
proc_data.len = (unsigned short) strlen((char *)proc_data.arr);

위의 코드처럼 c에서 받은 c_data[17]을 proc_data[16]에 카피를 하는 경우 strncpy 에서는 넘어가더라도 strlen()에서 문제가 발생할 소지가 있기 때문에 이렇게 짜면 안될것 같구요..

그렇다면 Pro*C에서도 proc_data의 크기를 17로 잡아주어야 하는건지..
DB에서의 data 크기를 varchar2 (17)로 잡는것이 좋은지..

"정석적인 플레이" 를 알고 싶습니다.

ㅡ,.ㅡ;;의 이미지

thisnome wrote:
C -> Pro*C -> Oracle data
위에서 처럼 연동을 하게 되는데요..

문제는..
Data값의 최대 길이가 문자열로 16바이트라고 한다면, Oracle에서는 16자리로 넣고 (varchar2 (16)), C에서는 문자열 마지막의 Null을 포함해서 char[17] 로 잡을텐데, 중간 어디쯤에서 그걸 16으로 바꿔줄지가 의문입니다.

Pro*C에서

char c_data[17]; /* c로부터 입력받은 data */

EXEC SQL BEGIN DECLARE SECTION;
	VARCHAR	proc_data[16];
EXEC SQL END DECLARE SECTION;

strncpy((char *) proc_data.arr, c_data, 16);
proc_data.len = (unsigned short) strlen((char *)proc_data.arr);

위의 코드처럼 c에서 받은 c_data[17]을 proc_data[16]에 카피를 하는 경우 strncpy 에서는 넘어가더라도 strlen()에서 문제가 발생할 소지가 있기 때문에 이렇게 짜면 안될것 같구요..

그렇다면 Pro*C에서도 proc_data의 크기를 17로 잡아주어야 하는건지..
DB에서의 data 크기를 varchar2 (17)로 잡는것이 좋은지..

"정석적인 플레이" 를 알고 싶습니다.

varchar2 를 17로 잡으세요.
그러면 문제가 없습니다.
님이 코딩한것에서는

proc_data.len = (unsigned short) strlen(c_data);
로 하세요.

그러나.. varchar2에서 16으로 잡고한다는것은.. 스트링처리를 할수 없음으로
항상 메모리 자릿수를 생각하면서 해야합니다. 골치아프죠..


----------------------------------------------------------------------------