如何创建oracle.sql.ARRAY对象?

问题描述 投票:0回答:7

这个问题与我原来的问题相关How to return an array from Java to PL/SQL ?,但更具体。

我一直在阅读 Oracle 数据库 JDBC 开发人员指南

但我仍然无法编写可以使用

创建 ARRAY 的最少代码
ARRAY array = oracle.jdbc.OracleConnection.createARRAY(sql_type_name, elements);

按照创建 ARRAY 对象中的说明。

我正在使用 Oracle 数据库 JVM。

我尝试过以下方法:

示例1

create or replace type widgets_t is table of varchar2(32767);
/

create or replace and compile java source named "so20j1" as
public class so20j1 {
    public void f1() {
        String[] elements = new String[]{"foo", "bar", "zoo"};
        oracle.sql.ARRAY widgets =
            oracle.jdbc.OracleConnection.createARRAY("widgets_t", elements);
    }
};
/
show errors java source "so20j1"

失败:

Errors for JAVA SOURCE "so20j1":

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0  so20j1:4: non-static method
     createARRAY(java.lang.String,java.lang.Object) cannot be
     referenced from a static context

0/0  1 error
0/0  ^
0/0  oracle.sql.ARRAY widgets =
     oracle.jdbc.OracleConnection.createARRAY("widgets_t", elements);

示例2

create or replace type widgets_t is table of varchar2(32767);
/

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

public class so20j2 {
    public void f1() {
        String[] elements = new String[]{"foo", "bar", "zoo"};
        oracle.jdbc.OracleDriver ora = new oracle.jdbc.OracleDriver();
        java.sql.Connection conn = ora.defaultConnection();
        oracle.sql.ARRAY widgets = conn.createARRAY("widgets_t", elements);
    }
};
/
show errors java source "so20j2"

失败:

Errors for JAVA SOURCE "so20j2":

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0  so20j2:6: cannot find symbol
0/0  symbol  : method createARRAY(java.lang.String,java.lang.String[])
0/0  1 error
0/0  oracle.sql.ARRAY widgets = conn.createARRAY("widgets_t",
     elements);

0/0  ^
0/0  location: interface java.sql.Connection

免责声明:我还不是 Java 程序员。

java oracle jdbc oracle11gr2
7个回答
9
投票

您的方法#2 是正确的,但是您无法从 java.sql.Connection 类型的连接创建 oracle 数组。 它必须是 OracleConnection 才能使用这些方法。

oracle.jdbc.OracleDriver ora = new oracle.jdbc.OracleDriver();
java.sql.Connection conn = ora.defaultConnection();
OracleConnection oraConn = conn.unwrap(OracleConnection.class);
oracle.sql.ARRAY widgets = oraConn.createARRAY("widgets_t", elements);

5
投票

这是一个使用 Oracle 19 测试的工作示例:

final BigDecimal[] plainJavaArray = new BigDecimal[]{BigDecimal.valueOf(1L), BigDecimal.valueOf(2L)};
final oracle.jdbc.OracleConnection oracleConnection = (oracle.jdbc.OracleConnection) jdbcConnection;
final java.sql.Array array = oracleConnection.createOracleArray("SYS.ODCINUMBERLIST", plainJavaArray);

记住一些非常重要的方面:

  • oracle.jdbc.OracleConnection.createOracleArray() 需要数组类型名称,而不是元素类型名称,这与 java.sql.Connection.createArrayOf().
  • java.sql.Connection.createArrayOf() 抛出 java.sql.SQLFeatureNotSupportedException。
  • 第一个参数区分大小写;如果您传递正确的数组类型名称但大小写错误,您将收到一个 SQLException 抱怨模型名称错误。
  • 您可以使用
    SYS.ODCIVARCHAR2LIST
    SYS.FI_CATEGORICALS
    代替
    VARCHAR2
    SYS.ODCIDATELIST
    代替
    DATE
    等。
    SYS.ODCIGRANULELIST
    SYS.ODCINUMBERLIST
    大两倍,如果还不够,请使用
    SYS.FI_NUMERICALS
    。您也可以使用用户定义的类型,
    CREATE TYPE ARRAY_OF_THING IS TABLE OF THING
    有效。
  • 不要使用已弃用的方法,它们迟早会停止工作或被删除。

