简体   繁体   English

将数组从Java传递到PLSQL存储过程

[英]Pass Array From Java to PLSQL Stored Procedure

I am trying to pass Java array to PLSQL stored procedure, however when I am trying to execute, I am getting the following exception 我试图将Java数组传递给PLSQL存储过程,但是当我尝试执行时,我得到以下异常

java.sql.SQLException: Inconsistent java and sql object types

My DAO class code snippet 我的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);  

How can I resolve this issue? 我该如何解决这个问题?

Edit 1 编辑1

If I do as 如果我这样做

Object[] project1 = new Object[]{project.getProjectId(), project.getProjectTitle()};

then no errors and records are inserted into table. 然后没有错误和记录插入表中。

However if I would do as 但是如果我愿意的话

Object[] project1 = projectList.toArray();

then exception is thrown Inconsistent java and sql object types 然后异常抛出Inconsistent java and sql object types

As I have already said in the other thread, you have to assign fields of Project object to an array of Object , while you are assigning the whole array of Project objects. 正如我在其他线程中已经说过的那样,在分配整个Project对象数组时,必须将Project对象的字段分配给Object数组。 You can do what you want, but, as I have already said in the other thread, you have to loop through the list of projects and create a STRUCT object for each element in the list, holding each project's fields: 你可以做你想要的,但是,正如我在另一个线程中已经说过的那样,你必须循环遍历项目列表并为列表中的每个元素创建一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM