/*
   NAME
     batchInsert.java
   DESCRIPTION
     this program takes two command line parameters: 1)jdbc batch size 2)number of times (must be <=10000)
   NOTES
     <other useful comments, qualifications, etc.>
   MODIFIED   (MM/DD/YYYY)
     grahn     04/28/2007 -  Creation
     http://structureddata.org
*/

import java.sql.*;
import java.util.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;


public class batchInsert {

    public static void main(String[] args) {
        try {
            Integer batchSize = new Integer(args[0]);
            Integer iters = new Integer(args[1]);
            int rc = 0;

            OracleDataSource ods = new OracleDataSource();

            ods.setURL("jdbc:oracle:oci8:@orcl");
            ods.setUser("scott");
            ods.setPassword("tiger");

            OracleConnection conn = (OracleConnection) ods.getConnection();

            conn.setAutoCommit(false);

            short seqnum = 0;
            String[] metric = new
                    String[OracleConnection.END_TO_END_STATE_INDEX_MAX];

            metric[OracleConnection.END_TO_END_ACTION_INDEX] = "insertEmp";
            metric[OracleConnection.END_TO_END_MODULE_INDEX] = "batchInsert";
            metric[OracleConnection.END_TO_END_CLIENTID_INDEX] = "myClientId";
            conn.setEndToEndMetrics(metric, seqnum);

            DatabaseMetaData meta = conn.getMetaData();

            System.out.println(
                    "JDBC driver version is " + meta.getDriverVersion());

            Statement stmt = conn.createStatement();

            stmt.execute("alter session set sql_trace=true");
            stmt.execute("truncate table emp");

            PreparedStatement psEmp = conn.prepareStatement(
                    "insert /* insEmpBatch */ into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (?, ?, ?, ?, sysdate, ?, ?, ?)");

            // Set the batch size for each statment
            ((OraclePreparedStatement) psEmp).setExecuteBatch(batchSize);

            long start1 = System.currentTimeMillis();

            for (int i = 0; i < iters.intValue(); i++) {

                psEmp.setInt(1, i); // EMPNO
                psEmp.setString(2, "Name" + i); // ENAME
                // set to null if mod 2=0
                if (i % 2 == 0) {
                    psEmp.setString(3, "Job"); // JOB
                } else {
                    psEmp.setNull(3, Types.VARCHAR);
                }

                psEmp.setInt(4, i); // MGR
                psEmp.setInt(5, 10000 + i); // SAL
                psEmp.setInt(6, 100 + i); // COMM

                if (i <= 11) {
                    psEmp.setInt(7, 10); // DEPTNO
                } else {
                    psEmp.setNull(7, Types.INTEGER);
                }
                rc = psEmp.executeUpdate();
                if (rc > 0) {
                    System.out.println("batching " + rc + " emp rows");
                }
            }
            // explicitly send a batch
            ((OraclePreparedStatement) psEmp).sendBatch();
            conn.commit();
            psEmp.close();

            long elapsedTimeMillis1 = System.currentTimeMillis() - start1;
            // Get elapsed time in seconds
            float elapsedTimeSec1 = elapsedTimeMillis1 / 1000F;

            System.out.println("elapsed seconds: " + elapsedTimeSec1);

            conn.close();

        } catch (Exception e) {
            System.err.println("Got an exception! ");
            System.err.println(e.getMessage());
        }
    }
}
