Re: Reading a Long raw into a PRO*C variable
From: Thomas J Kyte <tkyte_at_us.oracle.com>
Date: 1995/06/13
Message-ID: <3rkint$oj4_at_inet-nntp-gw-1.us.oracle.com>#1/1
} Received on Tue Jun 13 1995 - 00:00:00 CEST
Date: 1995/06/13
Message-ID: <3rkint$oj4_at_inet-nntp-gw-1.us.oracle.com>#1/1
mortens_at_cibadiag.com (Eric Mortensen) wrote:
>Has anyone been able to move a long raw field from an Oracle table into
>a C variable in PRO*C. We are having trouble figuring out how to do this.
>
>Eric Mortensen
>mortens_at_cibadiag.com
Here is a C subroutine that
- creates a table with a long raw in it. - sets up a data structure capable of handling up to 10meg of raw data - inserts a 'known' value into the table - commits work - retrieves and validates that 'known' value - drops the table
It does this with 500,000 bytes of long raw stuff.
It shows *one* way of handling long raws. Another would be to use a mix of OCI and Pro*C to be able to fetch the long raw by piece.
Thomas Kyte
tkyte_at_us.oracle.com
Oracle Government
static void process()
{
/* * This is the data structure we will use with our LONG RAWs. We will * always use pointers to this structure as we don't know how big we need * until runtime. Will use malloc to allocate storage on the fly. */
typedef struct TAGmy_raw
{
long len; unsigned char arr[1]; } my_raw; /* * Use type equivalencing to tell Oracle that the C type "my_raw" is * equivalent to the Oracle type LONG VARRAW and can hold upto 10,000,000 * bytes of data (we will never allocate that much here, just an upper
- bound */ EXEC SQL TYPE my_raw IS LONG VARRAW(10000000) REFERENCE;
my_raw * buffer; long size = 500000; int i; /* * we will allocate a little over 1/2 meg of space */ buffer = (my_raw *)malloc( size+sizeof(my_raw) ); /* * fill it up with every possible byte value from 0..254 */ for( i = 0; i < size; i++ ) buffer->arr[i] = i % 255; /* * Just like a varchar, set the length field */ buffer->len = size; EXEC SQL WHENEVER SQLERROR CONTINUE; /* * create a database table for the example, * we drop at end of demo */ printf( " CREATE TABLE LONG_RAW_EXAMPLE ( X LONG RAW );\n" ); EXEC SQL CREATE TABLE LONG_RAW_EXAMPLE ( X LONG RAW ); EXEC SQL WHENEVER SQLERROR DO sqlerror_hard(); /* * Insert the long raw into the database */ printf( "INSERT INTO LONG_RAW_EXAMPLE (X) VALUES (:buffer);\n"); EXEC SQL INSERT INTO LONG_RAW_EXAMPLE ( X ) VALUES (:buffer); /* * commit the changes */ printf("EXEC SQL COMMIT WORK;\n" ); EXEC SQL COMMIT WORK; /* * Now, ZERO out the buffer so when we fetch, we know that the buffer * was NOT equal to what it was on the insert. Just to *prove* that * the fetch got back the data we inserted */ memset( buffer->arr, 0, size ); /* * Select out the data */ printf( " SELECT X INTO :buffer FROM LONG_RAW_EXAMPLE;\n" ); EXEC SQL SELECT X INTO :buffer FROM LONG_RAW_EXAMPLE; /* * show what size we got */ printf( "The Length = %ld\n", buffer->len ); /* * Check each character to make sure it is what we inserted */ for( i = 0; i < size; i++ ) if ( buffer->arr[i] != i % 255 ) { printf( "Error! %d != %d\n", buffer->arr[i], i%255 ); break; } /* * drop that table */ printf( " DROP TABLE LONG_RAW_EXAMPLE;\n" ); EXEC SQL DROP TABLE LONG_RAW_EXAMPLE;
} Received on Tue Jun 13 1995 - 00:00:00 CEST