2011-10-24 21 views
5

我沒有問題從PL/SQL向Java傳遞數字和字符串,但是如何通過數組?我從PL/SQL調用Java - 而不是其他方式。如何將數組從Java返回到PL/SQL?

以下是get_widgets_as_string按預期工作的示例。如何編寫PL/SQL 呼叫規範so19j.get_widgets_as_array(),以便我可以從PL/SQL調用它?

我已閱讀Publishing Java Classes With Call Specifications我可以看到嵌套表對應於oracle.sql.ARRAY,但我無法正常工作。我可能錯過了一些微不足道的細節,因爲我不是Java程序員。

create or replace and compile java source named "so19j" as 

import java.lang.*; 

public class so19j { 
    public static String get_widgets_as_string() { 
     String widgets = "foo;bar;zoo"; 
     return widgets; 
    } 

    public static String[] get_widgets_as_array() { 
     String[] widgets = new String[]{"foo", "bar", "zoo"}; 
     return widgets; 
    } 
}; 
/
show errors java source "so19j" 

create or replace function get_widgets_as_string return varchar2 as 
language java name 'so19j.get_widgets_as_string() return java.lang.String'; 
/
show errors 

declare 
    widgets constant varchar2(32767) := get_widgets_as_string; 
begin 
    dbms_output.put_line('widgets = ' || widgets); 
end; 
/

/* How to write a call specification for so19j.get_widgets_as_array so that it 
can be excercised by the PL/SQL block below ? */ 

declare 
    type widgets_t is table of varchar2(32767); 
    widgets constant widgets_t := get_widgets_as_array; 
begin 
    for i in widgets.first .. widgets.last loop 
    dbms_output.put_line('widgets(' || i || ') = ' || widgets(i)); 
    end loop; 
end; 
/

回答

2
/* The type has to be SQL type so that it is also visible for Java. */ 
create or replace type widgets_t is table of varchar2(32767); 
/

create or replace and compile java source named "so19ja" as 
import java.lang.*; 
public class so19ja { 
    public static String[] get_widgets_as_array() { 
     String[] widgets = new String[]{"foo", "bar", "zoo"}; 
     return widgets; 
    } 

    public static java.sql.Array array_wrapper(
     String typeName, 
     Object elements 
    ) throws java.sql.SQLException { 
     oracle.jdbc.OracleDriver ora = new oracle.jdbc.OracleDriver(); 
     java.sql.Connection conn = ora.defaultConnection(); 
     oracle.jdbc.OracleConnection oraConn = 
      (oracle.jdbc.OracleConnection)conn; 
     /* Yeah - typeName have to be UPPERCASE, really. */ 
     java.sql.Array arr = 
      oraConn.createARRAY(typeName.toUpperCase(), elements); 
     return arr; 
    } 

    public static java.sql.Array get_widgets_as_array_wrapped() 
    throws java.sql.SQLException { 
     return array_wrapper("widgets_t", get_widgets_as_array()); 
    } 
}; 
/
show errors java source "so19ja" 

create or replace function get_widgets_as_array return widgets_t as 
language java name 'so19ja.get_widgets_as_array_wrapped() return java.sql.Array'; 
/
show errors 

declare 
    widgets constant widgets_t := get_widgets_as_array; 
begin 
    for i in widgets.first .. widgets.last loop 
    dbms_output.put_line('widgets(' || i || ') = ' || widgets(i)); 
    end loop; 
end; 
/

打印:

widgets(1) = foo 
widgets(2) = bar 
widgets(3) = zoo 

PL/SQL procedure successfully completed. 

參見:How to create an oracle.sql.ARRAY object?

0

我不知道關於PL/SQL的事情,但什麼ü可以做的是處理來自PL/SQL的結果,並將結果插入到了一套方法,再後來ü可以得到它。

+1

我很抱歉,但我在盯着總不理解這個答案。對我而言,這僅僅是一個gobbledygook。你(或其他人)是否願意詳細闡述一下? – user272735