使用CLOB和VARCHAR2参数从PL/SQL调用Java函数
在Oracle 11g数据库中使用java类的静态方法(通过PL/SQL调用)时,我遇到了一个问题: 我有一个java类,它包含一个如下所示的方法:使用CLOB和VARCHAR2参数从PL/SQL调用Java函数,java,oracle,plsql,Java,Oracle,Plsql,在Oracle 11g数据库中使用java类的静态方法(通过PL/SQL调用)时,我遇到了一个问题: 我有一个java类,它包含一个如下所示的方法: create or replace FUNCTION HelloWorldExample ( p_Input1 VARCHAR2, p_Input2 VARCHAR2, p_Input3 VARCHAR2 ) RETURN CLOB AS LANGUAGE JAVA NAME 'OuterClass.WriteIt(j
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';
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;
/
public class OuterClass
{
public static String WriteIt(Clob Input1, String Input2, String Input3)
{
return input1.getSubString(1,500);
}
}
公共类外部类
{
公共静态字符串写入(字符串输入1、字符串输入2、字符串输入3)
{
返回“你好,世界!”;
}
}
从PL/SQL调用时,我希望传递一个CLOB和两个VARCHAR2数据类型作为参数
PL/SQL中的函数定义(当前)如下所示:
创建或替换函数HelloWorldExample
(
p_输入1 CLOB,
p_输入2 VARCHAR2,
p_输入3 VARCHAR2
)
返回CLOB
作为JAVA语言
名称'OuterClass.WriteIt(java.lang.String、java.lang.String、java.lang.String)返回java.lang.String'代码>方法1:在数据库级别转换
为了将clob转换为字符串,可以使用dbms\u lob.substr
方法
例如:
create table a1(a clob);
insert into a1 values(rpad('a',1000,'b'));
select dbms_lob.substr(a,500,1) from a1;
在您的情况下,可以修改HelloWorld示例,如下所示:
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';
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;
/
public class OuterClass
{
public static String WriteIt(Clob Input1, String Input2, String Input3)
{
return input1.getSubString(1,500);
}
}
并且,在调用HelloWorldExample时,可以将clob转换为字符串,如下所示:
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';
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;
/
public class OuterClass
{
public static String WriteIt(Clob Input1, String Input2, String Input3)
{
return input1.getSubString(1,500);
}
}
方法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程序需要更新如下:
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';
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;
/
public class OuterClass
{
public static String WriteIt(Clob Input1, String Input2, String Input3)
{
return input1.getSubString(1,500);
}
}
感谢您的快速回复,不过有一个问题:这将限制我的输入参数“p_Input1”不超过32kb,这是Oracle中VARCHAR2数据类型的最大大小,对吗?