/******************************************************************************
**
** Source File Name = mrspcli3.sqc
**
** 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: This sample program demonstrates a stored procedures that return a result set.
**
** - This embedded SQL program calls the CLI function defined in clicall.c, which in
** turns calls the stored procedure on the server defined in mrspcli2.sqc.
** - Note: mrspcli3.sqc is NOT built in the makefile using the ALL
** command. To build this example you must copy util.c and util.h
** from the .../SAMPLES/C subdirectory. Once this is done you can
** use the make command: make mrspcli3
**
** 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 <stdlib.h>
#include <sql.h> /* :rk.1:erk. */
#include <sqlda.h>
#include <sqlca.h>
#include <string.h>
#ifdef DB268K
/* Need to include ASLM for 68K applications */
#include <LibraryManager.h>
#endif
#define CHECKERR(CE_STR) if (sql_error (CE_STR, &sqlca) != 0) return 1;
int sql_error (char eString[], struct sqlca *caPointer);
int callcli( char *, double*, short* );
int main(int argc, char *argv[]) {
EXEC SQL BEGIN DECLARE SECTION;
char database[9];
char userid[9];
char passwd[19];
/* Declare a Local Variable for Holding the Procedure's Name */
char procname[255] = "mrspsrv2";
/* Declare Local Variables for Holding Returned Data */
double sal = 0.0; /* :rk.3:erk. */
short salind = 0;
EXEC SQL END DECLARE SECTION;
/* Declare the output SQLDA */
struct sqlda *inout_sqlda = (struct sqlda *)
malloc(SQLDASIZE(1)); /* :rk.2:erk. */
/* Declare the SQLCA */
struct sqlca sqlca;
#ifdef DB268K
/* Before making any API calls for 68K environment,
need to initial the Library Manager */
InitLibraryManager(0,kCurrentZone,kNormalMemory);
atexit(CleanupLibraryManager);
#endif
if (argc != 4) {
printf ("\nUSAGE: mrspcli3 remote_database userid passwd\n\n");
return 1;
}
strcpy (database, argv[1]);
strcpy (userid, argv[2]);
strcpy (passwd, argv[3]);
/* Connect to Remote Database */
printf("CONNECT TO Remote Database.\n");
EXEC SQL CONNECT TO :database USER :userid USING :passwd;
CHECKERR ("CONNECT TO RSAMPLE");
printf("Use CLI to invoke the Server Procedure named outsrv\n");
salind = -1; /* Sal has no input, so set to null */
/*
* Don't execute as embedded, call CLI function instead
*
* EXEC SQL CALL :procname (:sal :salind);
* CHECKERR ("CALL WITH HOST VARIABLES");
*/
callcli( procname, &sal, &salind);
/* Disconnect from Remote Database */
EXEC SQL CONNECT RESET; /* :rk.7:erk. */
CHECKERR ("CONNECT RESET");
return 0;
}
int sql_error (char eString[], struct sqlca *caPointer) {
char eBuffer[1024];
char sBuffer[1024];
char message[1024];
char messToken[1024];
short rc, Erc;
int status=0;
if (caPointer->sqlcode != 0 && caPointer->sqlcode != 100) {
strcpy(message, "");
sprintf (messToken, "--- error report ---\n");
strcat(message, messToken);
sprintf (messToken, "ERROR occurred : %s.\nSQLCODE : %ld\n", eString,
caPointer->sqlcode);
strcat(message, messToken);
/**********************\
* GET SQLSTATE MESSAGE *
\**********************/
rc = sqlogstt (sBuffer, 1024, 80, caPointer->SQLSTATE);
/******************************\
* GET ERROR MESSAGE API called *
\******************************/
Erc = sqlaintp (eBuffer, 1024, 80, caPointer);
/* return code is the length of the eBuffer string */
if (Erc > 0)
{ sprintf (messToken, "%s", eBuffer);
strcat(message, messToken);
}
if (caPointer->sqlcode < 0)
{ if (rc == 0)
{ sprintf (messToken, "\n%s", sBuffer);
strcat(message, messToken);
}
sprintf (messToken, "--- end error report ---\n");
strcat(message, messToken);
printf("%s", message);
return 1;
}
else
{ /* errorCode is just a Warning message */
if (rc == 0)
{ sprintf (messToken, "\n%s", sBuffer);
strcat(message, messToken);
}
sprintf (messToken, "--- end error report ---\n");
strcat(message, messToken);
sprintf (messToken, "WARNING - CONTINUING PROGRAM WITH WARNINGS!\n");
strcat(message, messToken);
printf("%s", message);
return 0;
} /* endif */
} /* endif */
return 0;
}