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;

Reply via email to