Frage

Ich habe in den letzten zwei Tagen mit diesem fest gewesen. Ich habe Funktion go java gespeichert in Oracle-System, das Bild vom lokalen Laufwerk tun Remote-Datenbank kopieren soll und speichern sie in BLOB - es ist CopyBLOB und sieht wie folgt genannt:

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

Die Wrapper-Funktion ist im Paket definiert "MyPackage" als folows:

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

Und die Einfügen-Funktion aufgerufen image_add ist so einfach wie diese:

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

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

Nun das Problem: Wenn ich tippe

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

Ich erhalte die ORA-29531 Fehler: Keine Methode Kopie in der Klasse CopyBLOB. Können Sie mir bitte helfen?

War es hilfreich?

Lösung

Die Methode in der Klasse hat diese Signatur:

public static void copy(int ident, String path)

Aber in Ihrem Java Stored Procedure haben Sie diese Unterschrift angegeben:

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

Ich denke, wenn Sie das erste Argument ändern, Ihr Problem java,lang.Integer sollte sich lösen. Sie sollten wahrscheinlich den Datentyp der ID-Parameter in den IMAGE_ADDER () Verfahren als auch ändern.

Bearbeiten

  

"Alle Ideen, wie lokale Dateien hochladen?"

nicht unangemessen, die Datenbank kann nur interact mit Dateien, die auf seinen Server sichtbar sind. Im Allgemeinen, dass Grenzen Angelegenheiten auf Dateien und Verzeichnisse, die physikalisch auf dem gleichen Feld sind, es sei denn, das Netzwerk-Admin einige Remote-Laufwerke zugeordnet hat.

Übertragen von Dateien von einem lokalen PC-Laufwerk auf einen Server ist wirklich ein Client-Anwendung heißt Problem, es ist nicht die Art von Dingen ist die Datenbank wirklich einlassen soll.

Ich weiß, das ist nicht, was Sie zu hören hofften. Wenn Sie wirklich den Datei-Upload von teh Datenbank fahren wollen, dann bleibt der Mechanismus das gleiche, wenn wir die Übertragung von Dateien über ein Netzwerk wollen: FTP. Tim Halle hat eine PL / SQL-Implementierung für FTP auf seiner Oracle-Basis-Website veröffentlicht. mehr erfahren.

  

"solange die Datei ist smaler als 2000B   (WTF?) "

Das ist verdächtig nahe dem BINARY CHAR Limit (2000). In älteren Versionen von Oracle hatten wir einen zweistufigen Prozess zu verwenden: Einsatz Platzhalter und dann ein Update ausgeben. So etwas wie folgt aus:

  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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top