title: Copy image to BLOB from client pc aka Java function in Oracle
body: <p>I've been stuck with this for past two days. I've go java function stored in Oracle system which is supposed to copy image from local drive do remote database and store it in BLOB - it's called CopyBLOB and looks like this:</p>
  
  <pre><code>  import java.sql.*;  
    import oracle.sql.*;
    import java.io.*;
  
  public class CopyBLOB 
  {
    static int id;
    static String  fileName = null;
    static Connection conn = null;  
  
    public CopyBLOB(int idz, String f) 
    {
      id       = idz;
      fileName   = f;
    }
  
     public static void copy(int ident, String path) throws SQLException, FileNotFoundException 
     {
         CopyBLOB cpB = new CopyBLOB(ident, path);
         cpB.getConnection();
         cpB.callUpdate(id, fileName);
     }
  
      public void getConnection() throws SQLException
      {    
       DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
       try 
       {     
         conn = DriverManager.getConnection("jdbc:oracle:thin:@oraserv.ms.mff.cuni.cz:1521:db", "xxx", "xxx");
       } 
       catch (SQLException sqlex) 
       {
           System.out.println("SQLException while getting db connection: "+sqlex);
           if (conn != null)  conn.close();
       } 
       catch (Exception ex) 
       {
           System.out.println("Exception while getting db connection: "+ex);
           if (conn != null) conn.close();
       }
      }
  
      public void callUpdate(int id, String file ) throws SQLException, FileNotFoundException 
      {
        CallableStatement cs = null;
        try 
        {  
          conn.setAutoCommit(false);
          File f = new File(file);
          FileInputStream fin = new FileInputStream(f);
          cs = (CallableStatement) conn.prepareCall( "begin add_image(?,?); end;" );
          cs.setInt(1, id );
          cs.setBinaryStream(2, fin, (int) f.length());
          cs.execute();
          conn.setAutoCommit(true);        
        } 
        catch ( SQLException sqlex ) 
        {
              System.out.println("SQLException in callUpdateUsingStream method of given status : " + sqlex.getMessage() );
        } 
        catch ( FileNotFoundException fnex ) 
        {
              System.out.println("FileNotFoundException in callUpdateUsingStream method of given status : " + fnex.getMessage() );
        } 
        finally 
        {
            try 
            {          
              if (cs != null)  cs.close();
              if (conn != null) conn.close();
            } 
            catch ( Exception ex ) 
            {
              System.out.println("Some exception in callUpdateUsingStream method of given status : " + ex.getMessage(  ) );
            }
        }
      }
  }
  </code></pre>
  
  <p>The wrapper function is defined in package "MyPackage" as folows:</p>
  
  <pre><code>  procedure image_adder( id varchar2, path varchar2 )  
    AS
      language java name 'CopyBLOB.copy(java.lang.String, java.lang.String)';
  </code></pre>
  
  <p>And the inserting function called image_add is as simple as this:</p>
  
  <pre><code>procedure add_image( id numeric(10), pic blob)
    AS 
  
    BEGIN
      insert into pictures values (seq_pic.nextval, id, pic);
    END add_image;
  </code></pre>
  
  <p>Now the problem: When I type </p>
  
  <pre><code>call MyPackage.image_adder(1, 'd:\samples\img.jpg');
  </code></pre>
  
  <p>I get the ORA-29531 Error: No method copy in class CopyBLOB.
  Can you help me, please?</p>