2014년 3월 12일 수요일

pro*c 요약 정리 for Method 4

pro*c 요약 정리 for Method 4

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);
}

댓글 없음:

댓글 쓰기