使用Oracle JVM将blob作为参数传递给java方法

时间:2011-01-24 13:07:25

标签: java oracle plsql jvm blob

嘿,我正试图找到一种方法让它运行起来。我正在使用oracle数据库10g,我将blob存储在一个表中。我希望能够在我的java代码中读出并将blob传递给java方法。我通过loadjava在我的数据库中加载了我的java类。我也存放了存储blob的表格。

这是我的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());
  }

};

这是我在PL / SQL中的Java存储过程(Wrapper)

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'

任何建议让这个运行?谢谢你的时间。

这是我的程序testmethod中的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 个答案:

答案 0 :(得分:3)

testphoto.jpg只是您要传递给方法的文件的名称。您需要将该文件的内容作为blob传递到您的过程中。您将需要代码来实际将文件内容加载到blob变量中,或者如果它已经在数据库中,则从表中提取它。然后你将它作为第二个参数传递给你的程序。

如果你想测试它,你可以创建一个临时表并加载一些blob数据,如下所示:

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

然后,您可以从sqlplus运行一些pl / sql来提取数据并将其传递给您的程序:

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;