Я столкнулся с проблемой использования статического метода класса 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" в строку, но как я могу это сделать?
Спасибо!
Подход 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);
}
}