久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

在 Java 中插入 Oracle 嵌套表

Inserting to Oracle Nested Table in Java(在 Java 中插入 Oracle 嵌套表)
本文介紹了在 Java 中插入 Oracle 嵌套表的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我想編寫一個 Java 程序,它將一行插入到具有多個嵌套表的表中.之后,我想向這些嵌套表中的每一個插入不可預知的行數.

I want to write a Java program that will insert a row to a table that has a number of nested tables. Following that, I want to insert an unpredictable number of rows to each of these nested tables.

有很多這樣的 PreparedStatement 示例:

There are lots of examples a PreparedStatement of this sort:

    new PreparedStatement("INSERT INTO CONTAINER_TBL (A, B, NESTED_TBL)
        VALUES ('X', 'Y', 
            NESTED_TBL_TYPE(NESTED_ROW_TYPE('Q', 99),
                            NESTED_ROW_TYPE('R', 999))
         )");

如果我提前知道我需要插入多少嵌套行,這很好.但如果我不這樣做呢?

This is fine if I know ahead of time how many nested rows I'll need to insert. But what if I don't?

推薦答案

將 Java 數組作為集合傳遞:

Pass a Java array as a collection:

Oracle 12c 設置:

CREATE USER test_user IDENTIFIED BY password;
GRANT CREATE SESSION TO test_user;
ALTER USER test_user QUOTA UNLIMITED ON users;

CREATE TYPE test_user.nested_row_type AS OBJECT( a CHAR(1), b INTEGER );
/

CREATE TYPE test_user.nested_tbl_type AS TABLE OF test_user.nested_row_type;
/

CREATE TABLE test_user.container_tbl(
  a CHAR(1),
  b CHAR(1),
  nested_tbl test_user.nested_tbl_type
) NESTED TABLE nested_tbl STORE AS nested_tbl_tbl;

Java:(使用ojdbc7.jar)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OraclePreparedStatement;
import oracle.sql.ARRAY;

public class LoadOracleObjectCollection {
  public static void main(String[] args) {
    try{
      Class.forName("oracle.jdbc.OracleDriver");

      Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","test_user","password");

      Object[] objs = new Object[]{
        con.createStruct( "NESTED_ROW_TYPE", new Object[]{ "Q", 99 } ),
        con.createStruct( "NESTED_ROW_TYPE", new Object[]{ "R", 999 } )
      };

      ARRAY a = ((OracleConnection) con).createARRAY("NESTED_TBL_TYPE", objs);

      PreparedStatement st = con.prepareCall( "INSERT INTO container_tbl ( a, b, nested_tbl ) VALUES ( ?, ?, ? )" );

      st.setString( 1, "x" );
      st.setString( 2, "y" );
      ((OraclePreparedStatement) st).setARRAY( 3 , a );
      st.execute();
      st.close();
      con.close();
    } catch(ClassNotFoundException | SQLException e) {
      System.out.println(e);
    }
  }
}

Oracle 查詢

SELECT c.a, c.b, n.a, n.b
FROM   test_user.container_tbl c
       CROSS JOIN TABLE( c.nested_tbl ) n;

結果:

A B A          B
- - - ----------
x y Q         99
x y R        999

<小時>

舊語法版本:

只需傳入和傳出一個虛擬查詢(而不是插入到數據庫中),還可以展示如何檢索對象數組:

Just passing to and from a dummy query (rather than inserting into the database) to also show how to retrieve an array of objects:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OraclePreparedStatement;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.Datum;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;

public class ArrayOfObjectsTest
{
  public static void main( final String[] args ){
    try{
      Class.forName( "oracle.jdbc.OracleDriver" );

      Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","test_user","password");

      OracleConnection oc = (OracleConnection) con;
      StructDescriptor sd = new StructDescriptor( "NESTED_ROW_TYPE", oc );
      ArrayDescriptor  ad = new ArrayDescriptor( "NESTED_TBL_TYPE", oc );

      ARRAY array = new ARRAY( ad,oc,new STRUCT[]{
        new STRUCT(sd,oc,new Object[]{ 'P',99 } ),
        new STRUCT(sd,oc,new Object[]{ 'Q',999 } )
      } );

      OraclePreparedStatement st = (OraclePreparedStatement) con.prepareStatement( "SELECT ? FROM DUAL" );
      st.setARRAY( 1, array);
      ResultSet rs = st.executeQuery();

      while( rs.next() )
      {
        Object[] structs = (Object[]) rs.getArray( 1 ).getArray();
        for ( Object struct : structs )
        {
          Datum[] datums = ((STRUCT) struct).getOracleAttributes();
          System.out.println( datums[0].stringValue() + ", " + datums[1].intValue() ) );
        }
      }
      st.close();
      con.close();
    } catch (ClassNotFoundException | SQLException ex) {
      System.out.println( ex.getMessage() );
      ex.printStackTrace();
    }
  }  
}

輸出:

P, 99
Q, 999

這是使用 ojdbc6.jar 為我編譯的,并與 Oracle 11gR2 一起使用.您應該為您的數據庫找到正確的 ojdbc 版本并使用它.

This compiled for me with ojdbc6.jar and worked with Oracle 11gR2. You should find the correct ojdbc version for your database and use that.

這篇關于在 Java 中插入 Oracle 嵌套表的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

How to wrap text around components in a JTextPane?(如何在 JTextPane 中的組件周圍環繞文本?)
MyBatis, how to get the auto generated key of an insert? [MySql](MyBatis,如何獲取插入的自動生成密鑰?[MySql])
Java: How to insert CLOB into oracle database(Java:如何將 CLOB 插入 oracle 數據庫)
Why does Spring-data-jdbc not save my Car object?(為什么 Spring-data-jdbc 不保存我的 Car 對象?)
Use threading to process file chunk by chunk(使用線程逐塊處理文件)
URL Connection (FTP) in Java - Simple Question(Java 中的 URL 連接 (FTP) - 簡單問題)
主站蜘蛛池模板: 亚洲高清三级 | 国产农村一级国产农村 | 精品亚洲一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 国内精品伊人久久久久网站 | 97精品一区二区 | 日韩精品在线播放 | 欧美日韩一区二区在线播放 | 91视频亚洲 | 韩日一区二区三区 | 亚洲精品国产第一综合99久久 | 日本公妇乱淫xxxⅹ 国产在线不卡 | 精品成人在线 | 不卡一区二区在线观看 | 亚洲高清在线视频 | 免费精品视频在线观看 | 日韩欧美网 | 成人免费一级视频 | 国产精品久久性 | 台湾a级理论片在线观看 | 欧美一级高潮片免费的 | 亚洲免费精品 | 日本色综合 | 国产第一页在线观看 | 午夜精品一区二区三区在线视 | 亚洲欧洲精品在线 | 亚州av | 91精品国产一区二区在线观看 | 九九免费观看视频 | 一级高清免费毛片 | 黄色免费网 | 日韩欧美成人精品 | 成人一级毛片 | 国产97在线 | 日韩 | 精品日本久久久久久久久久 | 国产日产精品一区二区三区四区 | 国产精品久久久久久 | 四虎影院美女 | 久久久91精品国产一区二区三区 | 麻豆精品国产91久久久久久 | 国产欧美一区二区精品久导航 |