Multiple prepared statements batch execution

Hi,
I have many different select SQLs I would like to execute in a batch.
Its not a problem if they are simple SQLs, you simply use the statement object and addBatch(sql) to it and then execute the entire batch.
But I would like these SQLs to be of a prepared statement format (meaning with ? and so on).
I know its possible if they are all of same prepared statement SQL and I can bind varabiles to then and write addBatch() and so on. but the the SQLs are different then one another (different tables and so on).
is it possible?

The sqls are different.
However, when you create 1prepared statement, during its creation you give it, its sql.
that sql should be only 1 command.That doesn't make it clear. I can make one prepared statement that has multiple SQL statements in it.
There is no rule that states that it must only have one SQL statement.
if I enable a simple prepared statement to accept a sql which is build from several
commands it might mean that there was some sql injection there.Then I can only suppose that you are using prepared statements incorrectly. However, excluding building SQL statement itself, I have no idea how you would construct a prepared statement that would allow an injection attack. And building the SQL statement itself is exactly what prepared statements and a solution in terms of injection attacks prevent.
the solution of providing several sqls in the prepared statement constructor is not a valid option from my perspective.You might believe so. You might have a reason for that although I have no idea what it is. It certainly isn't due to injection attacks because that isn't a valid reason.
That doesn't mean that it can't be done.

