Скопируйте изображение на BLOB из клиента PC AKA Java Функция в Oracle

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

Вопрос

Я застрял с этим в течение последних двух дней. Я иду на Java Функция, хранящаяся в Oracle System, которая должна копировать изображение с локального диска DO удаленной базы данных и хранить его в BLOB - это называется copyblob и выглядит так:

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

Функция обертки определяется в упаковке «MyPackage», как показало:

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

И функция вставки называется image_add так же просто, как это:

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

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

Теперь проблема: когда я печатаю

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

Я получаю ошибку ORA-29531: нет копии метода в классе COPEBLOB. Не могли бы вы мне помочь?

Это было полезно?

Решение

Метод в вашем классе имеет эту подпись:

public static void copy(int ident, String path)

Но в вашей хранимой процедуре Java вы указали эту подпись:

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

Я думаю, что если вы измените первый аргумент java,lang.Integer Ваша проблема должна решить себя. Возможно, вы должны изменить тип данных параметра ID в процедуре Image_Adder ().

редактировать

«Любые идеи, как загружать локальные файлы?»

Не необоснованно, база данных может взаимодействовать только с файлами, которые видны на свой сервер. Как правило, это ограничивает вопросы для файлов и каталогов, которые физически находятся в том же коробке, если только администратор сети не сопостает некоторых удаленных дисков.

Передача файлов с локального ПК-накопителя на сервер - это действительно клиент, т. Е. Проблема приложений, это не то, что база данных действительно должна быть связана с.

Я знаю, что это не то, что вы надеялись услышать. Если вы действительно хотите управлять загрузкой файлов из базы данных TEH, то механизм остается прежним, когда мы хотим передавать файлы через сеть: FTP. Тим Холл опубликовал реализацию PL / SQL для FTP на своем сайте Oracle-Base. Узнать больше.

«Долгое, как файл Smaler, чем 2000b (WTF?)»

Это подозрительно близко к бинарному ограничению CHAR (2000). В более старых версиях Oracle нам пришлось использовать двухступенчатый процесс: вставьте заполнитель, а затем выдать обновление. Что-то вроде этого:

  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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top