【问题标题】:Pass Array From Java to PLSQL Stored Procedure将数组从 Java 传递到 PLSQL 存储过程
【发布时间】:2013-11-22 10:44:05
【问题描述】:

我正在尝试将 Java 数组传递给 PLSQL 存储过程,但是当我尝试执行时,出现以下异常

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

我的DAO类代码sn-p

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

【问题讨论】:

  • 你在这里做了一些奇怪的事情,你在这个线程中没有明白我的意思:Pass Array from Java to Oracle。是否有任何特殊原因导致您尝试将一个数组从 Java 传递到 Oracle,其中只有一个元素?无论如何,请提供Project 类的代码以及MY_TYPEMY_ARRAY 类型的定义。
  • @PrzemyslawKruglej 如果我直接将值分配给 Object[],那么它会向表中插入值,但是如果我这样做 projectList.toArray(),我会收到错误消息。我已经用这个更新了我的问题。我是否需要手动将所有值分配给 Object[] 或者我可以遍历 projectList 并添加到 Object[]

标签: java oracle jdbc plsql oracle10g


【解决方案1】:

正如我在另一个线程中已经说过的,您必须将Project 对象的字段 分配给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);

【讨论】:

  • 是的,这确实有帮助。非常感谢。一个或错字Objects[] 应该是Object[]getSize() 应该是size()
  • 顺便说一下,如果你还没有看到这个stackoverflow.com/questions/19887193/declare-array-of-tabletype,我正在尝试使用关联数组,这样我就可以使用 TABLE 类型而不是手动键入数据库表中的所有列。我的问题是,如果我尝试将数组从 Java 传递到过程,这种方法是否可行?
  • @Polppan 感谢您的错别字,我将编辑我的答案 - 我是从头顶写的。关于您的第二条评论,我不明白您要达到的目标。最好是编辑您提供链接的问题,并逐点编写您真正想做的事情,您的目标是什么,您想要拥有什么功能,在哪一侧(Java/Oracle)等,那么也许我可以帮助你。
猜你喜欢
  • 2014-08-08
  • 2011-11-16
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
相关资源
最近更新 更多