首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 調用存儲過程實現批量插入:JDBC Batch 與 Oracle 集合類型實戰方案

     編輯:Java 相關知識

核心觀點

**首選 JDBC 原生 Batch 機制**,無需撰寫存儲過程即可高效批量更新。若業務極其複雜必須用存儲過程,參考下方方案。

Oracle 集合類型 + 存儲過程方案

資料庫端:定義物件類型與集合


CREATE TYPE t_parent AS OBJECT (name VARCHAR2(100), title VARCHAR2(10));
CREATE TYPE t_child  AS OBJECT (child_name VARCHAR2(100), child_title VARCHAR2(10), child_content VARCHAR2(200));
CREATE TYPE t_parent_lst      AS TABLE OF t_parent;
CREATE TYPE t_child_lst       AS TABLE OF t_child;
CREATE TYPE t_child_lst_map   AS TABLE OF t_child_lst; -- 二維集合:每個 parent 對應一個 child list

存儲過程:批量插入父子表


CREATE OR REPLACE PROCEDURE proc_ins_parent_child(
    i_parent_lst    IN t_parent_lst,      -- 父列表
    i_child_map_lst IN t_child_lst_map,   -- 子列表集合,下標與父列表對應
    o_ret           OUT NUMBER
) AS
    v_parent      t_parent;
    v_child_lst   t_child_lst;
    v_child       t_child;
    v_parent_id   NUMBER;
    v_child_id    NUMBER;
BEGIN
    FOR i IN 1..i_parent_lst.COUNT LOOP
        v_parent := i_parent_lst(i);
        SELECT seq_p_c_id.NEXTVAL INTO v_parent_id FROM dual;
        INSERT INTO parent(id, name, title) VALUES (v_parent_id, v_parent.name, v_parent.title);
        v_child_lst := i_child_map_lst(i);
        FOR j IN 1..v_child_lst.COUNT LOOP
            v_child := v_child_lst(j);
            SELECT seq_p_c_id.NEXTVAL INTO v_child_id FROM dual;
            INSERT INTO child(id, parent_id, child_name, child_title, child_content, child_time)
            VALUES (v_child_id, v_parent_id, v_child.child_name, v_child.child_title, v_child.child_content, SYSTIMESTAMP);
        END LOOP;
    END LOOP;
    o_ret := 0;
EXCEPTION WHEN OTHERS THEN
    o_ret := -1; RAISE;
END;

Java 端調用要點

  • 使用 oracle.sql.ARRAY / STRUCT 構建集合參數。
  • 傳入參數型別與非批量調用一致,僅調用方式為 CallableStatement 批量綁定。
  • 異常處理:捕獲 SQLException 解析 Oracle 錯誤碼。

效能建議

  1. **優先用 JDBC Batch**(PreparedStatement.addBatch() + executeBatch()),簡單、標準、跨資料庫。
  2. 極大批次(萬級以上)考慮分批提交,避免 Undo 表空間暴漲。
  3. 存儲過程方案適用於:跨表關聯複雜、需原子性保證、邏輯下沉資料庫層的場景。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved