Скопируйте изображение в BLOB с клиентского ПК, также известного как Java-функция в Oracle - PullRequest
0 голосов
/ 12 июня 2010

Я застрял с этим в течение последних двух дней.Я использую Java-функцию, хранящуюся в системе Oracle, которая должна копировать образ с локального диска, делать удаленную базу данных и сохранять его в BLOB-файле - он называется CopyBLOB и выглядит следующим образом:в пакете "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 Ошибка: нет копии метода в классе CopyBLOB.Можете ли вы помочь мне, пожалуйста?

1 Ответ

1 голос
/ 12 июня 2010

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

public static void copy(int ident, String path)

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

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

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

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

«Есть идеи, как загрузить локальные файлы?»

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

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

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

", если файл меньше, чем 2000B (WTF?) "

Это подозрительно близко к пределу BINARY 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;
...