【问题标题】:How to return an array from Java to PL/SQL?如何将数组从 Java 返回到 PL/SQL?
【发布时间】:2011-12-13 22:25:17
【问题描述】:

我可以在 PL/SQL 到 Java 之间来回传递数字和字符串,但是如何传递 arrays 呢?我是从 PL/SQL 调用 Java - 而不是其他方式。

以下是get_widgets_as_string 按预期工作的示例。如何为so19j.get_widgets_as_array() 编写一个 PL/SQL 调用规范,以便我可以从 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;
/

【问题讨论】:

    标签: java oracle plsql oracle11g


    【解决方案1】:
    /* 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?

    【讨论】:

      【解决方案2】:

      我不知道 pl/sql 的事情,但你可以做的是处理来自 PL/SQL 的结果并将结果插入到 set 方法中,然后你可以得到它。

      【讨论】:

      • 我很抱歉,但我完全不理解这个答案。对我来说,这只是一个 gobbledygook。您(或其他人)想详细说明一下吗?
      猜你喜欢
      • 1970-01-01
      • 2012-06-02
      • 2010-12-09
      • 2013-11-20
      • 2022-08-12
      • 1970-01-01
      • 2020-01-21
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多