Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
Oracle DB-对特定批处理的未初始化集合的Java引用_Java_Spring_Oracle_Plsql - Fatal编程技术网

Oracle DB-对特定批处理的未初始化集合的Java引用

Oracle DB-对特定批处理的未初始化集合的Java引用,java,spring,oracle,plsql,Java,Spring,Oracle,Plsql,我有一个java对象,看起来像这样 Class A { private String name; private List<B> bList; } 现在我已经制作了10个列表,其中每个列表包含20个元素,并尝试使用一个过程将它们插入数据库。基本上我有10个批次,总共200个元素 procedure add(a in T_A_LIST) begin for i in 1..a.last loop insert into sometable values

我有一个java对象,看起来像这样

Class A
{
  private String name;
  private List<B> bList;
}
现在我已经制作了10个列表,其中每个列表包含20个元素,并尝试使用一个过程将它们插入数据库。基本上我有10个批次,总共200个元素

 procedure add(a  in T_A_LIST)
 begin
   for i in 1..a.last loop
     insert into sometable values a(i).name ; 
   end loop;
 end
问题是一些批成功插入,但在某个地方 在第六批处理前后,pl/sql出现以下错误

ORA-06531: Reference to uninitialized collection
我使用Java/springsqldata类和Java.sql.Struct和Java.sql.Array对象来实现Java持久层

我尝试了不同的选项,比如在一个批次中插入整个元素200,但仍然失败,出现了相同的错误

public class A  implements SQLData{
    private  String name;

    private List<B> bList;
    private Array bArray;
    @Override
    public String getSQLTypeName() throws SQLException {

        return  "T_A";
    }
    @Override
    public void readSQL(SQLInput stream, String typeName) throws SQLException {
        // TODO Auto-generated method stub

    }
    @Override
    public void writeSQL(SQLOutput stream) throws SQLException {
        stream.writeString(name);
        stream.writeArray(bArray);
    }

    // setters and getters
}


public class B implements SQLData {

    private Long myNumber;
    private String message;

    @Override
    public String getSQLTypeName() throws SQLException {
        return "T_B";

    }

    @Override
    public void readSQL(SQLInput stream, String typeName) throws SQLException {
        // TODO Auto-generated method stub

    }

    @Override
    public void writeSQL(SQLOutput stream) throws SQLException {
        stream.writeLong(myNumber);
        stream.writeString(message);

    }

}

// And the DAO logic
class Test
{
    List<B> bList; // A List of B objects
    List<A> aList;  // A list of A objects

    Array array = dbUtil.getOracleArray("T_B_LIST",
            bList.toArray());
    A a = new A(); 
    a.setBArray(array);
    aList.add(a);

    Array aArray = dbUtil.getOracleArray("T_A_LIST",
            aList.toArray());

    // DeclareParameter
    // call plsql procedure using SimpleJdbcCall giving the aArray as argument.


} 

提前感谢

您没有发布任何Java/Spring代码,因此我仅从Oracle方面说明错误发生的原因

[TL;DR]传递空值或未初始化的集合时会发生错误。请确保始终传递非空的初始化集合或使用表表达式

Oracle安装程序:

查询1:传递初始化的集合:

BEGIN
  add_a_list(
    T_A_LIST(
      T_A( 'one',   NULL ),
      T_A( 'two',   T_B_LIST() ),
      T_A( 'three', T_B_LIST( T_B( 3.1, 'message 3.1' ) ) ),
      T_A( 'four',  T_B_LIST( T_B( 4.1, 'message 4.1' ), T_B( 4.2, 'message 4.2' ) ) )
    )
  );
END;
/
DECLARE
  value T_A_LIST;
BEGIN
  add_a_list( value );
END;
/
当集合已初始化时,这将按预期工作

SELECT * FROM sometable;
产出:

| NAME | | :---- | | one | | two | | three | | four |
ORA-06531: Reference to uninitialized collection
ORA-06512: at "FIDDLE_UMPWUWIBMKJJGKGIRJGH.ADD_A_LIST", line 4
ORA-06512: at line 4
引发异常:

ORA-06531: Reference to uninitialized collection
ORA-06512: at "FIDDLE_UMPWUWIBMKJJGKGIRJGH.ADD_A_LIST", line 4
ORA-06512: at line 2
当过程到达FOR循环并尝试查找a为NULL并引发异常的a.last值时

查询3:传递未初始化的集合:

BEGIN
  add_a_list(
    T_A_LIST(
      T_A( 'one',   NULL ),
      T_A( 'two',   T_B_LIST() ),
      T_A( 'three', T_B_LIST( T_B( 3.1, 'message 3.1' ) ) ),
      T_A( 'four',  T_B_LIST( T_B( 4.1, 'message 4.1' ), T_B( 4.2, 'message 4.2' ) ) )
    )
  );
END;
/
DECLARE
  value T_A_LIST;
BEGIN
  add_a_list( value );
END;
/
产出:

| NAME | | :---- | | one | | two | | three | | four |
ORA-06531: Reference to uninitialized collection
ORA-06512: at "FIDDLE_UMPWUWIBMKJJGKGIRJGH.ADD_A_LIST", line 4
ORA-06512: at line 4
当过程到达FOR循环并尝试查找a.last值时,其中a是未初始化的集合并引发异常

小提琴

Oracle安装程序-已修改:

使用表表达式:

CREATE PROCEDURE add_a_list( a  in T_A_LIST )
AS
BEGIN
  INSERT INTO sometable ( name )
  SELECT name
  FROM   TABLE( a );
END;
/

使用修改后的过程重新运行查询2和查询3时,将正常运行,不会插入任何行。

谢谢。我不确定这个问题是因为它是空的。当我试着一块一块地插入我的200个条目时,每个条目包含10个对象,它成功地完成了。但当我把它作为一个整体来做的时候,T_a_列表包含200个对象,它失败了,因为引用了未初始化的集合错误。我已经在问题中添加了java/spring部分,请看一看。