// // Source File Name = cursor.sqC // // Licensed Materials - Property of IBM // // (C) COPYRIGHT International Business Machines Corp. 1995, 2000 // All Rights Reserved. // // US Government Users Restricted Rights - Use, duplication or // disclosure restricted by GSA ADP Schedule Contract with IBM Corp. // // // PURPOSE: This sample program demonstrates the use of a CURSOR. // The CURSOR is processed using static SQL. This program // obtains all managers in the STAFF table of the // SAMPLE database. // // The file "utilemb.sqC" contains functions for error-checking and // rolling back a transaction in case of error. This file must be // compiled and its object file linked in to the "cursor" program. // // EXTERNAL DEPENDENCIES : // - Existing database for precompile purposes. // - Precompile with the SQL precompiler (PREP in DB2) // - Binding to a database (BIND in DB2) // - Compiling and linking with the IBM Cset++ compiler (AIX and OS/2) // or the Microsoft Visual C++ compiler (Windows) // or the compiler supported on your platform. // // For more information about these samples see the README file. // // For more information on programming in C++, see the // - "Programming in C and C++" section of the Application Development Guide // // For more information on Building C++ Applications, see the: // - "Building C++ Applications" section of the Application Building Guide. // // For more information on the SQL language see the SQL Reference. #include <iostream.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <sqlca.h> #include "utilemb.h" EXEC SQL INCLUDE SQLCA; class Cursor { public: Fetch (); private: EXEC SQL BEGIN DECLARE SECTION; char pname[10]; short dept; EXEC SQL END DECLARE SECTION; }; class CNT { public: void Connect(); void Connect(char *, char *); void Disconnect(); private: EXEC SQL BEGIN DECLARE SECTION; char userid[9]; char passwd[19]; EXEC SQL END DECLARE SECTION; }; void CNT::Connect () { cout <<"Connecting to database SAMPLE with default userid and password\n"; EXEC SQL CONNECT TO sample; EMB_SQL_CHECK("CONNECT TO SAMPLE") ; cout << "Connected to database SAMPLE \n"; } void CNT::Connect (char *uid, char *pswd) { strcpy (userid, uid); strcpy (passwd, pswd); cout << "Connecting to database SAMPLE... \n"; EXEC SQL CONNECT TO sample USER :userid USING :passwd; EMB_SQL_CHECK("CONNECT TO SAMPLE") ; cout << "Connected to database SAMPLE \n"; } void CNT::Disconnect () { // Disconnect from Remote Database cout << "Disconnecting from database SAMPLE... \n"; EXEC SQL CONNECT RESET; EMB_SQL_CHECK("CONNECT RESET"); cout << "Disconnected from database SAMPLE \n"; } Cursor::Fetch () { EXEC SQL DECLARE c1 CURSOR FOR SELECT name, dept FROM staff WHERE job='Mgr'; EMB_SQL_CHECK("DECLARE CURSOR") ; EXEC SQL OPEN c1; EMB_SQL_CHECK("OPEN CURSOR") ; cout << endl; do { EXEC SQL FETCH c1 INTO :pname, :dept; if (SQLCODE != 0) break; cout << pname << " in dept. " << dept << " is a manager\n"; } while ( 1 ); EXEC SQL CLOSE c1; EMB_SQL_CHECK("CLOSE CURSOR") ; return 0; } int main(int argc, char *argv[]) { cout << "Sample C++ program: CURSOR \n"; CNT cnt; Cursor doit; if (argc == 1) { cnt.Connect(); } else if (argc == 3) { cnt.Connect (argv[1], argv[2]); } else { cout << "\nUSAGE: cursor userid passwd\n\n"; } // end if doit.Fetch(); return 0; } // end of program : cursor.sqC