This example illustrates using one allocation statement for the entire call.
Query tool B allows you to update a spreadsheet of rows and then send the updates to the database. It makes the following ODBC calls:
FOR every_row_updated DO
SQLAllocHandle(SQL_HANDLE_STMT)
SQLExecDirect("UPDATE...SET COLn='literal'...WHERE COLn='oldval'...")
SQLFreeHandle( SQL_HANDLE_STMT )
END LOOP
The first thing to note is that the tool performs a statement allocation-and-drop for every row. Only one allocate statement is needed. This change would save the overhead of creating and destroying a statement handle for every operation. Another performance concern is the use of SQL with literals instead of with parameter markers. The SQLExecDirect() call causes an SQLPrepare and SQLExecute every time. A faster way to perform this operation would be as follows:
SQLAllocHandle(SQL_HANDLE_STMT)
SQLPrepare("UPDATE...SET COL1=?...WHERE COL1=?...")
SQLBindParameter( new_column_buffers )
SQLBindParameter( old_column_buffers )
FOR every_row_updated DO
...move each rows data into the SQLBindParameter buffers
SQLExecute()
SQLFreeHandle( SQL_HANDLE_STMT )
END LOOP
These sets of ODBC calls will outperform the original set by a large factor when you are using the iSeries™ Access for Windows® ODBC driver. The server CPU utilization will decrease to 10 percent of what it was, which pushes the scaling threshold out a lot farther.