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;
/