2014-12-04 60 views
1

我卡上存儲在Oracle 11g數據庫使用Java類的靜態方法的問題,通過PL/SQL調用:調用從PL/SQL與CLOB和VARCHAR2參數Java函數

我有包含它看起來像下面的方法的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」 先轉換爲字符串,卻怎麼也我這樣做?

謝謝!

回答

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」限制爲不大於32kb,這是Oracle中VARCHAR2數據類型的最大大小,對不對? – GeorgDangl 2014-12-04 17:35:08