在使用Oracle JVM的Java方法中将Blob作为参数传递

3

嘿,我正在尝试找到一种方法来运行它。我正在使用Oracle 10g数据库,在其中有一个存储在表中的BLOB。我希望能够读取并将BLOB传递给我Java代码中的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());
  }

};

这是我的Java存储过程(包装器)在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必须声明'

有什么建议可以让这个程序运行起来吗?感谢您的时间。

这是我的PL/SQL过程testmethod的代码块:

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

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;


很不幸,我遇到了这个错误:原因:尝试执行一个Java类中未被先前编译或无法成功解析的方法。操作:调整调用或使该类可解析。 - daniel
我需要在 ('测试数据') 中放什么? - daniel
@DannyRe:你不需要这样做,那只是我为了进行简单测试而将字符串值转换为Blob。 - Doug Porter
你能帮我吗?该死,我明天需要它工作... :( - daniel
不用管字符串。我在我的方法中已经删除了它。我只想将 blob 从我的表格传递到我的 Java 方法中,并获得一个信息,比如从 Java 方法中打印出长度等。 - daniel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接