Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CLOB和VARCHAR2参数从PL/SQL调用Java函数_Java_Oracle_Plsql - Fatal编程技术网

使用CLOB和VARCHAR2参数从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

在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(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数据类型的最大大小,对吗?