/*-------------------------------------------------------------------- EXAMPLE of an embedded SQL C Program for DB2. Connect to database c3421m for this. This APP takes one argument on the command line, a sailor's SID. It then finds the sailor SID's age out of the table ONE.SAILOR (in database c3421m) and reports it. A dumb and not very interesting APP, but it shows how things are done. P. Godfrey NOV 2002 --------------------------------------------------------------------*/ #include #include #include #include #include #include #define EXIT 0 #define NOEXIT 1 /*-------------------------------------------------------------------- Include DB2's SQL error reporting facility. --------------------------------------------------------------------*/ EXEC SQL INCLUDE SQLCA ; /*-------------------------------------------------------------------- Declare the SQL interface variables. --------------------------------------------------------------------*/ EXEC SQL BEGIN DECLARE SECTION ; short sage; short sid; char sname[16]; EXEC SQL END DECLARE SECTION ; /*-------------------------------------------------------------------- Declare variables to be used in the following C program. --------------------------------------------------------------------*/ char msg[1025]; int rc; int errcount; /*-------------------------------------------------------------------- This macro prints the message in the SQLCA if the return code is 0 and the SQLCODE is not 0. --------------------------------------------------------------------*/ #define PRINT_MESSAGE() \ { \ if (rc == 0 && sqlca.sqlcode != 0) \ { \ sqlaintp(msg, 1024, 0, &sqlca); \ printf("%s\n",msg); \ } \ } /*-------------------------------------------------------------------- This macro prints out all feilds in the SQLCA. --------------------------------------------------------------------*/ #define DUMP_SQLCA() \ { \ printf("********** DUMP OF SQLCA **********************\n"); \ printf("SQLCAID: %s\n", sqlca.sqlcaid); \ printf("SQLCABC: %d\n", sqlca.sqlcabc); \ printf("SQLCODE: %d\n", sqlca.sqlcode); \ printf("SQLERRML: %d\n", sqlca.sqlerrml); \ printf("SQLERRD[0]: %d\n", sqlca.sqlerrd[0]); \ printf("SQLERRD[1]: %d\n", sqlca.sqlerrd[1]); \ printf("SQLERRD[2]: %d\n", sqlca.sqlerrd[2]); \ printf("SQLERRD[3]: %d\n", sqlca.sqlerrd[3]); \ printf("SQLERRD[4]: %d\n", sqlca.sqlerrd[4]); \ printf("SQLERRD[5]: %d\n", sqlca.sqlerrd[5]); \ printf("SQLWARN: %s\n", sqlca.sqlwarn); \ printf("SQLSTATE: %s\n", sqlca.sqlstate); \ printf("********** END OF SQLCA DUMP *******************\n"); \ } /*-------------------------------------------------------------------- This macro prints the message in the SQLCA if one exists. If the return code is not 0 or the SQLCODE is not expected, an error occurred and must be recorded. --------------------------------------------------------------------*/ #define CHECK_SQL(code,text_string,eExit) \ { \ PRINT_MESSAGE(); \ if (rc != 0 || sqlca.sqlcode != code) { \ printf("%s\n",text_string); \ printf("Expected code = %d\n",code); \ if (rc == 0) { \ DUMP_SQLCA(); \ } \ else printf("RC: %d\n",rc); \ errcount += 1; \ if (eExit == EXIT) goto errorexit; \ } \ } /*-------------------------------------------------------------------- The PROGRAM. --------------------------------------------------------------------*/ main (int argc, char *argv[]) { /* Grab the first command argument. This is the SID. */ if (argc > 1) { sid = atoi(argv[1]); printf("SID requested is %d.\n", sid); /* If there is no arguement, bail. */ } else { printf("Which SID?\n"); exit(0); } EXEC SQL CONNECT TO C3421M; CHECK_SQL(0, "Connect failed", EXIT); /* Find the name and age of sailor SID. */ EXEC SQL SELECT SNAME, AGE into :sname, :sage FROM ONE.SAILOR WHERE sid = :sid; CHECK_SQL(0, "The SELECT query failed.", EXIT); /* Report the age. */ printf("Sailor %s's age is %d.\n", sname, sage); printf("Executed Successfuly\n") ; printf("Bye\n") ; errorexit: EXEC SQL CONNECT RESET; }