Передача BLOB-объекта в качестве параметра в Java-метод с использованием Oracle JVM - PullRequest
3 голосов
/ 24 января 2011

Эй, я пытаюсь найти способ запустить это. Я использую базу данных Oracle 10g, где у меня есть капли, хранящиеся в таблице. Я хочу быть в состоянии прочитать и передать BLOB-объект в метод Java в моем коде Java. Я загрузил свой класс Java в моей базе данных с помощью loadjava. Стол, в котором я храню свои капли, тоже накрыт.

Это мой класс Java и метод, который я хотел бы передать BLOB

import java.lang.*;
import java.sql.*;
import oracle.sql.*;

public class Test
{

  public static void getWidth(BLOB myBlob) throws Exception
  {
    System.out.println(myblob.length());
  }

};

А это моя хранимая процедура Java (Wrapper) в PL / SQL

CREATE OR REPLACE PROCEDURE testmethod (p_blob  IN  BLOB)
AS LANGUAGE JAVA   
NAME 'Test.getWidth(oracle.sql.BLOB)';

Он загружает класс java в базу данных, а моя обертка компилируется и сохраняется.

Когда я хочу запустить execute testmethod(testphoto.jpg);

выдает ошибку: 'testphoto.jpg must be declared'

Какой-нибудь совет, чтобы запустить это? Спасибо за ваше время.

Это мой PL / SQL BLock из моего метода испытаний:

DECLARE  
  P_FILE VARCHAR2(200);  
  P_BLOB BLOB;  
BEGIN  
  P_FILE := NULL;  
  P_BLOB := NULL;  

  TESTMETHOD(  
    P_FILE => P_FILE,  
    P_BLOB => P_BLOB  
  );  
END;

1 Ответ

3 голосов
/ 24 января 2011

testphoto.jpg - это просто имя файла, который вы хотите передать методу. Вам нужно содержимое этого файла в виде большого двоичного объекта для передачи в вашу процедуру. Вам понадобится код, чтобы фактически загрузить содержимое файла в переменную BLOB-объекта или извлечь его из таблицы, если он уже находится в базе данных. Затем вы передадите это как второй аргумент вашей процедуре.

Если вы хотите проверить это, вы можете создать временную таблицу и загрузить ее с некоторыми данными BLOB-объектов, например:

create table blobtest (filecontents blob);
insert into blobtest values (utl_raw.cast_to_raw('Test Data'));

Затем вы можете запустить pl / sql из sqlplus, чтобы получить эти данные и передать их вашей процедуре:

declare
  temp blob;
  filename varchar2(200) := 'Test';
begin

  select filecontents
    into temp
    from blobtest;

  testmethod(filename, temp);

end;
/

Конечно, если данные уже были в таблице, и вам нужна была длина BLOB-объекта, вы могли бы использовать функцию dbms_lob getLength примерно так:

select dbms_lob.getLength(filecontents) from blobtest;

...