使用 Java 經過數據庫鏈接(JDBC)訪問和操做 Oracle 自定義類型.
大體就是這個網頁中說的. https://docs.oracle.com/cd/E1...java
Oracle中支持在數據庫中定義數據格式.(嵌套數據格式)
在JAVA中調用時,傳入相應格式的數據便可.
找了下沒找到對應資料,記錄下.
只是找到了一種簡單的可行方案,由於有人專門寫PLSQL來處理邏輯,因此將邏輯所有放在數據庫中處理,JAVA這邊弄點簡單代碼傳數據就行.sql
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的一個屬性.json
參考該連接實現代碼api
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(); } }