Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.misc -> Re: Extract a binary file from LONG field?
Using V7.3 OCI from 'C'...
/* * This sample uses the table FILES which is defined as follows: * create table FILES (name VARCHAR2(20), len NUMBER, data LONGRAW);
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <string.h>
#include <ociapr.h>
// Define the OCI datatypes
#define VARCHAR2_TYPE 1
#define NUMBER_TYPE 2
#define INT_TYPE 3
#define FLOAT_TYPE 4
#define STRING_TYPE 5
#define ROWID_TYPE 11
#define DATE_TYPE 12
#define LONG_RAW 24
#define LONG_VARRAW 95
void main()
{
Cda_Def lda; Cda_Def cda; char hda[256]; FILE* fhndl; // Data variables char* filedat; // The acutal raw data int fileread; // The length of the raw data read in int filelen; // The length of the file char filenam[20]; // The name of the file int filepos; // The offset marker in the LONG RAW column int filechnk; // The size of the file chunkfetched
// Indicator variables short i_filelen = 0; short i_filenam = 0; short i_filedat = 0; // Open the input file strcpy(filenam,"MYFILE.EXE"); fhndl = fopen(filenam, "rb"); // Determine the length of the file filelen = filelength(fileno(fhndl)); // Allocate memory for the file buffer plus 4 bytes for OCI long raw handling filedat = (char*) malloc(filelen+4); memset(filedat,0,filelen+4); // Set the first four bytes of the buffer to the file length (*(long*)filedat) = (long)filelen; // Read in the raw data from the file at offset 4 fileread = fread( filedat+4, 1, filelen, fhndl ); fclose(fhndl); // Check to ensure that the filelenght equals the lenght of the data read in if (fileread != filelen) { printf("Error reading file ..."); return; } // Insert the file using OCI memset(hda,0,255); if
printf( "Logon: %i", lda.rc );
if (oopen(&cda,&lda,0,-1,-1,0,-1)) printf( "Open: %i", cda.rc ); if (oparse(&cda, (text*)"insert into FILES values (:filenam,:filelen,:filedat)", -1,1,2)) printf( "Parse: %i", cda.rc ); if
&i_filenam,0,0,0,0,0,-1,-1)) printf( "Bind: %i", cda.rc ); if
&i_filelen,0,0,0,0,0,-1,-1)) printf( "Bind: %i", cda.rc ); // We are binding as a LONG VARRAW in order to allow for files > 64k if (obndra(&cda,(text*)":filedat",-1,(text*)filedat,-1,LONG_VARRAW,-1, &i_filedat,0,0,0,0,0,-1,-1)) printf( "Bind: %i", cda.rc ); if (oexec(&cda)) printf( "Exec: %i", cda.rc ); if (ocom(&lda)) printf( "Commit: %i", lda.rc ); if (ocan(&cda)) printf( "Cancel: %i", lda.rc ); if (ologof(&lda)) printf( "Logof: %i", lda.rc ); // Release the buffer associated with filedat free(filedat); // Fetch the file using OCI memset(hda,0,255); if
printf( "Logon: %i", lda.rc );
if (oopen(&cda,&lda,0,-1,-1,0,-1)) printf( "Open: %i", cda.rc ); if (oparse(&cda, (text*)"select NAME, LEN from FILES", -1,1,2)) printf( "Parse: %i", cda.rc ); if (odefin(&cda,1,(text*)&filenam,20,STRING_TYPE,-1,&i_filenam,0,0,-1,0,0)) printf( "Define: %i", cda.rc ); if (odefin(&cda,2,(text*)&filelen,sizeof(int),INT_TYPE,-1,&i_filelen,0,0,-1,0,0)) printf( "Define: %i", cda.rc ); if (oexfet(&cda,1,0,0)) printf( "Exec Fet: %i", cda.rc ); // Allocate memory for the file buffer filedat = (char*) malloc(65535); // We will fetch in 64k chunks memset(filedat,0,65535); if (oparse(&cda, (text*)"select DATA from FILES", -1,1,2)) printf( "Parse: %i", cda.rc ); // We are binding as a LONG RAW since we know the length from the table if (odefin(&cda,1,filedat,65535,LONG_RAW,-1,&i_filedat,0,0,-1,0,0)) printf( "Define: %i", cda.rc ); if (oexfet(&cda,1,0,0)) printf( "Exec: %i", cda.rc ); // Open the ouput file strcpy(filenam,"OFILE.EXE"); // Change the output file name for demo fhndl = fopen(filenam, "wb"); // We already have our first chunk so write to to file fwrite(filedat,1,65535,fhndl); // The cursor is on the current record so fetch the column filepos = 65535; while (filepos < filelen) { if (oflng(&cda,1,filedat,65535,LONG_RAW,&filechnk,filepos)) printf( "Exec: %i", cda.rc ); // Write this chunck to file fwrite(filedat,1,filechnk,fhndl); filepos += filechnk; } fclose(fhndl); if (ocan(&cda)) printf( "Cancel: %i", lda.rc ); if (ologof(&lda)) printf( "Logof: %i", lda.rc ); return;
![]() |
![]() |