Вызов функции Java из PL / SQL с параметрами CLOB и VARCHAR2

1

Я столкнулся с проблемой использования статического метода класса Java в базе данных Oracle 11g, вызванной через 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" в строку, но как я могу это сделать?

Спасибо!

Теги:
plsql

1 ответ

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);
    }
}
  • 0
    Спасибо за быстрый ответ, хотя один вопрос: это ограничит мой входной параметр "p_Input1" не более 32 КБ, максимальный размер для типа данных VARCHAR2 в Oracle, верно?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню