JDBC 調用 Oracle Collections

使用 Java 通過數據庫連接(JDBC)訪問和操作 Oracle 自定義類型.
大致就是這個網頁中說的. https://docs.oracle.com/cd/E1...

Oracle中支持在數據庫中定義數據格式.(嵌套數據格式)
在JAVA中調用時,傳入相應格式的數據即可.
找了下沒找到對應資料,記錄下.
只是找到了一種簡單的可行方案,因爲有人專門寫PLSQL來處理邏輯,所以將邏輯全部放在數據庫中處理,JAVA這邊弄點簡單代碼傳數據就行.

CREATE TYPE TDC_SUPPLIER_ADDR AS OBJECT
            (ADDRESS VARCHAR2(240),ADDRESS_ID NUMBER);
            
CREATE TYPE TDC_SUPPLIER_ADDR_L AS TABLE OF TDC_SUPPLIER_ADDR;
 
CREATE TYPE TDC_SUPPLIER AS OBJECT
            (NAME VARCHAR2(50),SUPPLIER_ID NUMBER, ADDR TDC_SUPPLIER_ADDR_L);
            
CREATE TABLE TDC_TEST (
TEXT VARCHAR2(2000));
 
CREATE OR REPLACE PACKAGE TDC_TEST_PKG IS
 
  PROCEDURE CREATE_SUPPLIER (
    SUP_OBJ IN TDC_SUPPLIER);
END TDC_TEST_PKG;
 
CREATE OR REPLACE PACKAGE BODY TDC_TEST_PKG IS
 
  PROCEDURE CREATE_SUPPLIER (
    SUP_OBJ IN TDC_SUPPLIER) IS 
    
    
  BEGIN
    INSERT INTO TDC_TEST VALUES (SUP_OBJ.NAME);
    
    COMMIT;
  END CREATE_SUPPLIER;
END TDC_TEST_PKG;

上面的SQL是個簡單的例子.
聲明瞭一個數據類型TDC_SUPPLIER, 在 call CREATE_SUPPLIER 時需要傳入TDC_SUPPLIER類型數據作爲參數.
其中將TDC_SUPPLIER轉換爲json,大致是下面的格式

{
"NAME":"",
"SUPPLIER_ID":0,
"ADDR": [
  {
    "ADDRESS": "",
    "ADDRESS_ID": 0
  },
  {
    "ADDRESS": "",
    "ADDRESS_ID": 0
  }
]
}

其中定義了一個TDC_SUPPLIER_ADDR數據類型.裏面有ADDRESS和ADDRESS_ID屬性.
定義了一個TDC_SUPPLIER_ADDR_L數組,裏面包含多項TDC_SUPPLIER_ADDR
在將TDC_SUPPLIER_ADDR_L作爲TDC_SUPPLIER的一個屬性.

參考該鏈接實現代碼

package com.hktdc.po.api.approval.test;

import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Test2 {

    private final Logger logger = LoggerFactory.getLogger(Test1.class);

    public static void main(String[] args)
            throws ClassNotFoundException, SQLException {
        DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
        // 打開數據庫連接
        String url = "jdbc:oracle:thin:@//127.0.0.1:1521/DB";
        Connection conn = DriverManager.getConnection(url, "apps", "apps");
        conn.setAutoCommit(false);

        // StructDescriptor.createDescriptor 表示要在JAVA中創建與數據庫對應的對象.第一個參數是數據庫中的類型名稱
        StructDescriptor addDesc = StructDescriptor.createDescriptor("TDC_SUPPLIER_ADDR", conn);
        /*
        通過 new STRUCT 方法,將JAVA 中的參數轉換爲數據庫中的對象.
        第一個參數爲數據庫類型名稱對象
        第二個參數爲數據庫連接
        第三個參數爲object數組,表示對象中的值.注意:對象中值的類型,應該與數據庫中對應參數類型一致.
         */
        Object[] addArr = {"南山區", 10001};
        STRUCT addRecord = new STRUCT(addDesc, conn, addArr);
        Object[] addArr2 = {"龍崗區", 10001};
        STRUCT addRecord2 = new STRUCT(addDesc, conn, addArr2);

        /*
        構建嵌套對象.
        StructDescriptor 只需要定義數據庫中 CREATE TYPE ** AS OBJECT 的類型即可.
        TDC_SUPPLIER_ADDR_L 在數據庫中代表多個 TDC_SUPPLIER_ADDR,不需要在JAVA中定義,只需要將多個 TDC_SUPPLIER_ADDR 轉換成 Object 數組即可
         */
        StructDescriptor supDesc = StructDescriptor.createDescriptor("TDC_SUPPLIER", conn);
        Object[] addLData = {addRecord, addRecord2};
        Object[] data = {"張三", 302, addLData};
        STRUCT supplier = new STRUCT(supDesc, conn, data);

        // 創建一個調用語句
        CallableStatement stmt = conn.prepareCall("{ call TDC_TEST_PKG.CREATE_SUPPLIER(?) }");

        // 綁定輸入記錄,設置第一個 ? 代表的參數
        stmt.setObject(1, supplier);
        // 執行SQL
        stmt.execute();

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章