https://community.oracle.com/thread/470562?tstart=1260
http://cluster1.cafe.daum.net/_c21_/bbs_search_read?grpid=1GBrw&fldid=DMtF&datanum=57&openArticle=true&docid=1GBrwDMtF5720090121152640
LONG 컬럼에 넣을 때 메모리를 동적으로 할당받는 예제 PRO*C를 이용하여 LONG 컬럼에 텍스트 화일 등의 데이타를 넣는 예제다. Memory Allocation을 dynamic하게 처리한 경우인데, FILESIZE 대신에 실제 의 화일 크기 등을 이용하여 Memory Allocation을 하면 된다. LONG 컬럼을 처리하기 위해서 사용되는 HOST 변수는 다음 예제처럼 EXTERNAL DATA TYPE인 LONG VARCHAR 사용해야 한다. EXTERNAL DATATYPE은 바로 사용할 수는 없으므로 TYPE 을 선언해서 사용한다. LONG 컬럼에 들어 있는 데이타가 작은 경우에는 VARCHAR를 사용해도 처리가 가능하지만 VARCHAR에서는 .len 필드가 unsinged short 로 선언되어 있기 때문에 처리 가능한 데이타가 이 값에 제한을 받는다. char로 선언하게 되면 INSERT시에는 별 문제가 없지만 SELECT시에는 ORA-932 에러가 발생하므로 사용할 수가 없다. #include #define FILESIZE 10000 typedef struct TAGmy_long { int len; unsigned char arr[1]; } my_long; VARCHAR username[20]; VARCHAR password[20]; EXEC SQL TYPE my_long IS LONG VARCHAR(1000000000) REFERENCE; EXEC SQL INCLUDE sqlca; my_long *buffer; void sqlerror(); /* handles unrecoverable errors */ FILE *fp; main() { strcpy(username.arr, "SCOTT"); username.len = strlen(username.arr); strcpy(password.arr, "TIGER"); password.len = strlen(password.arr); EXEC SQL WHENEVER SQLERROR DO sqlerror(); EXEC SQL CONNECT :username IDENTIFIED BY :password; EXEC SQL WHENEVER SQLERROR DO sqlerror(); buffer = (my_long *)malloc(sizeof(my_long)+FILESIZE); fp=fopen("longtest.txt","r"); fread(buffer->arr, 1, FILESIZE, fp); buffer->len = FILESIZE; EXEC SQL INSERT INTO LONGTEST VALUES (:buffer); EXEC SQL COMMIT WORK RELEASE; } void sqlerror() { EXEC SQL WHENEVER SQLERROR CONTINUE; printf("\nORACLE error detected:\n"); printf("\n% .70s \n", sqlca.sqlerrm.sqlerrmc); EXEC SQL ROLLBACK WORK RELEASE; exit(1); } |
댓글 없음:
댓글 쓰기