Easysoft Blog

Thu, 31 May 2018

Inserting an Image from Oracle into SQL Server

In the example, mssqllink is the name of a database link that uses DG4ODBC and Easysoft's SQL Server ODBC driver to connect to SQL Server.

CREATE DIRECTORY IMAGE AS '/tmp';

DECLARE
  curid NUMBER;
  execid NUMBER;
  src_file BFILE:=NULL;
  dst_file BLOB;
  lgh_file BINARY_INTEGER;
  file_status boolean:=false;
  amt BINARY_INTEGER := 2000; -- The maximum image size for this example is 2K.
  buf RAW(2000);
  bound_raw long raw;
  pos INTEGER := 1;

BEGIN
src_file := BFILENAME('IMAGE', 'test.jpg');
file_status := dbms_lob.fileexists( src_file )=1;

if file_status then

  -- open the file
  dbms_lob.createtemporary(dst_file, true, dbms_lob.call);
  dbms_lob.fileopen (src_file);

  -- determine length
  lgh_file := dbms_lob.getlength (src_file);
  dbms_output.put_line('Size : ' || lgh_file);
  if lgh_file<2001 then
      -- Read the file
      -- dbms_lob.loadfromfile(dst_file, src_file, lgh_file);
      Begin
        LOOP
          dbms_output.put_line('Pos : ' || pos);
          dbms_lob.read(src_file, amt, pos, buf);
          bound_raw :=bound_raw || buf;
          -- Process contents of buffer
          pos := pos + amt;
        END LOOP;
        EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
                BEGIN
                    dbms_output.put_line('End of data reached');
                    dbms_lob.fileclose(src_file);
                END;
      -- Insert the blob field
      end;
      dbms_output.put_line('Buffer : ' || buf);
      curid := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@mssqllink; -- Replace this with the name of your linked table
      DBMS_HS_PASSTHROUGH.PARSE@mssqllink(curid,'insert into blb values (1,?)'); -- Destination table in SQL Server
      DBMS_HS_PASSTHROUGH.BIND_VARIABLE_RAW@mssqllink(curid, 1, buf );

      execid := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@mssqllink(curid);
      DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@mssqllink(curid);

      commit;
      dbms_output.put_line('Data sent to Easysoft SQL Server ODBC driver');
    else
        dbms_output.put_line('File size is too big for Oracle');
    end if;
else
  dbms_output.put_line('Can not open file.');
end if;

END;
/


Oracle is a registered trademark of Oracle Corporation and/or its affiliates.