嘿,我正在设法找到一种方法来运行它.我正在使用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);