3
投票

根据 Affe 和 Chris Mazzola 的回答,我成功构建了两个在 Oracle 11g R2 数据库中编译的示例。

基于Affe答案的示例

create or replace type widgets_t is table of varchar2(32767);
/

create or replace and compile java source named "so20ja1" as
public class so20ja1 {
    public void f1() throws java.sql.SQLException {
        String[] elements = new String[]{"foo", "bar", "zoo"};
        oracle.jdbc.OracleDriver ora = new oracle.jdbc.OracleDriver();
        java.sql.Connection conn = ora.defaultConnection();
        oracle.jdbc.OracleConnection oraConn = (oracle.jdbc.OracleConnection)conn;
        java.sql.Array widgets = oraConn.createARRAY("widgets_t", elements);
    }
};
/
show errors java source "so20ja1"

基于 Chris Mazzola 的回答的示例

create or replace type widgets_t is table of varchar2(32767);
/

create or replace and compile java source named "so20ja2" as
public class so20ja2 {
    public void f1() throws java.sql.SQLException {
        String[] elements = new String[]{"foo", "bar", "zoo"};
        oracle.jdbc.OracleDriver ora = new oracle.jdbc.OracleDriver();
        java.sql.Connection conn = ora.defaultConnection();
        oracle.sql.ArrayDescriptor desc = 
            oracle.sql.ArrayDescriptor.createDescriptor("widgets_t", conn);
        java.sql.Array widgets = new oracle.sql.ARRAY(desc, conn, elements);
    }
};
/
show errors java source "so20ja2"

1
投票
// array sample (using a stored procedure to sum two or more numbers)
Connection connection = dataSource.getConnection(username,password);
ArrayDescriptor desc = 
    ArrayDescriptor.createDescriptor(schemaName + "." + arrayType, connection);

// first ? is the array, second ? is the result via out parameter
String sql = "call sum_numbers(?,?)";
CallableStatement cs = connection.prepareCall(sql);

String[] args = {"5","15","25","35"}; // what to sum
Array array = new oracle.sql.ARRAY(desc, connection, args);

cs.setArray(1, array);
cs.registerOutParameter(2, Types.INTEGER);
cs.execute();
int result = cs.getInt(2);
cs.close();

0
投票

顺便提一下,在 Java 1.6 中,您有

connection.createArrayOf(..)
,这是标准的。


0
投票

Oracle 12.2版本:

oracle.jdbc.OracleArray  v_arr ;
String[] v_list ;


v_arr = ((oracle.jdbc.OracleConnection)DriverManager.getConnection("jdbc:default:connection:")).createARRAY ( "T_STRING_ARRAY" , v_list ) ;

0
投票
Map<String, Object> params = new HashMap<>();

        params.put("input_to_sp", new ExampleArrayMapper (new String[] { "ABC" }));

        Map<String, Object> results = spObject.execute(params);

        final List<Object> output = (List<Object>) results.get("po_out_cur");


    public class ExampleArrayMapper extends AbstractSqlTypeValue {
        private String[] customObject;

        public ExampleArrayMapper (String[] customObject) {
            this.customObject= customObject;
        }

        public String getSQlTypeName() throws SQLException {
            return "NAME_OF_TYPE_IN_SQL";
        }

        @Override
        protected Object createTypeValue(Connection con, int sqlType, String typeName) throws SQLException {
            try {
                con = dataSource.getConnection().unwrap(OracleConnection.class);
                Array reportsArray = ((OracleConnection) con).createOracleArray(SQL_TYPE_NAME, customObject);
                return reportsArray;
            } finally {
                con.close();
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.