使用CLOB和VARCHAR2参数从PL / SQL调用Java函数

时间:2014-12-04 17:04:48

标签: java oracle plsql

我遇到了在Oracle 11g数据库中使用java类'静态方法的问题,通过PL / SQL调用:

我有一个java类,其中包含一个类似于以下内容的方法:

public class OuterClass
{
  public static String WriteIt(String Input1, String Input2, String Input3)
    {
      return "Hello World!";
    }
}

从PL / SQL调用,我想传递一个CLOB和两个VARCHAR2数据类型作为参数。

我在PL / SQL中的函数定义看起来(目前)如下:

create or replace FUNCTION HelloWorldExample
(
  p_Input1 CLOB,
  p_Input2 VARCHAR2,
  p_Input3 VARCHAR2
)
   RETURN CLOB
   AS LANGUAGE JAVA
   NAME 'OuterClass.WriteIt(java.lang.String,java.lang.String,java.lang.String) return java.lang.String';

看起来我需要先将“clob”转换为字符串,但我该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:2)

方法1:在数据库级转换

为了将clob转换为字符串,您可以使用dbms_lob.substr方法。

例如:

create table a1(a clob);
insert into a1 values(rpad('a',1000,'b'));
select dbms_lob.substr(a,500,1) from a1;

在您的情况下,您可以更改HelloWorldExample,如下所示:

create or replace FUNCTION HelloWorldExample
(
  p_Input1 VARCHAR2,
  p_Input2 VARCHAR2,
  p_Input3 VARCHAR2
)
   RETURN CLOB
   AS LANGUAGE JAVA
   NAME 'OuterClass.WriteIt(java.lang.String,java.lang.String,java.lang.String) 
   return java.lang.String';

并且,在调用HelloWorldExample时,您可以将clob转换为字符串,如下所示:

declare
   ccol clob;
   outs varchar2(2000);
begin
   select a into ccol from a1;
   outs := HelloWorldExample(dbms_lob.substr(ccol,500,1),'somestr1','somestr2');
   dbms_output.put_line(outs);
end;
/

方法2:在应用程序级别转换

此外,您可以使用Java的Clob类型:

create or replace FUNCTION HelloWorldExample
(
  p_Input1 CLOB,
  p_Input2 VARCHAR2,
  p_Input3 VARCHAR2
)
   RETURN CLOB
   AS LANGUAGE JAVA
   NAME 'OuterClass.WriteIt(java.sql.Clob,java.lang.String,java.lang.String) 
   return java.lang.String';

java程序需要更新如下:

public class OuterClass
{
  public static String WriteIt(Clob Input1, String Input2, String Input3)
    {
      return input1.getSubString(1,500);
    }
}