将List of Bean传递给oracle存储过程的Java程序 – 一次传递整个列表而不是一个接一个地追加对象

我有以下TYPE,PROCEDURE和Java代码集。 我能够成功调用存储过程,但我必须一个接一个地追加对象。 我希望这个过程一次性发生,因为我正在处理超过50K +的记录。 任何人都可以让我知道需要做哪些更改,以便我可以将整个列表发送到一个。 代码可以在下面找到。

TYPES: CREATE OR REPLACE TYPE CER_GL_ENTRY_TYPE AS OBJECT (idKey NUMBER(10) ); CREATE or REPLACE TYPE CER_GL_ENTRY_TYPE_LIST AS TABLE OF CER_GL_ENTRY_TYPE; PROCEDURE: CREATE OR REPLACE PROCEDURE GL_PROCESS_BULK_ENTRIES ( p_array IN CER_GL_ENTRY_TYPE_LIST ,p_status OUT VARCHAR2) AS v_count NUMBER(5); row_detail CER_GL_ENTRY_TYPE; BEGIN --p_arr_int := NEW array_int (); --p_arr_int.EXTEND (10); --len := p_array.COUNT; v_count := 0; FOR i IN 1 .. p_array.COUNT LOOP row_detail := p_array (i); DBMS_OUTPUT.put_line('hello'); DBMS_OUTPUT.put_line (row_detail.idKey); --p_arr_int (i) := v_count; v_count := v_count + 1; p_status := 'true'; END LOOP; DBMS_OUTPUT.put_line (v_count); DBMS_OUTPUT.put_line (p_status); EXCEPTION WHEN OTHERS THEN -- handle errors here... DBMS_OUTPUT.put_line ('Error: ' || SUBSTR (1, 255, SQLERRM)); END; / Java Bean: import java.sql.SQLData; import java.sql.SQLException; import java.sql.SQLInput; import java.sql.SQLOutput; public class SampleListenerBean implements SQLData { private String sql_type="CER_GL_ENTRY_TYPE"; private int id; public SampleListenerBean() { } public SampleListenerBean(String sqlType, int id) { this.sql_type = sqlType; this.id = id; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getSQLTypeName() throws SQLException { return sql_type; } public void readSQL(SQLInput stream, String typeName) throws SQLException { sql_type = typeName; id = stream.readInt(); } public void writeSQL(SQLOutput stream) throws SQLException { stream.writeInt(id); } } Main class: import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; import java.util.ArrayList; import java.util.List; import oracle.sql.ARRAY; import oracle.sql.ArrayDescriptor; public class StProcExample { public static void main(String args[]){ Connection con=null; try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver ()); con = DriverManager.getConnection("jdbc:oracle:thin:@******:1521: TUW1", "*******", "*********"); String query = "{call GL_PROCESS_BULK_ENTRIES(?,?)}"; CallableStatement cs = con.prepareCall(query); ArrayDescriptor des = ArrayDescriptor.createDescriptor("CER_GL_ENTRY_TYPE_LIST", con); List sampleLst = new ArrayList(); SampleListenerBean bean = null; for (int i = 0; i < 20; i++) { bean = new SampleListenerBean("CER_GL_ENTRY_TYPE",i); sampleLst.add(bean); } SampleListenerBean emp=new SampleListenerBean("TS.TEST_EMP_OBJ",234); SampleListenerBean emp1=new SampleListenerBean("TS.TEST_EMP_OBJ",235); Object[] employees= new Object[]{emp,emp1}; Object[] employees= new Object[]{sampleLst}; ARRAY a = new ARRAY(des, con, employees); cs.setObject(1, (Object)a); cs.registerOutParameter(2, Types.VARCHAR); cs.execute(); String status = cs.getString(2); System.out.print("The status is " + status); if (cs != null) { cs.close(); } } catch(SQLException e){ e.printStackTrace(); } } } 

我想要的是替换下面的代码

  SampleListenerBean emp=new SampleListenerBean("TS.TEST_EMP_OBJ",234); SampleListenerBean emp1=new SampleListenerBean("TS.TEST_EMP_OBJ",235); Object[] employees= new Object[]{emp,emp1}; ARRAY a = new ARRAY(des, con, employees); cs.setObject(1, (Object)a); 

我不想单独设置每个对象,而是直接使用sampleLst而不是Object数组“employees”。 当我处理50K +对象时,我无法将它们添加到对象[]中。 我也会遇到堆问题。 有人可以帮帮我吗?

我会使用更简单的表类型:

 CREATE OR REPLACE TYPE NUM_ARRAY AS TABLE OF NUMBER; 

然后稍微简化了存储过程:

 CREATE OR REPLACE PROCEDURE GL_PROCESS_BULK_ENTRIES ( p_array IN NUM_ARRAY, p_status OUT VARCHAR2) IS ... 

然后创建一个可以轻松适应内存的Integer数组:

 Integer[] idArray = new Integer[50000]; // fill the array of integers here for (int i = 0; i < idArray.length; i++) idArray[i] = ....; ARRAY a = new ARRAY(des, con, idArray); cs.setObject(1, (Object)a); 

没有必要创建任何重量级的bean只是为了传递ID列表。