package org.oklab;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.*;

/**
 * This class check Oracle's SQL length.
 * @author satoshiokita
 * @version 1.0
public class TestPrepareStatement {

    private static final int PARAM_SIZE = 70;


    public static void main(String [] args) {
        TestPrepareStatement test = new TestPrepareStatement();
        test.run();
    }

    private void run() {
        Connection conn = null;
        try {
            // initialize
        Class.forName("oracle.jdbc.OracleDriver");
            conn = DriverManager.getConnection(
                    "jdbc:oracle:thin:@localhost:1521:sid",
                    "user","password");

            printMetaData(conn);

            // create query
            StringBuffer sb = new StringBuffer();
            sb.append("select ");
            sb.append("?,?,?,?,?,?,?,?,?,?,"); // 10
            sb.append("?,?,?,?,?,?,?,?,?,?,");
            sb.append("?,?,?,?,?,?,?,?,?,?,");
            sb.append("?,?,?,?,?,?,?,?,?,?,");
            sb.append("?,?,?,?,?,?,?,?,?,?,");
            sb.append("?,?,?,?,?,?,?,?,?,?,");
            sb.append("?,?,?,?,?,?,?,?,?,?"); // 70
            sb.append(" from dual");
            PreparedStatement stmt =
                conn.prepareStatement(sb.toString());

            String testData = createTestData(conn);

            // set param
            for (int j = 0; j < PARAM_SIZE; j++) {
                stmt.setString(j+1, testData);
            }

            // execute
            ResultSet rs = stmt.executeQuery();
            String resultStr = null;

            while (rs.next()) {
                for (int k = 0; k < PARAM_SIZE; k++) {
                    resultStr += rs.getString(k+1);
                }
            }
      
            // output
            System.out.println("RESULT DATA:");
            System.out.println(resultStr);
            System.out.println(resultStr.getBytes().length);

            rs.close();
            stmt.close();
            conn.close();
       
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
  
    private void printMetaData(Connection conn) throws SQLException {
        DatabaseMetaData meta = conn.getMetaData();
        System.out.println("max statement length:"
            + meta.getMaxStatementLength());
    }

    private String createTestData(Connection conn) {

        // create one line data
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 130; i++) {
            sb.append("abcde12345");
        }

        // print data size
        int oneLineBytes = sb.toString().getBytes().length;
        System.out.println("one line data size:"
            + (oneLineBytes * PARAM_SIZE));

        return sb.toString();
    }
}