使用Oracle JVM在Java方法上将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存储过程(包装程序)

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

它将java类加载到数据库中,然后我的包装器也进行编译并存储.

当我想运行时执行testmethod(testphoto.jpg);

它给了我错误:’必须声明testphoto.jpg’

有什么建议可以运行吗?谢谢你的时间.

这是我的过程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;

解决方法:

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,如下所示:

从blobtest中选择dbms_lob.getLength(filecontents);

上一篇:PLSQL——01、PLSQL语句的结构


下一篇:Oracle_PLSQL创建用户表空间