次の TYPE、PROCEDURE、および Java コードのセットがあります。ストアド プロシージャを正常に呼び出すことはできますが、オブジェクトを次々に追加する必要があります。50,000 件以上のレコードを扱っているため、プロセスを一度に実行したいと考えています。リスト全体を一度に送信できるように、どのような変更を行う必要があるか教えてください。コードは以下にあります。
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<SampleListenerBean> sampleLst = new ArrayList<SampleListenerBean>();
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);
各オブジェクトを個別に設定する代わりに、オブジェクト配列「employees」の代わりに sampleLst を直接使用したいと考えています。50,000 個以上のオブジェクトを扱うとき、それらをオブジェクト [] に追加し続けることができません。私もヒープの問題に遭遇します。誰でもここで私を助けてもらえますか?