sql >> Database teknologi >  >> RDS >> Oracle

Send array fra Java til Oracle:java.sql.SQLEundtagelse:Kunne ikke konvertere til intern repræsentation:fejl

Desværre er dette mere kompliceret, end man kunne forvente. Du skal bruge STRUCT objekter, deskriptorer og endelig ARRAY . Nedenfor er et fungerende eksempel.

-- 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;
  }
}
 

Kontrol af indholdet af project_types tabel efter udførelse af hovedklasse:

SELECT * FROM project_types;
 

Output:

PROJ_ID PROJ_TITLE----------- ----------1 Titel 1 2 Titel 2


  1. Kører Vitess og MySQL med ClusterControl

  2. Indsættelse af filbilleder i en database

  3. MAMP MySQL genkender ikke my.cnf-værdier i OSX

  4. Sådan indsætter du DateTime i MySql-databasen ved hjælp af C#-kode