**首選 JDBC 原生 Batch 機制**,無需撰寫存儲過程即可高效批量更新。若業務極其複雜必須用存儲過程,參考下方方案。
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;
oracle.sql.ARRAY / STRUCT 構建集合參數。CallableStatement 批量綁定。SQLException 解析 Oracle 錯誤碼。PreparedStatement.addBatch() + executeBatch()),簡單、標準、跨資料庫。