Re: binary data type in Pro*C...
Date: 1998/03/17
Message-ID: <350face6.10353978_at_192.86.155.100>#1/1
A copy of this was sent to kwtse_at_cs.hku.hk (Tse Ka Wai (CS)) (if that email address didn't require changing) On 17 Mar 1998 04:48:03 GMT, you wrote:
>
>in Oracle database there is a data type to hold binary data called "raw".
>in Pro*C, what kind of C datatype should i use to hold that kind of data
>returned in a SQL statement such that minimum conversion is needed?
>
>thanks in advance.
>
>
>tse ka wai CS3 --> ?
Here is an example, there is no conversion with this datatype:
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 100k * bytes of data (we will never allocate that much here, just an upper
- bound, could be MUCH higher (eg: 10,000,000,000) */
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL TYPE my_raw IS LONG VARRAW(100000) REFERENCE;
my_raw * buffer;
EXEC SQL END DECLARE SECTION;
long size = 100000; int i; EXEC SQL WHENEVER SQLERROR DO sqlerror_hard(); printf( "EXEC SQL CREATE TABLE TEST_BLOB ( X LONG RAW );\n" ); EXEC SQL CREATE TABLE TEST_BLOB ( X LONG RAW ); /* * we will allocate a little over 99k 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; printf( "INSERT INTO TEST_BLOB\n" ); EXEC SQL INSERT INTO TEST_BLOB ( 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 TEST_BLOB;\n" ); EXEC SQL SELECT X INTO :buffer FROM TEST_BLOB; /* * 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( "EXEC SQL DROP TABLE TEST_BLOB;\n" ); EXEC SQL DROP TABLE TEST_BLOB;
}
Thomas Kyte
tkyte_at_us.oracle.com
Oracle Government
Herndon VA
http://govt.us.oracle.com/ -- downloadable utilities
Opinions are mine and do not necessarily reflect those of Oracle Corporation
Anti-Anti Spam Msg: if you want an answer emailed to you, you have to make it easy to get email to you. Any bounced email will be treated the same way i treat SPAM-- I delete it. Received on Tue Mar 17 1998 - 00:00:00 CET