当前位置: 首页 > 面试题库 >

将数组从Java传递到Oracle:java.sql.SQLException:无法转换为内部表示形式:错误

狄楷
2023-03-14
问题内容

我在DAO中有以下内容,当我执行时,我得到了

java.sql.SQLException:无法转换为内部表示形式:test.Project@843

DAO代码

List projectList = new LinkedList();

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);
    try{
        ArrayDescriptor desc = 
                ArrayDescriptor.createDescriptor("MY_ARRAY", dbConn);

        // execpetion in this line
        ARRAY arr = new ARRAY(desc, dbConn, (Object[])projectList.toArray());

我该如何解决这个问题?

编辑1

CREATE OR REPLACE TYPE project_type as object( 
proj_id varchar2 (10),
proj_title varchar2 (10));


create or replace  type my_array as Table of project_type;

问题答案:

不幸的是,这比人们预期的要复杂。您必须使用STRUCT对象,描述符,最后使用ARRAY。下面是一个工作示例。

-- Database code --

CREATE TABLE project_types (
  proj_id VARCHAR2(10),
  proj_title VARCHAR2(10)
);
/

CREATE OR REPLACE TYPE project_type AS OBJECT ( 
  proj_id VARCHAR2(10),
  proj_title VARCHAR2(10)
);
/

CREATE OR REPLACE TYPE my_array AS TABLE OF project_type;
/

CREATE OR REPLACE PROCEDURE add_projects(p_projects_array IN my_array)
AS
BEGIN
  IF p_projects_array IS NOT NULL THEN
    FOR v_i IN 1..p_projects_array.LAST
    LOOP
      INSERT INTO project_types
        VALUES (p_projects_array(v_i).proj_id,
                p_projects_array(v_i).proj_title);
    END LOOP;
  END IF;
END;
/



// Java code - main class

import java.sql.Connection;
import java.sql.DriverManager;

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleConnection;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;

public class ArrayExampleMain {

  public static void main(String[] args) throws Exception {
    OracleConnection conn = getOracleConnection().unwrap(OracleConnection.class);
    System.out.println("Got Connection.");

    OracleCallableStatement callStmt = null;

    try {
      callStmt = (OracleCallableStatement)conn.prepareCall("{call add_projects(?)}");

      // create array holding values for ProjectType object's properties
      Object[] project1 = new Object[] {"1", "Title 1"};
      Object[] project2 = new Object[] {"2", "Title 2"};

      // descriptor for OBJECT type defined in database
      StructDescriptor projectTypeDesc = StructDescriptor.createDescriptor("PROJECT_TYPE", conn);

      // each struct is one ProjectType object
      STRUCT structProject1 = new STRUCT(projectTypeDesc, conn, project1);
      STRUCT structProject2 = new STRUCT(projectTypeDesc, conn, project2);

      STRUCT[] structArrayOfProjects = {structProject1, structProject2};

      // descriptor of TABLE type defined in database
      ArrayDescriptor projectTypeArrayDesc = ArrayDescriptor.createDescriptor("MY_ARRAY", conn);

      // array holding two ProjectType objects
      ARRAY arrayOfProjects = new ARRAY(projectTypeArrayDesc, conn, structArrayOfProjects);

      callStmt.setARRAY(1, arrayOfProjects); 
      callStmt.execute();
      conn.commit();

      System.out.println("Committed.");
    } catch (Exception e) {
      if (conn != null) try { conn.rollback(); } catch (Exception ex) { System.out.println("Rollback failed."); }
      throw e;
    } finally {
      callStmt.close();
      conn.close();
     }
  }

  public static Connection getOracleConnection() throws Exception {
    String driver = "oracle.jdbc.driver.OracleDriver";
    String url = "jdbc:oracle:thin:@YOUR_HOST:orcl";
    String username = "hr";
    String password = "password";

    Class.forName(driver); // load Oracle driver

    Connection conn = DriverManager.getConnection(url, username, password);

    return conn;
  }
}

project_types执行主类后检查表的内容:

SELECT * FROM project_types;

输出:

PROJ_ID PROJ_TITLE
---------- ----------
1标题1    
2标题2


 类似资料:
  • 问题内容: 从Sun的Java教程中,我本以为这段代码会将一个集合转换成一个数组。 但是,这给 我误会了什么? 问题答案: 该代码工作正常。 更换: 带有: 输出: 数组的表示形式显示该数组的“文本表示形式”,它是通过- 表示的,即类的名称和作为十六进制字符串的数组的哈希码。

  • 问题内容: 我的代码在以下行(此行的第2行)上引发了上述异常: 它给了我以下例外: 的是以下POJO的ArrayList: 该数据库上看起来如下: 经过一些研究,我认为我的POJO和数据库类型之间的数据类型映射不正确匹配。我有理由相信,字符串匹配是在VARCHAR2确定,但我认为这是一个问题转换为。 我尝试使用BigDecimal,但这并不能改善情况。 有什么建议? 编辑:根据Oracle文档:

  • 尝试将实体转换为dto时,使用modelmapper时出错。 我的java类是: 用户类: Rol等级: 用户到类: 当我尝试映射用户时。类到UserDTO。当modelmapper出现下一个错误时初始化: 此外,我尝试使用此modelmapper配置: 错误: 如果RolDTO类是外部化的,模型映射器工作正常。我希望你能帮助我解决这个问题。 谢谢。

  • 问题内容: 在Java中,我试图找到一种将浮点数转换为分数字符串的方法。例如: 任何想法如何用Java做到这一点? 问题答案: 最简单的方法可能是使用反复试验。 版画

  • 问题内容: 我有一个这样的清单: 并在这样的对象上: 如何将“列表”分配给“ myMatrix”? 我不想遍历列表并将元素逐个分配给MyMatrix,但我想尽可能地直接分配它(使用oppurtune修改)。谢谢 问题答案: 您可以使用。 Java文档