Oracle DB-对特定批处理的未初始化集合的Java引用
我有一个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
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部分,请看一看。