Re: Loading into LONG RAW field.

From: Frans van der Meeren <fmeeren_at_iaehv.nl>
Date: 1995/06/29
Message-ID: <fmeeren.1.00162DBD_at_iaehv.nl>#1/1


In article <3sm301$1ii_at_lantana.singnet.com.sg> setiawan_at_singnet.com.sg (Eddy Setiawan) writes:
>Path:
>news.iaehv.nl!tuegate.tue.nl!news.nic.surfnet.nl!howland.reston.ans.net!gatech!n
>ewsjunkie.ans.net!lantana.singnet.com.sg!usenet
>From: setiawan_at_singnet.com.sg (Eddy Setiawan)
>Newsgroups: comp.databases.oracle
>Subject: Loading into LONG RAW field.
>Date: Mon, 26 Jun 1995 10:38:39 GMT
>Organization: Singapore Telecom Internet Service
>Lines: 16
>Message-ID: <3sm301$1ii_at_lantana.singnet.com.sg>
>NNTP-Posting-Host: ts900-205.singnet.com.sg
>X-Newsreader: Forte Free Agent v0.55

>How can I use SQL*Loader to load binary data into LONG RAW field? For
>example, I have following table:
 

> ARTICLE_ID VARCHAR2(10),
> ARTICLE_BODY LONG RAW
 
>I'm unable to determine the length of ARTICLE_BODY prior to loading.
>How the SQL*Loader control file should look like (for ARTICLE_BODY
>field)?
 

>TIA,
>--
>Eddy Setiawan (setiawan_at_singnet.com.sg)
>DBA, National Computer Board of Singapore (NCB), http://www.ncb.gov.sg/
>Disclaimer: Opinions expressed are strictly private.

Hi there,

I had the same problem. I wanted to insert a signature into a LONG RAW column. This is my solution. I wrote a (simple) Pro*C program (readsign.pc): (begin program)

#include <stdio.h>
#include <string.h>
#define UNAME_LEN   40
struct  drawing     { short           len;
                      unsigned char   buff[30000];
                    };

typedef struct drawing signature;
EXEC SQL BEGIN DECLARE SECTION;
  varchar username[UNAME_LEN];
  EXEC SQL TYPE signature IS VARRAW ( 30000);   signature signa;
EXEC SQL END DECLARE SECTION;
#include <sqlca.h>
int main( int argc, char *argv[]);
void sql_error(char *);
int main(argc, argv)
int argc;
char *argv[];
{  FILE          *f_in;
   char          s_infile[51];
   int           n_cnt, n_var;

   if ( argc != 3)
   { printf("Usage : readsign <file> <username>/<password>\n");

      return(-1);
   }
   strcpy( s_infile, argv[1]);
   if ( (f_in = fopen(s_infile, "rb"))==NULL)    { printf("Cannot open file %s\n", s_infile);

      return(-1);
   }
   strncpy((char *) username.arr, argv[2], UNAME_LEN);    username.len = strlen((char *) username.arr);    EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n");    EXEC SQL CONNECT :username ;
   printf("\nConnected to ORACLE\n");

   n_cnt      = 0;
   n_var      = getc( f_in);

   while ( n_var != EOF )
   { signa.buff[n_cnt] = (unsigned char) n_var;
     n_var             = getc( f_in);
     n_cnt++;

   }
   fclose(f_in);
   signa.len = n_cnt;
   EXEC SQL INSERT INTO SIGNATURES( signa) VALUES (:signa);    EXEC SQL COMMIT WORK RELEASE;
   exit(0);
}
void sql_error(msg)
char *msg;
{ char err_msg[128];

    int buf_len, msg_len;
    EXEC SQL WHENEVER SQLERROR CONTINUE;     printf("\n%s\n", msg);
    buf_len = sizeof (err_msg);
    sqlglm(err_msg, &buf_len, &msg_len);     printf("%.*s\n", msg_len, err_msg);
    EXEC SQL ROLLBACK RELEASE;
    exit(1);
}
(end program)
To compile the program:
Adjust the demo makefile $ORACLE_HOME/proc/demo/proc.mk and rename it to myproc.mk.
Add ( just above '# Suffix rules') :

readsign: readsign.o

        $(CC) $(LDFLAGS) readsign.o -o readsign $(PROLDLIBS)

compile: make -f myproc.mk readsign

hope this helps,



  Margot
  fmeeren_at_iaehv.nl
Received on Thu Jun 29 1995 - 00:00:00 CEST

Original text of this message