This dirty hack worked for me, although its not efficient. Tricky to get a BLOB into ij.. anyone has a simpler way? Probably better to write a small app to load a set of files..
Thanks, Dag cat - > foo.sql <<"EOF" connect 'jdbc:derby:wombat;create=true'; create table t (id int, b blob(100m)); create function jpg(v varchar(50)) returns blob(100m) language java no sql parameter style java external name 'ReadJpg.read'; autocommit off; prepare p as 'insert into t values(?,?)'; execute p using 'values (1,jpg(''foo.jpg''))'; select * from t; commit; execute p using 'values (2,jpg(''foo.jpg''))'; select * from t; commit; exit; EOF export CLASSPATH=derby.jar:derbytools.jar:ReadJpg.jar java org.apache.derby.tools.ij foo.sql where the function maps to the Java program 'ReadJpg' is below which must be on the classpath as shown above: import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.FileNotFoundException; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class ReadJpg { /** * @param args the command line arguments */ public static Blob read(String fileName) throws FileNotFoundException, SQLException { File f = new File(fileName); InputStream i = new FileInputStream(f); Connection c = DriverManager.getConnection("jdbc:derby:memory:tmp;create=true"); try { c.createStatement().executeUpdate("create table t(v blob(100m))"); } catch (SQLException e) { // already created } PreparedStatement ps = c.prepareStatement("insert into t values (?)"); ps.setBinaryStream(1, i); ps.executeUpdate(); ResultSet rs = c.createStatement().executeQuery("select v from t"); rs.next(); return rs.getBlob(1); } } Output on my console: $ bash script.sql ij version 10.9 ij> connect 'jdbc:derby:wombat;create=true'; ij> create table t (id int, b blob(100m)); 0 rows inserted/updated/deleted ij> create function jpg(v varchar(50)) returns blob(100m) language java no sql parameter style java external name 'ReadJpg.read'; 0 rows inserted/updated/deleted ij> autocommit off; ij> prepare p as 'insert into t values(?,?)'; ij> execute p using 'values (1,jpg(''foo.jpg''))'; 1 row inserted/updated/deleted ij> commit; ij> select * from t; ID |B -------------------------------------------------------------------------------------------------------------------------------------------- 1 |616272616b6164616272610a 1 row selected ij> execute p using 'values (2,jpg(''foo.jpg''))'; 1 row inserted/updated/deleted ij> commit; ij> select * from t; ID |B -------------------------------------------------------------------------------------------------------------------------------------------- 1 |616272616b6164616272610a 2 |616272616b6164616272610a 2 rows selected ij> exit;