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

标签 java oracle plsql jvm blob

嘿,我正在尝试找到一种方法让它运行起来。我正在使用 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());
  }

};

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

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;

最佳答案

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);

关于java - 使用 Oracle JVM 将 blob 作为参数传递给 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4782313/

相关文章:

java - 教科书上有关分隔符使用的错误吗

oracle - 通过函数调用更新多列

oracle - 在Oracle中,open-for和带参数打开游标有什么区别?

java - 处理构造函数中抛出的致命异常

java - 如何根据用户点击替换 jPanel

Oracle 的 C# 参数化查询 - 严重而危险的错误!

oracle - sqlplus无密码登录

sql - 如何在oracle sql Developer中使用spool正确将select语句的结果导出到Csv文件中

oracle - PL/SQL - 当存在歧义时我可以收到警告吗

c# - Java 中 DateTime.FromOADate() 的等价物是什么(Java 中 Datetime 的两倍)