sql >> データベース >  >> RDS >> Oracle

JavaからOracleに配列を渡します:java.sql.SQLException:内部表現への変換に失敗しました:エラー

    残念ながら、これは予想以上に複雑です。 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          Title 1    
    2          Title 2


    1. sql:各ユーザーから最も投票されたアイテムを選択します

    2. OracleのUPPER()関数

    3. SQLクエリで正しく表示されないUnicode文字の処理

    4. 必要な属性を持つ製品を入手する