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

标签 java oracle jdbc plsql oracle10g

我正在尝试将 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();

然后抛出异常不一致的java和sql对象类型

最佳答案

正如我在另一个线程中所说的那样,您必须将 Project 对象的 fields 分配给 Object 数组,而您正在分配整个 Project 对象数组。你可以做你想做的,但是,正如我在另一个线程中所说的那样,你必须遍历项目列表并为列表中的每个元素创建一个 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);

关于java - 将数组从 Java 传递到 PLSQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19892674/

相关文章:

java - 序列化方法

java - 回收器 View 仅显示第一个项目,即使 onBindViewHolder 和 onCreateViewHolder 为所有项目运行

SQL在单个命令中在表中添加列和注释

java - 如何在 hibernate 中使用数据库系统日期

java - RETURN_GENERATED_KEYS 和指定生成的列名的区别

java - ORA-27101 使用通用连接池

java - 跟踪 undefined variable

java - JBoss EAP6 - 无法创建 JDBC 数据源 (Microsoft SQL Server)

c# - Oracle 根据浏览器文化返回日期时间格式

java - 在 Java 中将 sqlite 从磁盘备份和恢复到内存