简体   繁体   English

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

[英]Calling a Java function from PL/SQL with CLOB and VARCHAR2 Parameters

I'm stuck on a problem with using a java class' static method in an Oracle 11g Database, called via PL/SQL: 我陷入在通过PL / SQL调用的Oracle 11g数据库中使用Java类的静态方法的问题:

I have got a java class that contains a method which looks like the following: 我有一个Java类,其中包含一个如下所示的方法:

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

Calling from PL/SQL, I want to pass a CLOB and two VARCHAR2 datatypes as parameters. 从PL / SQL调用,我想传递一个CLOB和两个VARCHAR2数据类型作为参数。

My function definition in PL/SQL looks (currently) like this: 我在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'; 

It looks like I need to convert the "clob" to a string first, but how can I do that? 看来我需要先将“ clob”转换为字符串,但是我该怎么做呢?

Thank you! 谢谢!

Approach 1: Converting at database level 方法1:在数据库级别转换

In order to convert clob to string you can use dbms_lob.substr method. 为了将clob转换为字符串,可以使用dbms_lob.substr方法。

For example: 例如:

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

In your case, you can alter the HelloWorldExample like following: 您可以按照以下方式更改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';

And, while invoking HelloWorldExample you can convert clob to string like following: 并且,在调用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;
/

Approach 2: Converting at application level 方法2:在应用程序级别进行转换

Also, you can use Java's Clob type: 另外,您可以使用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';

The java program needs to be updated as following: Java程序需要进行如下更新:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM