【问题标题】:Calling a Java function from PL/SQL with CLOB and VARCHAR2 Parameters使用 CLOB 和 VARCHAR2 参数从 PL/SQL 调用 Java 函数
【发布时间】:2014-12-04 17:04:47
【问题描述】:

在 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”转换为字符串,但我该怎么做呢?

谢谢!

【问题讨论】:

    标签: java oracle plsql


    【解决方案1】:

    方法 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);
        }
    }
    

    【讨论】:

    • 感谢您的快速回复,不过有一个问题:这将限制我的输入参数“p_Input1”不大于 32kb,这是 Oracle 中 VARCHAR2 数据类型的最大大小,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多