LONG 컬럼에 넣을 때 메모리를 동적으로 할당받는 예제
LONG 컬럼에 넣을 때 메모리를 동적으로 할당받는 예제
Bulletin no : 10799
--------------------------------------------------------------------------------
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);
}
![]() | ![]() ![]() | 12-27 | 1786 | |
![]() | ![]() ![]() | 12-11 | 1302 | |
53 | ![]() ![]() | 03-15 | 1043 | |
52 | ![]() ![]() | 01-31 | 1201 | |
51 | ![]() ![]() | 01-31 | 1001 | |
50 | ![]() ![]() | 01-31 | 900 | |
49 | ![]() ![]() | 01-19 | 1202 | |
48 | ![]() ![]() | 01-11 | 1067 | |
47 | ![]() ![]() | 01-03 | 1546 | |
46 | ![]() ![]() | 12-27 | 1786 | |
45 | ![]() ![]() | 12-19 | 1314 | |
44 | ![]() ![]() | 12-14 | 1305 | |
43 | ![]() ![]() | 12-11 | 1302 | |
42 | ![]() ![]() | 12-09 | 1045 | |
41 | ![]() ![]() | 12-01 | 1210 | |
40 | ![]() ![]() | 12-01 | 1419 | |
39 | ![]() ![]() | 12-01 | 920 |
댓글 없음:
댓글 쓰기