[英]Pass Array From Java to PLSQL Stored Procedure
我试图将Java数组传递给PLSQL存储过程,但是当我尝试执行时,我得到以下异常
java.sql.SQLException: Inconsistent java and sql object types
我的DAO类代码片段
List projectList = new ArrayList();
public void saveRecord(List<Project> project)
throws DatabaseException,SQLException {
for (Project items: project) {
insertRecord(items);
}
}
private void insertRecord(Project project) throws SQLException {
projectList.add(project);
callablestatement =
(OracleCallableStatement)connection.prepareCall("{call my_proc(?)}");
Object[] project1 = projectList.toArray();
StructDescriptor projectTypeDesc = StructDescriptor.createDescriptor("MY_TYPE",
conn);
STRUCT structProject1 = new STRUCT(projectTypeDesc,
connection, project);
STRUCT[] structArrayOfProjects = {structProject1};
ArrayDescriptor projectTypeArrayDesc = ArrayDescriptor.createDescriptor
("MY_ARRAY", connection);
ARRAY arrayOfProjects = new ARRAY(projectTypeArrayDesc, connection,
structArrayOfProjects);// error in this line
callablestatement.setArray(1, arrayOfProjects);
我该如何解决这个问题?
编辑1
如果我这样做
Object[] project1 = new Object[]{project.getProjectId(), project.getProjectTitle()};
然后没有错误和记录插入表中。
但是如果我愿意的话
Object[] project1 = projectList.toArray();
然后异常抛出Inconsistent java and sql object types
正如我在其他线程中已经说过的那样,在分配整个Project
对象数组时,必须将Project
对象的字段分配给Object
数组。 你可以做你想要的,但是,正如我在另一个线程中已经说过的那样,你必须循环遍历项目列表并为列表中的每个元素创建一个STRUCT
对象,保存每个项目的字段:
StructDescriptor projectTypeDesc = StructDescriptor.createDescriptor("MY_TYPE",
connection);
// array holding structs, where each struct is based on an array
// with fields of Project object
STRUCT[] projectsAsStructs = new STRUCT[projectList.size()];
// for each Project object, create a STRUCT object containing its fields
for (int i = 0; i < projectList.size(); ++i) {
Project project = projectList.get(i);
Object[] projectFields = new Object[] {project.getProjectId(),
project.getProjectTitle()};
STRUCT projectStruct = new STRUCT(projectTypeDesc,
connection, projectFields);
projectsAsStructs[i] = projectStruct;
}
// now you have all your Project objects ready to be saved in one go:
ArrayDescriptor projectTypeArrayDesc = ArrayDescriptor.createDescriptor
("MY_ARRAY", connection);
ARRAY arrayOfProjects = new ARRAY(projectTypeArrayDesc, connection,
projectsAsStructs);
callablestatement.setArray(1, arrayOfProjects);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.