/******************************************************************************* ** ** Source File Name = xfetch.c 1.9.2.2 ** ** Licensed Materials - Property of IBM ** ** (C) COPYRIGHT International Business Machines Corp. 1995, 1999 ** All Rights Reserved. ** ** US Government Users Restricted Rights - Use, duplication or ** disclosure restricted by GSA ADP Schedule Contract with IBM Corp. ** ** PURPOSE : ** ** A DB2 Version 2 sample that has been unchanged. See the CLI sample ** xfetch.c for the same program updated to use the latest set of functions. ** ** - Uses ExtendedFetch, Both Row-Wise (stmt2) and Column-Wise (stmt1) ** Fetches ROWSET_SIZE rows at a time. ** ** For more information about these samples see the README file. ** ** For more information on programming in CLI see the: ** - "Building CLI Applications" section of the Application Building Guide, and the ** - CLI Guide and Reference. ** ** For more information on the SQL language see the SQL Reference. ** *******************************************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include "sqlcli.h" #include "sqlcli1.h" #include "v2sutil.h" /* Header file for CLI sample code */ /* For the Macintosh environment when generating 68K applications */ #ifdef DB268K /* Need to include ASLM for 68K applications */ #include <LibraryManager.h> #endif #define MAX_STMT_LEN 255 #define ROWSET_SIZE 10 /* Global Variables for user id and password. To keep samples simple, not a recommended practice. */ SQLCHAR server[SQL_MAX_DSN_LENGTH + 1]; SQLCHAR uid[MAX_UID_LENGTH + 1]; SQLCHAR pwd[MAX_PWD_LENGTH + 1]; /******************************************************************* ** main *******************************************************************/ int main( int argc, char * argv[] ) { SQLHENV henv; SQLHDBC hdbc; SQLHSTMT hstmt; SQLRETURN rc; SQLCHAR stmt[] = "SELECT deptnumb, deptname, id, name FROM staff, org \ WHERE dept=deptnumb AND job = 'Mgr'"; /* Column-Wise */ SQLINTEGER deptnumb[ROWSET_SIZE]; SQLCHAR deptname[ROWSET_SIZE][15]; SQLINTEGER deptname_l[ROWSET_SIZE]; SQLSMALLINT id[ROWSET_SIZE]; SQLCHAR name[ROWSET_SIZE][10]; SQLINTEGER name_l[ROWSET_SIZE]; /* Row-Wise (Includes buffer for both column data and length) */ struct { SQLINTEGER deptnumb_l; /* length */ SQLINTEGER deptnumb; /* value */ SQLINTEGER deptname_l; SQLCHAR deptname[15]; SQLINTEGER id_l; SQLSMALLINT id; SQLINTEGER name_l; SQLCHAR name[10]; } R[ROWSET_SIZE]; SQLUSMALLINT Row_Stat[ROWSET_SIZE]; SQLUINTEGER pcrow; int i; /* For the Macintosh environment when generating 68K applications */ #ifdef DB268K /* Before making any API calls for 68K environment, need to initialize the Library Manager */ InitLibraryManager(0,kCurrentZone,kNormalMemory); atexit(CleanupLibraryManager); #endif /* macro to initalize server, uid and pwd */ INIT_UID_PWD; rc = SQLAllocEnv(&henv); /* allocate an environment handle */ if (rc != SQL_SUCCESS) return (terminate(henv, rc)); rc = DBconnect(henv, &hdbc);/* allocate a connect handle, and connect */ CHECK_DBC(hdbc, rc); /*********************************************/ /* Column-Wise Binding */ /*********************************************/ rc = SQLAllocStmt(hdbc, &hstmt); CHECK_DBC(hdbc, rc); rc = SQLSetStmtOption(hstmt, SQL_ROWSET_SIZE, ROWSET_SIZE); CHECK_STMT(hstmt, rc); rc = SQLExecDirect(hstmt, stmt, SQL_NTS); CHECK_STMT(hstmt, rc); rc = SQLBindCol(hstmt, 1, SQL_C_LONG, (SQLPOINTER) deptnumb, 0, NULL); CHECK_STMT(hstmt, rc); rc = SQLBindCol(hstmt, 2, SQL_C_CHAR, (SQLPOINTER) deptname, 15, deptname_l); CHECK_STMT(hstmt, rc); rc = SQLBindCol(hstmt, 3, SQL_C_SSHORT, (SQLPOINTER) id, 0, NULL); CHECK_STMT(hstmt, rc); rc = SQLBindCol(hstmt, 4, SQL_C_CHAR, (SQLPOINTER) name, 10, name_l); CHECK_STMT(hstmt, rc); /* Fetch ROWSET_SIZE rows ast a time, and display */ printf("\nDEPTNUMB DEPTNAME ID NAME\n"); printf("-------- -------------- -------- ---------\n"); while ((rc = SQLExtendedFetch(hstmt, SQL_FETCH_NEXT, 0, &pcrow, Row_Stat)) == SQL_SUCCESS) { for (i = 0; i < pcrow; i++) { printf("%8ld %-14s %8d %-9s\n", deptnumb[i], deptname[i], id[i], name[i]); } if (pcrow < ROWSET_SIZE) break; } /* endwhile */ if (rc != SQL_NO_DATA_FOUND && rc != SQL_SUCCESS) check_error(henv, hdbc, hstmt, rc, __LINE__, __FILE__); rc = SQLFreeStmt(hstmt, SQL_DROP); /*********************************************/ /* Row-Wise Binding */ /*********************************************/ rc = SQLAllocStmt(hdbc, &hstmt); if (rc != SQL_SUCCESS) check_error(henv, hdbc, SQL_NULL_HSTMT, rc, __LINE__, __FILE__); /* Set maximum number of rows to receive with each extended fetch */ rc = SQLSetStmtOption(hstmt, SQL_ROWSET_SIZE, ROWSET_SIZE); if (rc != SQL_SUCCESS) check_error(henv, hdbc, hstmt, rc, __LINE__, __FILE__); /* * Set vparam to size of one row, used as offset for each bindcol * rgbValue */ /* ie. &(R[0].deptnumb) + vparam = &(R[1].deptnum) */ rc = SQLSetStmtOption(hstmt, SQL_BIND_TYPE, sizeof(R) / ROWSET_SIZE); CHECK_STMT(hstmt, rc); rc = SQLExecDirect(hstmt, stmt, SQL_NTS); CHECK_STMT(hstmt, rc); rc = SQLBindCol(hstmt, 1, SQL_C_LONG, (SQLPOINTER) & R[0].deptnumb, 0, &R[0].deptnumb_l); CHECK_STMT(hstmt, rc); rc = SQLBindCol(hstmt, 2, SQL_C_CHAR, (SQLPOINTER) R[0].deptname, 15, &R[0].deptname_l); CHECK_STMT(hstmt, rc); rc = SQLBindCol(hstmt, 3, SQL_C_SSHORT, (SQLPOINTER) & R[0].id, 0, &R[0].id_l); CHECK_STMT(hstmt, rc); rc = SQLBindCol(hstmt, 4, SQL_C_CHAR, (SQLPOINTER) R[0].name, 10, &R[0].name_l); CHECK_STMT(hstmt, rc); /* Fetch ROWSET_SIZE rows at a time, and display */ printf("\nDEPTNUMB DEPTNAME ID NAME\n"); printf("-------- -------------- -------- ---------\n"); while ((rc = SQLExtendedFetch(hstmt, SQL_FETCH_NEXT, 0, &pcrow, Row_Stat)) == SQL_SUCCESS) { for (i = 0; i < pcrow; i++) { printf("%8ld %-14s %8d %-9s\n", R[i].deptnumb, R[i].deptname, R[i].id, R[i].name); } if (pcrow < ROWSET_SIZE) break; } /* endwhile */ if (rc != SQL_NO_DATA_FOUND && rc != SQL_SUCCESS) check_error(henv, hdbc, hstmt, rc, __LINE__, __FILE__); /* Free handles, commit, exit */ rc = SQLFreeStmt(hstmt, SQL_DROP); CHECK_STMT(hstmt, rc); rc = SQLTransact(henv, hdbc, SQL_COMMIT); CHECK_DBC(hdbc, rc); printf("\n>Disconnecting .....\n"); rc = SQLDisconnect(hdbc); CHECK_DBC(hdbc, rc); rc = SQLFreeConnect(hdbc); CHECK_DBC(hdbc, rc); rc = SQLFreeEnv(henv); if (rc != SQL_SUCCESS) return (terminate(henv, rc)); return (SQL_SUCCESS); } /* end main */