Copiar la imagen a BLOB de la PC del cliente también conocido como la función de Java en Oracle

StackOverflow https://stackoverflow.com/questions/3029021

Pregunta

Me han pegado con esto por dos últimos días. la función de Java va yo he guardado en el sistema de Oracle que se supone que copiar la imagen desde una unidad local hacer base de datos remota y almacenarlo en BLOB - Se llama CopyBLOB y se ve así:

  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(  ) );
          }
      }
    }
}

La función de contenedor se define en el paquete "MyPackage" como folows:

  procedure image_adder( id varchar2, path varchar2 )  
  AS
    language java name 'CopyBLOB.copy(java.lang.String, java.lang.String)';

Y la función de inserción de llamada image_add es tan simple como esto:

procedure add_image( id numeric(10), pic blob)
  AS 

  BEGIN
    insert into pictures values (seq_pic.nextval, id, pic);
  END add_image;

Ahora el problema: cuando se escribe

call MyPackage.image_adder(1, 'd:\samples\img.jpg');

Me sale el error ORA-29531: No se copia en el método CopyBLOB clase. ¿Me puede ayudar, por favor?

¿Fue útil?

Solución

El método en su clase tiene esta firma:

public static void copy(int ident, String path)

Sin embargo, en el procedimiento almacenado de Java que ha especificado esta firma:

'CopyBLOB.copy(java.lang.String, java.lang.String)'

Creo que si cambia el primer argumento de java,lang.Integer su problema debe resolverse. Probablemente debería cambiar el tipo de datos del parámetro de identificación en el procedimiento IMAGE_ADDER () también.

editar

  

"alguna idea de cómo cargar archivos locales?"

No sin razón, la base de datos sólo puede interactuar con archivos que son visibles a su servidor. En general, que limita los asuntos a los archivos y directorios que están físicamente en la misma caja, a menos que el administrador de red ha trazado algunas unidades remotas.

La transferencia de archivos desde una unidad de PC local a un servidor es realmente un problema de aplicación de cliente, es decir, no es el tipo de cosas realmente la base de datos debe involucrarse.

Sé que no es lo que usted esperaba oír. Si realmente desea conducir la carga de archivos de teh base de datos, entonces el mecanismo sigue siendo el mismo cada vez que queremos transferir archivos a través de una red: FTP. Tim Hall ha publicado una aplicación PL / SQL para FTP en su sitio de Oracle-base. Descubre más .

  

"siempre que el archivo es de smaler 2000B   (WTF?) "

Eso es sospechosamente cerca del límite BINARIO CHAR (2000). En las versiones anteriores de Oracle que tuvimos que utilizar un proceso de dos pasos: insertar un marcador de posición y luego emitir una actualización. Algo como esto:

  procedure add_image( id numeric(10), pic blob) 
  AS       
  BEGIN 
      insert into pictures 
          values (seq_pic.nextval, id, empty_blob()); 
      update pictures 
      set col_pic = pic
      where id = seq_pic.currval;
  END add_image;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top