Similar Messages

  • Error handling in prepared statement batch

    Hi,
    For a prepared statement batch, it is not possible to know which operation failed. ... You should always perform a ROLLBACK operation in this situation.
    For a generic statement batch or callable statement batch, the update counts array is only a partial array containing the actual update counts up to the point of the error. ... You can either commit or roll back the successful operations in this situation, as you prefer.
    -- http://otn.oracle.com/docs/products/oracle9i/doc_library/release2/java.920/a96654/oraperf.htm#1056233
    But, I want to skip failed operations and continue to excecute the remains of the batch, also, I want to improve application performance, what should I do? Is there any choice?
    Best Regards,
    Kevin Zhao

    According to the Oracle docs these are not the only possible values:
    Oracle9i JDBC Developer's Guide and Reference
    Release 2 (9.2) chapter 12
    Performance Extensions
    "For a prepared statement batch, it is not possible to know which operation failed. The array has one element for each operation in the batch, and each element has a value of -3. According to the JDBC 2.0 specification, a value of -3 indicates that an operation did not complete successfully. In this case, it was presumably just one operation that actually failed, but because the JDBC driver does not know which operation that was, it labels all the batched operations as failures."
    It goes on to say that for a generic statement batch it is possible to know which failed. I would like to know if similar functionality will be available for prepared statement batches in the future.

  • Count of Rows Updated with prepared statement batch

    I am using a batch of prepared statements for update operation. (pstmt.executeBatch())
    Configuration I am using
    WLS 6.1sp2 Connection pool - Oracle Thin driver - TX Datasource
    DB - Oracle 8.1.7
    The batch update works well i.e data gets updated and committed. BUT I am not
    getting back the count of number of rows updated.
    Is there any thing more required on WLS side ?
    Thanks in Advance

    The Oracle drivers do not return the updated row counts from batched updates.
    Try running the attached program with the thin driver
    java Batch oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@host:port:database user password
    You will see that returns -2, which indicates that the number of rows updated is unknown.
    This does meet the JDBC spec.
    "Harshad Nanal" <[email protected]> wrote in message news:3f8a455f$[email protected]..
    >
    I am using a batch of prepared statements for update operation. (pstmt.executeBatch())
    Configuration I am using
    WLS 6.1sp2 Connection pool - Oracle Thin driver - TX Datasource
    DB - Oracle 8.1.7
    The batch update works well i.e data gets updated and committed. BUT I am not
    getting back the count of number of rows updated.
    Is there any thing more required on WLS side ?
    Thanks in Advance[Batch.java]

  • Resultset from a batch select using prepared statement

    Hi,
    Is it possible to add results of batch execute of select statements and retrieve the result set ..
    I am running select statement in a batch mode setting in value for a column.I add this to a prepared batch.
    I would like to get the reults as a batch and spin through the result set like a r.next(). Is this possible ?
    I have given the code below
    sql = "select ordervalue , orderdate from discreet_orders "+
    "where order_no = ? ";
    dbObject.prepareStatement(sql);
    dbObject.prepareStatement(sql);
    for (int i=0; i < orderNoVect.size(); i++) {
    dbObject.setString(1,(String)scnV.elementAt(i));
    dbObject.addBatchPrepared();
    r = dbObject.execPrepared();
    dbObject.clearBatchPrepared();
    I would like to do a r.getNext() process the values form the resultset.
    Is this possible ? If not is there an other way to do it ?
    Thanks
    Arnold

    Olek wrote:
    hi
    Is there a way do a batch update using prepared statement?
    I don't want to insert every row in a single query...
    regards,
    OlekPossibly the confusion here stems from the existence of two addBatch methods in PreparedStatement.
    addBatch(String sql)inherited from Statement adds a new query to the batch of SQL statements for the statement. However you don't want to use this with PreparedStatements Instead you want
    addBatch()which adds the current set of parameters to the prepared statements batch of commands.
    In this scenario you prepare your query (insert statement) and then call setXXX(x,y) for each parameter and then addBatch for each tuple. Then call executeBatch to execute all the queries based on your batched parameters.
    If this didn't answer your question I don't know what your question is exactly. I would add that you probably want to set a "reasonable" size on your batches and break them into smaller batches as is reasonable. Mainly because the implementation of batched PreparedStatements widely varies depending on the database and driver, thus there are certainly scenarios where given enough batched parameters you could have various unpleasant things visited upon your program. Like terminal slowness, running out of memory, etc.

  • Batch updates with callable/prepared statement?

    The document http://edocs.bea.com/wls/docs70/oracle/advanced.html#1158797 states
    that "Using Batch updates with the callableStatement or preparedStatement is
    not supported". What does that actually mean? We have used both callable and prepared
    statements with the batch update in our current project (with the Oracle 817 db).
    It seems to run ok anyway.

    So the documentation should state that batch updates do not work ok in old versions
    of JDriver for Oracle, BUT work correctly with newer version. Additionally, batch
    updates work ok when used with Oracle supplied jdbc-drivers?
    "Stephen Felts" <[email protected]> wrote:
    Support for addBatch and executeBatch in the WLS Jdriver for Oracle was
    added in 7.0SP2.
    It was not available in 6.X or 7.0 or 7.0SP1.
    "Janne" <[email protected]> wrote in message news:3edb0cdc$[email protected]..
    The document http://edocs.bea.com/wls/docs70/oracle/advanced.html#1158797
    states
    that "Using Batch updates with the callableStatement or preparedStatementis
    not supported". What does that actually mean? We have used both callableand prepared
    statements with the batch update in our current project (with the Oracle817 db).
    It seems to run ok anyway.

  • What is a better approach, batch or prepared statement?

    Hi,
    In my application, the user account property will be retrieved from DB and the last login time will be updated after a successful sign on. There are two query statements in this procedure; select and update. What is a better approach in JDBC to deal with the two queries: batch or prepared statement?
    Thanks.

    Hi, Duffy,
    Thanks for your input.
    I would like to use PreparedStatement with batch update. From my reading, however, it is not suitable to use PreparedStatement with batch update. At less, I haven't see a single example on the tutorial or article sections of this site. I am not sure the following is valid or not:
                   stmt = connection.prepareStatement(INSERT_SMT_QUERY_STR);
                   stmt.setLong(1, details.getRegardID());
                   stmt.setLong(2, details.getWriterID());
                   stmt.setInt(3, details.getVisibility());
                   stmt.setString(4, details.getSubject().trim());
                   stmt.setString(5, details.getContent().trim());
    stmt.addBatch() <-- what goes into here?

  • XML SQL format for Prepared statements in batch mode

    Hi
    I want to use the batch mode in JDBC adapter for inserting huge volume of records with better performance.
    so i need to execute the prepared statements in one batch.   Is the XML SQL format for prepared statements below correct ?to<root>
      <stmt>
        <Customers action="SQL_DML">
          <access> INSERT INTO Customers (CompanyName,Address,CustomerID) VALUES($NAME$,$ADDRESS$,$KEYFIELD$)
          </access>
          <key>
            <NAME>IBM</NAME>
            <ADDRESS>Street 3 </ADDRESS>
            <KEYFIELD>CO</KEYFIELD>
          </key>
          <key>
            <NAME>PWC</NAME>
            <ADDRESS>Street 4 </ADDRESS>
            <KEYFIELD>NO</KEYFIELD>
         </key>
        </Customers>
      </stmt>
    </root>
    Please advise

    Hello Experts
    Please throw some light on the above question.
    Thanks in advance.

  • Use Multiple Insert Statements in Prepared Statements

    Hi Friends
    i am stuck in a problem for which i need your help.i will brief you about the issue below.
    I am having Multiple Insert Statements which i need to execute to put the data in the database.i have a doubt about the use of the executeUpdate() function in the statement interface. sample code is as below.
    stmt = conn.prepareStatement("INSERT INTO Client ( clientPk, provincePk, countryPk, statusPk, branchPk, salutation, ) VALUES(PID, 2, '123123123', '123', '66', 1, 1 );");
    int n =stmt.executeUpdate();
    Now the problem is how do i insert multiple Insert statements using the conn.prepareStatement().should i do like
    stmt = conn.prepareStatement("")
    int n =stmt.executeUpdate();
    stmt = conn.prepareStatement("")
    int n =stmt.executeUpdate();
    stmt = conn.prepareStatement("")
    int n =stmt.executeUpdate(); ..................................
    should i use the same steps to execute each individual query and then use executeUpdate().
    Please let me know the correct procedure to be followed to execute these tasks.waiting for a positive reply from your side.
    Thanks & Regards
    Vikram K

    Hi
    Thanks a lot once agin for the reply.
    I think i have figured out the solution. I am using SQL statements in the Prepared statements(""). But now i have dropped the idea of using the prepared statement and decided to use the simple Statement instead.
    what i have done is as below.
    conn = ConnectionFactory.getInstance().getConnection();
    stmt = conn.createStatement();
    stmt.executeUpdate("INSERT INTO Client ( clientPk, provincePk, countryPk, statusPk, branchPk, salutation, heightMeasurementType, weightMeasurementType ) VALUES(PID, '1', '1', '0', '1', 'Mr', CONCAT('Jason ', PID), 'R', 'Mawdsley', '123', '66', 1, 1 );");
    stmt.executeUpdate("INSERT into Cp () Values ()");
    stmt.executeUpdate("INSERT into gp () Values ()");
    stmt.executeUpdate("INSERT into jk () Values ()");
    I think this makes sense to use the Statement and execute all the queries in one shot rather than using PS.
    thanks a lot for your help.
    Regards
    Vikram K

  • Oh my God Prepared Statements are about 80 times slower than multiple inser

    I am highly suprised that in my programme a normal statement os a lot faster than a Prepared Statement. I am posting below both the Programmes, in one I am using Prepared Statements and in another I am using normal Statements. My OS is Win NT My Database is SQL Server 7. THe progamme extracts data from a file and inserts records in the database. In the test case I had A file of about 1440 records ie. 1440 inserts are made to the database, The database table is very large ie. It has around 126 Columns.
    So for inserting 1440 record froma file the Prepared Statements take around 7 Minutes . And for reading the same file and inserting the same no of records in the same database normal Statements Take only about 7 seconds. Now the JAcva docs clearly Specify that when we need to use the same stmt many times it is better to use Prepared Satements < the results that I am Getting is clear and complete violation of what java docs say.
    Below is the code with Prepared Statements
    package mps.mpsPTLF;
    import java.io.*;
    import java.sql.*;
    import java.util.*;
    import java.util.Calendar;
    import java.util.Date;
    import gen.genCommon.genConnectionPool.*;
    import gen.genCommon.*;
    public class PTLFProcessor
         private static clsLogFile moLogFile = new clsLogFile("");
         private gen.genCommon.genConnectionPool.SharedConnectionPool mConnPool = SharedConnectionPool.getInstance(2);
         FileReader fPTLF = null;
         BufferedReader brPTLF = null;
    //**************** Begin Constructor declaration ************************
    To intialize the class variables for new Fee
         public PTLFProcessor(String pathPTLF) throws GenException
              try
                   fPTLF = new FileReader(pathPTLF);
                   brPTLF = new BufferedReader(fPTLF);
              catch (Exception e)
                   throw new GenException("Error Accessing file : " + pathPTLF + " - " + e.toString(),e );     
    //**************** End  Constructor declaration ************************
         public void PTLFGetData() throws GenException
              char pcData[];
              int HEADERSIZE = 6;
              boolean pbEndOfFile = false;
              boolean pbisFirstBlock = true;
              int piBlocksize = 0;
              int piOffset = 0;
              int piRecordsize = 0;
              String psRecordContent = "";
              Connection pConn = null;
              try
                   String psInsSql=" INSERT INTO FILE_PTLF_IN ( " +
                                       " fpi_DAT_TIM , " +
                                       " fpi_REC_TYP , " +
                                       " fpi_CRD_LN , " +
                                       " fpi_CRD_FIID , " +
                                       " fpi_CRD_NUM , " +
                                       " fpi_MBR_NUM , " +
                                       " fpi_MER_LN , " +
                                       " fpi_MER_FIID , " +
                                       " fpi_MER_GRP , " +
                                       " fpi_MER_REGN , " +
                                       " fpi_MER_ID , " +
                                       " fpi_TERM_ID , " +
                                       " fpi_SHIFT_NUM , " +
                                       " fpi_BATCH_NUM , " +
                                       " fpi_TERM_LN , " +
                                       " fpi_TERM_FIID , " +
                                       " fpi_TERM_ID_1 , " +
                                       " fpi_TRAN , " +
                                       " fpi_TERM_ID_2 , " +
                                       " fpi_REC_FRMT , " +
                                       " fpi_MER_ID_1 , " +
                                       " fpi_CLERK_ID , " +
                                       " fpi_DATA_FLAG , " +
                                       " fpi_TYP , " +
                                       " fpi_RTE_STAT , " +
                                       " fpi_ORIGINATOR , " +
                                       " fpi_RESPONDER , " +
                                       " fpi_ISS_CDE , " +
                                       " fpi_ENTRY_TIM , " +
                                       " fpi_EXIT_TIM , " +
                                       " fpi_RE_ENTRY_TIM , " +
                                       " fpi_TRAN_DAT , " +
                                       " fpi_TRAN_TIM , " +
                                       " fpi_POST_DAT , " +
                                       " fpi_ACQ_ICHG_SETL_DAT , " +
                                       " fpi_ISS_ICHG_SETL_DAT , " +
                                       " fpi_SEQ_NUM , " +
                                       " fpi_TERM_NAME_LOC , " +
                                       " fpi_TERM_OWNER_NAME , " +
                                       " fpi_TERM_CITY , " +
                                       " fpi_TERM_ST , " +
                                       " fpi_TERM_CNTRY_CDE , " +
                                       " fpi_BRCH_ID , " +
                                       " fpi_USER_FLD2 , " +
                                       " fpi_TERM_TIM_OFST , " +
                                       " fpi_ACQ_INST_ID_NUM , " +
                                       " fpi_RCV_INST_ID_NUM , " +
                                       " fpi_TERM_TYP , " +
                                       " fpi_CLERK_ID_1 , " +
                                       " fpi_GRP , " +
                                       " fpi_USER_ID , " +
                                       " fpi_RETL_SIC_CDE , " +
                                       " fpi_ORIG , " +
                                       " fpi_DEST , " +
                                       " fpi_TC , " +
                                       " fpi_T , " +
                                       " fpi_AA , " +
                                       " fpi_C , " +
                                       " fpi_CRD_TYP , " +
                                       " fpi_ACCT , " +
                                       " fpi_RESP_CDE , " +
                                       " fpi_AMT_1 , " +
                                       " fpi_AMT_2 , " +
                                       " fpi_EXP_DAT , " +
                                       " fpi_TRACK2 , " +
                                       " fpi_PIN_OFST , " +
                                       " fpi_PRE_AUTH_SEQ_NUM , " +
                                       " fpi_INVOICE_NUM , " +
                                       " fpi_ORIG_INVOICE_NUM , " +
                                       " fpi_AUTHORIZER , " +
                                       " fpi_AUTH_IND , " +
                                       " fpi_SHIFT_NUM_1 , " +
                                       " fpi_BATCH_SEQ_NUM , " +
                                       " fpi_APPRV_CDE , " +
                                       " fpi_APPRV_CDE_LGTH , " +
                                       " fpi_ICHG_RESP , " +
                                       " fpi_PSEUDO_TERM_ID , " +
                                       " fpi_RFRL_PHONE , " +
                                       " fpi_DFT_CAPTURE_FLG , " +
                                       " fpi_SETL_FLAG , " +
                                       " fpi_RVRL_CDE , " +
                                       " fpi_REA_FOR_CHRGBCK , " +
                                       " fpi_NUM_OF_CHRGBCK , " +
                                       " fpi_PT_SRV_COND_CDE , " +
                                       " fpi_PT_SRV_ENTRY_MDE , " +
                                       " fpi_AUTH_IND2 , " +
                                       " fpi_ORIG_CRNCY_CDE , " +
                                       " fpi_AUTH_CRNCY_CDE , " +
                                       " fpi_AUTH_CONV_RATE , " +
                                       " fpi_SETL_CRNCY_CDE , " +
                                       " fpi_SETL_CONV_RATE , " +
                                       " fpi_CONV_DAT_TIM , " +
                                       " fpi_IMP_IND , " +
                                       " fpi_AVAIL_BAL , " +
                                       " fpi_LEDG_BAL , " +
                                       " fpi_AMT_ON_HOLD , " +
                                       " fpi_TTL_FLOAT , " +
                                       " fpi_CUR_FLOAT , " +
                                       " fpi_ADJ_SETL_IMPACT_FLG , " +
                                       " fpi_PBF1 , " +
                                       " fpi_PBF2 , " +
                                       " fpi_PBF3 , " +
                                       " fpi_PBF4 , " +
                                       " fpi_FRWD_INST_ID_NUM , " +
                                       " fpi_CRD_ACCPT_ID_NUM , " +
                                       " fpi_CRD_ISS_ID_NUM , " +
                                       " fpi_ORIG_MSG_TYP , " +
                                       " fpi_ORIG_TRAN_TIM , " +
                                       " fpi_ORIG_TRAN_DAT , " +
                                       " fpi_ORIG_SEQ_NUM , " +
                                       " fpi_ORIG_B24_POST_DAT , " +
                                       " fpi_EXCP_RSN_CDE , " +
                                       " fpi_OVRRDE_FLG , " +
                                       " fpi_ADDR , " +
                                       " fpi_ZIP_CDE , " +
                                       " fpi_ADDR_VRFY_STAT , " +
                                       " fpi_PIN_IND , " +
                                       " fpi_PIN_TRIES , " +
                                       " fpi_PRE_AUTH_TS_DAT , " +
                                       " fpi_PRE_AUTH_TS_TIM , " +
                                       " fpi_PRE_AUTH_HLDS_LVL , " +
                                       " fpi_USER_FLD5 , " +
                                       " fpi_LEN , " +
                                       " fpi_INFO )" +
                                       " VALUES ( " +
                                       " ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, " +
                                       " ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, " +
                                       " ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, " +
                                       " ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, " +
                   pConn = mConnPool.getConnection();
                   PreparedStatement pStmt = pConn.prepareStatement(psInsSql);
                   while (!pbEndOfFile)
                        pcData = new char [HEADERSIZE];                    // Reading each Block Header
                        brPTLF.read (pcData, 0, HEADERSIZE);
                        piBlocksize = Integer.parseInt (new String (pcData));
                        piOffset = HEADERSIZE;
                        while (piOffset < piBlocksize)
                        {                      // Read the records upto end of block
                             pcData = new char [HEADERSIZE];               // Reading each Record Header
                             brPTLF.read (pcData, 0, HEADERSIZE);
                             piRecordsize = Integer.parseInt (new String (pcData));
                             piOffset += HEADERSIZE;
                             pcData = new char [piRecordsize - HEADERSIZE];     // Reading each Record Content
                             brPTLF.read (pcData, 0, piRecordsize - HEADERSIZE);
                             psRecordContent = new String (pcData);
                             piOffset += piRecordsize - HEADERSIZE;
                             moLogFile.writeToLog(psRecordContent);
                             if (pbisFirstBlock)
                                  if (!psRecordContent.startsWith ("TH"))
                                       throw new GenException ("Invalid File Format, missing 'TH'");
                                  pcData = new char [HEADERSIZE];          // Reading next Record Header
                                  brPTLF.read (pcData, 0, HEADERSIZE);
                                  piRecordsize = Integer.parseInt (new String (pcData));
                                  piOffset += HEADERSIZE;
                                  pcData = new char [piRecordsize - HEADERSIZE];// Reading next Record Content (Must be FH)
                                  brPTLF.read (pcData, 0, piRecordsize - HEADERSIZE);
                                  psRecordContent = new String (pcData);
                                  piOffset += piRecordsize - HEADERSIZE;
                                  if (!psRecordContent.startsWith ("FH"))
                                       throw new GenException ("File Header Not Found");
                                  pbisFirstBlock = false;
                             else if (psRecordContent.startsWith ("DR"))
                                  psRecordContent = psRecordContent.substring(2);
                        /*          if (psRecordContent.length() != 1820 ) // && psRecordContent.length() != 846)
                                       // insert in error table
                                       continue;
                                  if ( psRecordContent.substring(453-1, 455).equals ("000") || psRecordContent.substring(453-1, 455).equals ("001") )
                                       pStmt.setString (1, psRecordContent.substring(1-1,19));
                                       pStmt.setString (2, psRecordContent.substring(20-1,21));
                                       pStmt.setString (3, psRecordContent.substring(22-1,25));
                                       pStmt.setString (4, psRecordContent.substring(26-1,29));
                                       pStmt.setString (5, psRecordContent.substring(30-1,48));
                                       pStmt.setString (6, psRecordContent.substring(49-1,51));
                                       pStmt.setString (7, psRecordContent.substring(52-1,55));
                                       pStmt.setString (8, psRecordContent.substring(56-1,59));
                                       pStmt.setString (9, psRecordContent.substring(60-1,63));
                                       pStmt.setString (10, psRecordContent.substring(64-1,67));
                                       pStmt.setString (11, psRecordContent.substring(68-1,86));
                                       pStmt.setString (12, psRecordContent.substring(87-1,102));
                                       pStmt.setString (13, psRecordContent.substring(103-1,105));
                                       pStmt.setString (14, psRecordContent.substring(106-1,108));
                                       pStmt.setString (15, psRecordContent.substring(109-1,112));
                                       pStmt.setString (16, psRecordContent.substring(113-1,116));
                                       pStmt.setString (17, psRecordContent.substring(117-1,132));
                                       pStmt.setString (18, psRecordContent.substring(133-1,140));
                                       pStmt.setString (19, psRecordContent.substring(141-1,156));
                                       pStmt.setString (20, psRecordContent.substring(157-1,157));
                                       pStmt.setString (21, psRecordContent.substring(158-1,176));
                                       pStmt.setString (22, psRecordContent.substring(177-1,182));
                                       pStmt.setString (23, psRecordContent.substring(183-1,183));
                                       pStmt.setString (24, psRecordContent.substring(184-1,187));
                                       pStmt.setString (25, psRecordContent.substring(188-1,189));
                                       pStmt.setString (26, psRecordContent.substring(190-1,190));
                                       pStmt.setString (27, psRecordContent.substring(191-1,191));
                                       pStmt.setString (28, psRecordContent.substring(192-1,193));
                                       pStmt.setString (29, psRecordContent.substring(194-1,212));
                                       pStmt.setString (30, psRecordContent.substring(213-1,231));
                                       pStmt.setString (31, psRecordContent.substring(232-1,250));
                                       pStmt.setString (32, psRecordContent.substring(251-1,256));
                                       pStmt.setString (33, psRecordContent.substring(257-1,264));
                                       pStmt.setString (34, psRecordContent.substring(265-1,270));
                                       pStmt.setString (35, psRecordContent.substring(271-1,276));
                                       pStmt.setString (36, psRecordContent.substring(277-1,282));
                                       pStmt.setString (37, psRecordContent.substring(283-1,294));
                                       pStmt.setString (38, psRecordContent.substring(295-1,319));
                                       pStmt.setString (39, psRecordContent.substring(320-1,341));
                                       pStmt.setString (40, psRecordContent.substring(342-1,354));
                                       pStmt.setString (41, psRecordContent.substring(355-1,357));
                                       pStmt.setString (42, psRecordContent.substring(358-1,359));
                                       pStmt.setString (43, psRecordContent.substring(360-1,363));
                                       pStmt.setString (44, psRecordContent.substring(364-1,366));
                                       pStmt.setString (45, psRecordContent.substring(367-1,371));
                                       pStmt.setString (46, psRecordContent.substring(372-1,382));
                                       pStmt.setString (47, psRecordContent.substring(383-1,393));
                                       pStmt.setString (48, psRecordContent.substring(394-1,395));
                                       pStmt.setString (49, psRecordContent.substring(396-1,401));
                                       pStmt.setString (50, psRecordContent.substring(402-1,405));
                                       pStmt.setString (51, psRecordContent.substring(406-1,413));
                                       pStmt.setString (52, psRecordContent.substring(414-1,417));
                                       pStmt.setString (53, psRecordContent.substring(418-1,421));
                                       pStmt.setString (54, psRecordContent.substring(422-1,425));
                                       pStmt.setString (55, psRecordContent.substring(426-1,427));
                                       pStmt.setString (56, psRecordContent.substring(428-1,428));
                                       pStmt.setString (57, psRecordContent.substring(429-1,430));
                                       pStmt.setString (58, psRecordContent.substring(431-1,431));
                                       pStmt.setString (59, psRecordContent.substring(432-1,433));
                                       pStmt.setString (60, psRecordContent.substring(434-1,452));
                                       pStmt.setString (61, psRecordContent.substring(453-1,455));
                                       pStmt.setString (62, psRecordContent.substring(456-1,474));
                                       pStmt.setString (63, psRecordContent.substring(475-1,493));
                                       pStmt.setString (64, psRecordContent.substring(494-1,497));
                                       pStmt.setString (65, psRecordContent.substring(498-1,537));
                                       pStmt.setString (66, psRecordContent.substring(538-1,553));
                                       pStmt.setString (67, psRecordContent.substring(554-1,565));
                                       pStmt.setString (68, psRecordContent.substring(566-1,575));
                                       pStmt.setString (69, psRecordContent.substring(576-1,585));
                                       pStmt.setString (70, psRecordContent.substring(586-1,601));
                                       pStmt.setString (71, psRecordContent.substring(602-1,602));
                                       pStmt.setString (72, psRecordContent.substring(603-1,605));
                                       pStmt.setString (73, psRecordContent.substring(606-1,608));
                                       pStmt.setString (74, psRecordContent.substring(609-1,616));
                                       pStmt.setString (75, psRecordContent.substring(617-1,617));
                                       pStmt.setString (76, psRecordContent.substring(618-1,625));
                                       pStmt.setString (77, psRecordContent.substring(626-1,629));
                                       pStmt.setString (78, psRecordContent.substring(630-1,649));
                                       pStmt.setString (79, psRecordContent.substring(650-1,650));
                                       pStmt.setString (80, psRecordContent.substring(651-1,651));
                                       pStmt.setString (81, psRecordContent.substring(652-1,653));
                                       pStmt.setString (82, psRecordContent.substring(654-1,655));
                                       pStmt.setString (83, psRecordContent.substring(656-1,656));
                                       pStmt.setString (84, psRecordContent.substring(657-1,658));
                                       pStmt.setString (85, psRecordContent.substring(659-1,661));
                                       pStmt.setString (86, psRecordContent.substring(662-1,662));
                                       pStmt.setString (87, psRecordContent.substring(663-1,665));
                                       pStmt.setString (88, psRecordContent.substring(666-1,668));
                                       pStmt.setString (89, psRecordContent.substring(669-1,676));
                                       pStmt.setString (90, psRecordContent.substring(677-1,679));
                                       pStmt.setString (91, psRecordContent.substring(680-1,687));
                                       pStmt.setString (92, psRecordContent.substring(688-1,706));
                                       pStmt.setString (93, psRecordContent.substring(707-1,707));
                                       pStmt.setString (94, psRecordContent.substring(708-1,708));
                                       pStmt.setString (95, psRecordContent.substring(709-1,709));
                                       pStmt.setString (96, psRecordContent.substring(710-1,710));
                                       pStmt.setString (97, psRecordContent.substring(711-1,711));
                                       pStmt.setString (98, psRecordContent.substring(712-1,712));
                                       pStmt.setString (99, psRecordContent.substring(713-1,713));
                                       pStmt.setString (100, psRecordContent.substring(714-1,714));
                                       pStmt.setString (101, psRecordContent.substring(715-1,715));
                                       pStmt.setString (102, psRecordContent.substring(716-1,716));
                                       pStmt.setString (103, psRecordContent.substring(717-1,717));
                                       pStmt.setString (104, psRecordContent.substring(718-1,728));
                                       pStmt.setString (105, psRecordContent.substring(729-1,739));
                                       pStmt.setString (106, psRecordContent.substring(740-1,750));
                                       pStmt.setString (107, psRecordContent.substring(751-1,754));
                                       pStmt.setString (108, psRecordContent.substring(755-1,762));
                                       pStmt.setString (109, psRecordContent.substring(763-1,766));
                                       pStmt.setString (110, psRecordContent.substring(767-1,778));
                                       pStmt.setString (111, psRecordContent.substring(779-1,782));
                                       pStmt.setString (112, psRecordContent.substring(783-1,785));
                                       pStmt.setString (113, psRecordContent.substring(786-1,786));
                                       pStmt.setString (114, psRecordContent.substring(787-1,806));
                                       pStmt.setString (115, psRecordContent.substring(807-1,815));
                                       pStmt.setString (116, psRecordContent.substring(816-1,816));
                                       pStmt.setString (117, psRecordContent.substring(817-1,817));
                                       pStmt.setString (118, psRecordContent.substring(818-1,818));
                                       pStmt.setString (119, psRecordContent.substring(819-1,824));
                                       pStmt.setString (120, psRecordContent.substring(825-1,832));
                                       pStmt.setString (121, psRecordContent.substring(833-1,833));
                                       pStmt.setString (122, psRecordContent.substring(834-1,866));
                                       pStmt.setString (123, psRecordContent.substring(867-1,870));
                                       pStmt.setString (124, psRecordContent.substring(871-1,1070));
                                       if (pStmt.executeUpdate() != 1)
                                            throw new GenException ("Insertion failed");
                                            String psMsgType = psRecordContent.substring (184-1, 187);
                                            if (true)//updateTable (conn, pstmt, pstmt1, pstmt2, psRecordContent, out, bw))
                                                 if (psMsgType.equals ("0500") || psMsgType.equals ("0520"))
                                                           //piSettlementDR++;
                                                 if (psMsgType.equals ("0210"))
                                                           //piUpdatedDR++;
                                                 if (psMsgType.equals ("0220") || psMsgType.equals ("0320") || psMsgType.equals ("0420"))
                                                      //reversalDR++;
                                                 //validDR++;
                                  //totalDR++;
                             else if (psRecordContent.startsWith ("FT"))
                                  pcData = new char [HEADERSIZE];     // Reading next Record Header
                                  brPTLF.read (pcData, 0, HEADERSIZE);
                                  piRecordsize = Integer.parseInt (new String (pcData));
                                  piOffset += HEADERSIZE;
                                  pcData = new char [piRecordsize - HEADERSIZE];// Reading next Record Content (Must be TT)
                                  brPTLF.read (pcData, 0, piRecordsize - HEADERSIZE);
                                  psRecordContent = new String (pcData);
                                  piOffset += piRecordsize - HEADERSIZE;
                                  if (!psRecordContent.startsWith ("TT"))
                                       throw new GenException ("Total Trailer not Found.");
                                  pbEndOfFile = true;
                        } // while (piOffset < piBlocksize)
                   } // while (!pbEndOfFile)
                   brPTLF.close();
                   fPTLF.close();
                   pStmt.close();
              catch (Exception e)
                   moLogFile.printStackTrace(e);
              finally
                   mConnPool.free(pConn);
         public static void main(String args[])
              try
                   PTLFProcessor test=new PTLFProcessor("c:\\test.txt");
                   test.PTLFGetData();
              catch (Exception e)
                   clsLogFile.printStackTrace(e);
    }Now is the code with normal Statements
    //package mps.mpsPTLF;
    import java.io.*;
    import java.sql.*;
    import java.util.*;
    import java.util.Calendar;
    import java.util.Date;
    import gen.genCommon.genConnectionPool.*;
    import gen.genCommon.*;
    public class PTLFProcessor1
         private static clsLogFile moLogFile = new clsLogFile("");
         private gen.genCommon.genConnectionPool.SharedConnectionPool mConnPool = SharedConnectionPool.getInstance(2);
         FileReader fPTLF = null;
         BufferedReader brPTLF = null;
    //**************** Begin Constructor declaration ************************
    To intialize the class variables for new Fee
         public PTLFProcessor1(String pathPTLF) throws GenException
              try
                   fPTLF = new FileReader(pathPTLF);
                   brPTLF = new BufferedReader(fPTLF);
              catch (Exception e)
                   throw new GenException("Error Accessing file : " + pathPTLF + " - " + e.toString(),e );     
    //**************** End  Constructor declaration ************************
         public void PTLFGetData() throws GenException
              char pcData[];
              int HEADERSIZE = 6;
              boolean pbEndOfFile = false;
              boolean pbisFirstBlock = true;
              int piBlocksize = 0;
              int piOffset = 0;
              int piRecordsize = 0;
              String psRecordContent = "";
              Connection pConn = null;
              int cnt=0;
              try
                   String psInsSql=" INSERT INTO FILE_PTLF_IN ( " +
                                       " fpi_DAT_TIM , " +
                                       " fpi_REC_TYP , " +
                                       " fpi_CRD_LN , " +
                                       " fpi_CRD_FIID , " +
                                       " fpi_CRD_NUM , " +
                                       " fpi_MBR_NUM , " +
                                       " fpi_MER_LN , " +
                                       " fpi_MER_FIID , " +
                                       " fpi_MER_GRP , " +
                                       " fpi_MER_REGN , " +
                                       " fpi_MER_ID , " +
                                       " fpi_TERM_ID , " +
                                       " fpi_SHIFT_NUM , " +
                                       " fpi_BATCH_NUM , " +
                                       " fpi_TERM_LN , " +
                                       " fpi_TERM_FIID , " +
                                       " fpi_TERM_ID_1 , " +
                                       " fpi_TRAN , " +
                                       " fpi_TERM_ID_2 , " +
                                       " fpi_REC_FRMT , " +
                                       " fpi_MER_ID_1 , " +
                                       " fpi_CLERK_ID , " +
                                       " fpi_DATA_FLAG , " +
                                       " fpi_TYP , " +
                                       " fpi_RTE_STAT , " +
                                       " fpi_ORIGINATOR , " +
                                       " fpi_RESPONDER , " +
                                       " fpi_ISS_CDE , " +
                                       " fpi_ENTRY_TIM , " +
                                       " fpi_EXIT_TIM , " +
                                       " fpi_RE_ENTRY_TIM , " +
                                       " fpi_TRAN_DAT , " +
                                       " fpi_TRAN_TIM , " +
                                       " fpi_POST_DAT , " +
                                       " fpi_ACQ_ICHG_SETL_DAT , " +
                                       " fpi_ISS_ICHG_SETL_DAT , " +
                                       " fpi_SEQ_NUM , " +
                                       " fpi_TERM_NAME_LOC , " +
                                       " fpi_TERM_OWNER_NAME , " +
                                       " fpi_TERM_CITY , " +
                                       " fpi_TERM_ST , " +
                                       " fpi_TERM_CNTRY_CDE , " +
                                       " fpi_BRCH_ID , " +
                                       " fpi_USER_FLD2 , " +
                                       " fpi_TERM_TIM_OFST , " +
                                       " fpi_ACQ_INST_ID_NUM , " +
                                       " fpi_RCV_INST_ID_NUM , " +
                                       " fpi_TERM_TYP , " +
                                       " fpi_CLERK_ID_1 , " +
                                       " fpi_GRP , " +
                                       " fpi_USER_ID , " +
                                       " fpi_RETL_SIC_CDE , " +
                                       " fpi_ORIG , " +
                                       " fpi_DEST , " +
                                       " fpi_TC , " +
                                       " fpi_T , " +
                                       " fpi_AA , " +
                                       " fpi_C , " +
                                       " fpi_CRD_TYP , " +
                                       " fpi_ACCT , " +
                                       " fpi_RESP_CDE , " +
                                       " fpi_AMT_1 , " +
                                       " fpi_AMT_2 , " +
                                       " fpi_EXP_DAT , " +
                                       " fpi_TRACK2 , " +
                                       " fpi_PIN_OFST , " +
                                       " fpi_PRE_AUTH_SEQ_NUM , " +
                                       " fpi_INVOICE_NUM , " +
                                       " fpi_ORIG_INVOICE_NUM , " +
                                       " fpi_AUTHORIZER , " +
                                       " fpi_AUTH_IND , " +
                                       " fpi_SHIFT_NUM_1 , " +
                                       " fpi_BATCH_SEQ_NUM , " +
                                       " fpi_APPRV_CDE , " +
                                       " fpi_APPRV_CDE_LGTH , " +
                                       " fpi_ICHG_RESP , " +
                                       " fpi_PSEUDO_TERM_ID , " +
                                       " fpi_RFRL_PHONE , " +
                                       " fpi_DFT_CAPTURE_FLG , " +
                                       " fpi_SETL_FLAG , " +
                                       " fpi_RVRL_CDE , " +
                                       " fpi_REA_FOR_CHRGBCK , " +
                                       " fpi_NUM_OF_CHRGBCK , " +
                                       " fpi_PT_SRV_COND_CDE , " +
                                       " fpi_PT_SRV_ENTRY_MDE , " +
                                       " fpi_AUTH_IND2 , " +
                                       " fpi_ORIG_CRNCY_CDE , " +
                                       " fpi_AUTH_CRNCY_CDE , " +
                                       " fpi_AUTH_CONV_RATE , " +
                                       " fpi_SETL_CRNCY_CDE , " +
                                       " fpi_SETL_CONV_RATE , " +
                                       " fpi_CONV_DAT_TIM , " +
                                       " fpi_IMP_IND , " +
                                       " fpi_AVAIL_BAL , " +
                                       " fpi_LEDG_BAL , " +
                                       " fpi_AMT_ON_HOLD , " +
                                       " fpi_TTL_FLOAT , " +
                                       " fpi_CUR_FLOAT , " +
                                       " fpi_ADJ_SETL_IMPACT_FLG , " +
                                       " fpi_PBF1 , " +
                                       " fpi_PBF2 , " +
                                       " fpi_PBF3 , " +
                                       " fpi_PBF4 , " +
                                       " fpi_FRWD_INST_ID_NUM , " +
                                       " fpi_CRD_ACCPT_ID_NUM , " +
                                       " fpi_CRD_ISS_ID_NUM , " +
                                       " fpi_ORIG_MSG_TYP , " +
                                       " fpi_ORIG_TRAN_TIM , " +
                                       " fpi_ORIG_TRAN_DAT , " +
                                       " fpi_ORIG_SEQ_NUM , " +
                                       " fpi_ORIG_B24_POST_DAT , " +
                                       " fpi_EXCP_RSN_CDE , " +
                                       " fpi_OVRRDE_FLG , " +
                                       " fpi_ADDR , " +
                                       " fpi_ZIP_CDE , " +
                                       " fpi_ADDR_VRFY_STAT , " +
                                       " fpi_PIN_IND , " +
                                       " fpi_PIN_TRIES , " +
                                       " fpi_PRE_AUTH_TS_DAT , " +
                                       " fpi_PRE_AUTH_TS_TIM , " +
                                       " fpi_PRE_AUTH_HLDS_LVL , " +
                                       " fpi_USER_FLD5 , " +
                                       " fpi_LEN , " +
                                       " fpi_INFO )" +
                                       " VALUES ";
                                       ( " +
                                       " ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, " +
                                       " ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, " +
                                       " ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, " +
                                       " ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, " +
                   pConn = mConnPool.getConnection();
                   Statement Stmt=pConn.createStatement();
                   while (!pbEndOfFile)
                        pcData = new char [HEADERSIZE];                    // Reading each Block Header
                        brPTLF.read (pcData, 0, HEADERSIZE);
                        piBlocksize = Integer.parseInt (new String (pcData));
                        piOffset = HEADERSIZE;
                        while (piOffset < piBlocksize)
                        {                      // Read the records upto end of block
                             pcData = new char [HEADERSIZE];               // Reading each Record Header
                             brPTLF.read (pcData, 0, HEADERSIZE);
                             piRecordsize = Integer.parseInt (new String (pcData));
                             piOffset += HEADERSIZE;
                             pcData = new char [piRecordsize - HEADERSIZE];     // Reading each Record Content
                             brPTLF.read (pcData, 0, piRecordsize - HEADERSIZE);
                             psRecordContent = new String (pcData);
                             piOffset += piRecordsize - HEADERSIZE;
                             if (pbisFirstBlock)
                                  if (!psRecordContent.startsWith ("TH"))
                                       throw new GenException ("Invalid File Format, missing 'TH'");
                                  pcData = new char [HEADERSIZE];          // Reading next Record Header
                                  brPTLF.read (pcData, 0, HEADERSIZE);
                                  piRecordsize = Integer.parseInt (new String (pcData));
                                  piOffset += HEADERSIZE;
                                  pcData = new char [piRecordsize - HEADERSIZE];// Reading next Record Content (Must be FH)
                                  brPTLF.read (pcData, 0, piRecordsize - HEADERSIZE);
                                  psRecordContent = new String (pcData);
                                  piOffset += piRecordsize - HEADERSIZE;
                                  if (!psRecordContent.startsWith ("FH"))
                                       throw new GenException ("File Header Not Found");
                                  pbisFirstBlock = false;
                             else if (psRecordContent.startsWith ("DR"))
                                  psRecordContent = psRecordContent.substring(2);
                        /*          if (psRecordContent.length() != 1820 ) // && psRecordContent.length() != 846)
                                       // insert in error table
                                       continue;
                                  String psValues = null;
                                  if ( psRecordContent.substring(453-1, 455).equals ("000") || psRecordContent.substring(453-1, 455).equals ("001") )
                                       psValues = "('" +  psRecordContent.substring(1-1,19) + "','" +
                                                        psRecordContent.substring(20-1,21) + "','" +
                                                       psRecordContent.substring(22-1,25) + "','" +
                                                       psRecordContent.substring(26-1,29) + "','" +
                                                       psRecordContent.substring(30-1,48) + "','" +
                                                       psRecordContent.substring(49-1,51) + "','" +
                                                       psRecordContent.substring(52-1,55) + "','" +
                                                       psRecordContent.substring(56-1,59) + "','" +
                                                       psRecordContent.substring(60-1,63) + "','" +
                                                       psRecordContent.substring(64-1,67) + "','" +
                                                       psRecordContent.substring(68-1,86) + "','" +
                                                       psRecordContent.substring(87-1,102) + "','" +
                                                       psRecordContent.substring(103-1,105) + "','" +
                                                       psRecordContent.substring(106-1,108) + "','" +
                                                       psRecordContent.substring(109-1,112) + "','" +
                                                       psRecordContent.substring(113-1,116) + "','" +
                                                       psRecordContent.substring(117-1,132) + "','" +
                                                       psRecordContent.substring(133-1,140) + "','" +
                                                       psRecordContent.substring(141-1,156) + "','" +
                                                       psRecordContent.substring(157-1,157) + "','" +
                                                       psRecordContent.substring(158-1,176) + "','" +
                                                       psRecordContent.substring(177-1,182) + "','" +
                                                       psRecordContent.substring(183-1,183) + "','" +
                                                       psRecordContent.substring(184-1,187) + "','" +
                                                       psRecordContent.substring(188-1,189) + "','" +
                                                       psRecordContent.substring(190-1,190) + "','" +
                                                       psRecordContent.substring(191-1,191) + "','" +
                                                       psRecordContent.substring(192-1,193) + "','" +
                                                       psRecordContent.substring(194-1,212) + "','" +
                                                       psRecordContent.substring(213-1,231) + "','" +
                                                       psRecordContent.substring(232-1,250) + "','" +
                                                       psRecordContent.substring(251-1,256) + "','" +
                                                       psRecordContent.substring(257-1,264) + "','" +
                                                       psRecordContent.substring(265-1,270) + "','" +
                                                       psRecordContent.substring(271-1,276) + "','" +
                                                       psRecordContent.substring(277-1,282) + "','" +
                                                       psRecordContent.substring(283-1,294) + "','" +
                                                       psRecordContent.substring(295-1,319) + "','" +
                                                       psRecordContent.substring(320-1,341) + "','" +
                                                       psRecordContent.substring(342-1,354) + "','" +
                                                       psRecordContent.substring(355-1,357) + "','" +
                                                       psRecordContent.substring(358-1,359) + "','" +
                                                       psRecordContent.substring(360-1,363) + "','" +
       

    You posted this question in several other forums. Please don't do that.

  • Prepared Statement with SQL 'IN' Clause

    Hi,
    I am trying to write a JDBC SQL call to a database using a prepared statement, the call looks something like:
    select *
    from table
    where field in (?, ? ,?)
    this thing is that i don't know how many 'IN' parameters are needed until runtime (they come from a List), so is there an easy way of dealing with this, I haven't been able to find any information on this problem anywhere?

    >
    Hmmm...more expensive than say doing a query on on 2 billion rows with no index?
    More expensive than doing a cross server join?
    More expensive than doing a restore?
    I knew that someone would point this out. :)
    I just tried to exaggerate the importance of cursor sharing. This is one of the most important topic in DBMS world, but quite often ignored by JAVA world. I hope that you understand my good intention.
    >
    2. Insert data corresponding to bind variable to "T". Interesting idea. Please provide the algorithm for that. The only ones I can come up with
    1. Involved creating a "dynamic" SQL for the insert
    2. Doing multiple cross network inserts.
    The first of course is exactly what you said your solution prevented. The second will be more expensive than sending a single dynamically created select.Hopefully, this is not just an "interesting" idea, but very common technique in DBMS. Actually one of the common techniques. There are couple of ways to handle this kind(variable number of bind variables in "IN" clause) of problem.
    What i commented was that the simplest one. It's like this:
    (based on Oracle)
    SQL> create global temporary table bind_temp(value int);
    PreparedStatement stmt = con.prepareStatement("INSERT INTO bid_temp VALUES(?)");
    for(...) {
         stmt.setInt(1, aValue)
         stmt.addBatch();
    stmt.executeBatch();
    Statement stmt2 = con.executeQuery("SELECT * FROM target_table WHERE id IN (bind_temp)");
    ...Doesn't it look pretty? Pretty for both Java developers and DBAs.
    By virtue of the mechanism of batch processing, the total DBMS call is just twice and you need just 2 completely sharable SQL statements.
    (Hopefully you might understand that Oracle global temporary table is just session scope and we don't need them to be stored permanently)
    Above pattern is quite beneficial than these pattern of queries.
    SELECT * FROM target_table WHERE id IN (?)
    SELECT * FROM target_table WHERE id IN (?,?)
    SELECT * FROM target_table WHERE id IN (?,?,?)
    SELECT * FROM target_table WHERE id IN (?,?,?,?,.......,?)
    If you have large quantity of above patterns of queries, you should note that there are another bunch of better techniques. I noted just one of them.
    Hope this clairfies my point.

  • Query slow when executing using prepared statement compared to sqlDeveloper

    Oracle version is 10.2.0.1.0.
    I have got a query which when submitted from java code using prepared statement and parameter substitutions, takes more than 20 seconds to give results.
    I can see this SELECT sql sitting there when I run Monitor Sessions through sqlDeveloper, with its wait time increasing and then finally getting through. During that time no other SQLs are waiting.
    DURING THAT TIME then I am able to run the same query (with values included) multiple times using sqlDeveloper, and it gives results in no time.
    Sqldeveloper connects using thin client using lib provided by oracle in windows.
    Java code runs from linux and uses the thin client using lib provided by oracle in linux.
    Both are hitting the same DB running on a separate Linux machine.
    What could be the cause of this problem?
    What db parameters, queries should I run to identify the bottleneck?
    Edited by: user10390517 on Jun 14, 2010 3:06 AM

    Hi Rob,
    at least you should see some differences in the statistics for the different child cursor (the one for the execution in the application should show at least a higher value for ELAPSED_TIME). I would use something like the following query to check the information for the child cursors:
    select sql_id
         , PLAN_HASH_VALUE
         , CHILD_NUMBER
         , EXECUTIONS
         , ELAPSED_TIME
         , USER_IO_WAIT_TIME
         , CONCURRENCY_WAIT_TIME
         , DISK_READS
         , BUFFER_GETS
         , ROWS_PROCESSED
      from v$sql
    where sql_id = your_sql_idRegards
    Martin

  • Using prepared statements in java

    Hi
    I have question on proper usage of prepared statements.
    PreparedStatement ps;
    public methoda(){
    ps=conn.prepareStatement(sqlQry);
    ps.setInt(1,2);
    ps.execute();
    In the above case I am creating new references to prepared statement (ps)each time I invoke methoda. So am I still using the advantage of prepared statements that is prepare a statement once and execute it multiple times. Or in the above case, the DB knows that this has been executed before and does not prepare it second time and just executes it.
    thanks

    The database stores execution plans for previous statements that were executed. So even tho you create a new PreparedStatement each time, it will still be an improvement.
    Even if you don't use prepared statements those plans are cached. Problem is that you must reuse the exact same sql to get the benefit.
    So if you do
    select password from users where user="dave";
    a hundred times, the database most likely will only create the plan once.
    Problem is of course, that
    select password from users where user="yelapa";
    is a completely different sql statement sofar as the database knows.
    Thus, the value of Prepared statements.
    select password from users where user=?
    is what the database sees no matter what user is running it.

  • Proving prepared statements are being reused

    How can I prove that a prepared statement from a JDBC driver is being reused / pooled ?
    What essentially I want to do is to have prepared statements reused to reduce hard parsing ... but I also need to prove that the statements are being reused. If I query the statement in V$SQLAREA, the column PARSE_CALLS does not seem to be distinguish between hard parse and soft parse:
    http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96536/ch3204.htm#1126299
    I am only interested for now in proving the just ONE statement is being reused ... which mean that the number of hard parses is very low compared to the number of soft parses for that ONE statement.
    Regards,
    jms
    Message was edited by:
    jms

    Hi,
    No, parse calls is all soft and hard parse together. What you would see, if used absolutely correctly, would be 1 hard parse per session and many executions.
    But since v$sql is obviously not linked to v$session other than at the time of exection, you see the aggregated parse calls and executions for each cursor. So what you should see is parse calls go up relatively slowly to the number of exections.
    However, you can see soft and hard parses using the v$sesstat and v$statname views so you can see soft and hard parses on a session by session basis, be these are again aggregated, so you can't see soft / hard counts per cursor, only the total for a session.
    What I see a lot of the time is they don't get it quite right, so hard parses is low but soft parses are high, so they are still parsing when they don't need to, but at least they are binding and using shareable SQL, which is a step in the right direction.
    When I say 'they', it is a generic reference to all Java/.Nyet programmers writing front end code where they just don't 'get' parsing and binding because it's just too complicated and hey, SQL Server isn't like this...!
    HTH
    Chris

  • When to use prepared statement in java?

    Hi all,
    If we have query like select * from {tablename} (Here tablename is the variable) then will the use of prepared staement improve the performance? My guess is use of statement in this case is a better option rather than prepared statement as the tablename may change for every other query.I think are not useful if tablename changes.They are useful only when the where clause has dynamic values.

    cantor wrote:
    Are you sure that your approach is possible? The next example causes exception for me.
    PreparedStatement ps = conn.prepareStatement("select * from ?");
    ps.setString(1, "TABLE_NAME");
    ps.executeQuery();
    I didn't say that he should solve it in that way. He should create one prepared statement like this "select a, b, c from tablename1" and another prepared statement when he wants to execute "select d, e, f from tablename2"
    >
    And as I understand, this code will not improve perfomance (and even will not work). As I said it can.
    Prepared statements make possible usage compiled queries inside DB. When DB gets prepared statement call, it need to parse it only once. And it can collect some statistic to improve execution plan. But when table name is not specified, this approach will not work.Yes it might. There are database drivers that can cache prepared statements and it's isn't likely that he executes that query on more than e.g. 20 tables?
    The database can also cache compiled statements in a cache.
    Kaj

  • Problem with batch execution

    I am using batch execution for inserting records in a table.
    My code is as follows
    // set Batch size to 1
    for (i = 0; i < 23; i++) {
    // set first & second columns to some value
    ps.setInt(1,j);
    ps.setString(2,"cat");
    // execute batch
    rowsInserted = ps.executeUpdate();
    // send last batch (if any)
    rowsInserted = ((OraclePreparedStatement)ps).sendBatch ();
    // set first & second columns to some value
    ps.setInt(1,100);
    ps.setString(2,"dog");
    // execute batch
    rowsInserted = ps.executeUpdate();
    Here total 25 rows were inserted.
    23 rows from the loop.
    remaining two rows has the same value (100,"dog")
    I was expecting 24 rows in the table
    23 rows from loop
    no row from sendbatch since no record accumulated. (batch is of size 1)
    one record from last insert statement. (100,"dog")
    does anyone know why this happened?
    null

    More code to figure this out may help.
    Also, the term "Batch execution" doesn't apply here... you're simply adding records, near as I can tell.

Maybe you are looking for

  • HP Officejet 4630 e-All-in-One Printer Black Ink not Working

    My HP Officejet 4630 e-All-in-One does not print black ink but the color ink is working perfectly fine even though the ink status shows that there is black ink left. After I've changed a new black ink cartridge, it will start to work again but after

  • When I close FF8 it dosen't close my Facebook session.

    When I closed FF7 and then when I reopen it, Facebook asked me to login. I don't want FF to memorize my Facebook password. Now, with FF8, I shutdown FF and when I reopen it and access Facebook my last session wasn't closed.

  • Best practice for window management

    Hi all, I'm pretty new at flex and I have to develop an application. I don't know yet what the best practices are to have a consistent layout and code - The program must have different views (scheduling, settings, adminwindow, ....)      What is the

  • Bapi for assessment cycle

    Hello everybody, I would like to use a standard bapi (or at least a standard function module) to entry values of assessment cycle segments (senders, receivers, percent....) Does anyone know if such a standard bapi exist ? Thanks for your help, you'll

  • Why KEY-COMMIT didn't response??????????

    why KEY-COMMIT didn't response?????????? my Program Units is LYH: LYH(Package Spec): PACKAGE LYH IS PROCEDURE EVENT(EVT in VARCHAR2); END; LYH(Package Body): PACKAGE BODY LYH IS procedure EVENT(EVT in VARCHAR2) is TYPE Array1 IS TABLE OF VARCHAR2(100