www.pudn.com > dynamicsql.rar > TestAllMethods.c


 
/* Result Sets Interface */ 
#ifndef SQL_CRSR 
#  define SQL_CRSR 
  struct sql_cursor 
  { 
    unsigned int curocn; 
    void *ptr1; 
    void *ptr2; 
    unsigned long magic; 
  }; 
  typedef struct sql_cursor sql_cursor; 
  typedef struct sql_cursor SQL_CURSOR; 
#endif /* SQL_CRSR */ 
 
/* Thread Safety */ 
typedef void * sql_context; 
typedef void * SQL_CONTEXT; 
 
/* Object support */ 
struct sqltvn 
{ 
  unsigned char *tvnvsn;  
  unsigned short tvnvsnl;  
  unsigned char *tvnnm; 
  unsigned short tvnnml;  
  unsigned char *tvnsnm; 
  unsigned short tvnsnml; 
}; 
typedef struct sqltvn sqltvn; 
 
struct sqladts 
{ 
  unsigned int adtvsn;  
  unsigned short adtmode;  
  unsigned short adtnum;   
  sqltvn adttvn[1];        
}; 
typedef struct sqladts sqladts; 
 
static struct sqladts sqladt = { 
  1,1,0, 
}; 
 
/* Binding to PL/SQL Records */ 
struct sqltdss 
{ 
  unsigned int tdsvsn;  
  unsigned short tdsnum;  
  unsigned char *tdsval[1];  
}; 
typedef struct sqltdss sqltdss; 
static struct sqltdss sqltds = 
{ 
  1, 
  0, 
}; 
 
/* File name & Package Name */ 
struct sqlcxp 
{ 
  unsigned short fillen; 
           char  filnam[18]; 
}; 
static struct sqlcxp sqlfpn = 
{ 
    17, 
    "TestAllMethods.pc" 
}; 
 
 
static unsigned long sqlctx = 10390867; 
 
 
static struct sqlexd { 
   unsigned int   sqlvsn; 
   unsigned int   arrsiz; 
   unsigned int   iters; 
   unsigned int   offset; 
   unsigned short selerr; 
   unsigned short sqlety; 
   unsigned int   occurs; 
            short *cud; 
   unsigned char  *sqlest; 
            char  *stmt; 
   sqladts *sqladtp; 
   sqltdss *sqltdsp; 
            void  **sqphsv; 
   unsigned int   *sqphsl; 
            int   *sqphss; 
            void  **sqpind; 
            int   *sqpins; 
   unsigned int   *sqparm; 
   unsigned int   **sqparc; 
   unsigned short  *sqpadto; 
   unsigned short  *sqptdso; 
            void  *sqhstv[4]; 
   unsigned int   sqhstl[4]; 
            int   sqhsts[4]; 
            void  *sqindv[4]; 
            int   sqinds[4]; 
   unsigned int   sqharm[4]; 
   unsigned int   *sqharc[4]; 
   unsigned short  sqadto[4]; 
   unsigned short  sqtdso[4]; 
} sqlstm = {10,4}; 
 
/* SQLLIB Prototypes */ 
extern sqlcxt (/*_ void **, unsigned long *, 
                   struct sqlexd *, struct sqlcxp * _*/); 
extern sqlcx2t(/*_ void **, unsigned long *, 
                   struct sqlexd *, struct sqlcxp * _*/); 
extern sqlbuft(/*_ void **, char * _*/); 
extern sqlgs2t(/*_ void **, char * _*/); 
extern sqlorat(/*_ void **, unsigned long *, void * _*/); 
 
/* Forms Interface */ 
static int IAPSUCC = 0; 
static int IAPFAIL = 1403; 
static int IAPFTL  = 535; 
extern void sqliem(/*_ char *, int * _*/); 
 
typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR; 
typedef struct { unsigned short len; unsigned char arr[1]; } varchar; 
 
/* CUD (Compilation Unit Data) Array */ 
static short sqlcud0[] = 
{10,4130,0,0,0, 
5,0,0,1,0,0,27,56,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,10,0,0, 
36,0,0,2,0,0,30,66,0,0,0,0,0,1,0, 
51,0,0,3,0,0,32,73,0,0,0,0,0,1,0, 
66,0,0,4,0,0,32,78,0,0,0,0,0,1,0, 
81,0,0,5,0,0,24,103,0,0,1,1,0,1,0,1,97,0,0, 
100,0,0,6,0,0,31,108,0,0,0,0,0,1,0, 
115,0,0,7,0,0,29,111,0,0,0,0,0,1,0, 
130,0,0,8,0,0,17,128,0,0,1,1,0,1,0,1,97,0,0, 
149,0,0,8,0,0,21,141,0,0,3,3,0,1,0,1,3,0,0,1,3,0,0,1,3,0,0, 
176,0,0,9,0,0,31,145,0,0,0,0,0,1,0, 
191,0,0,10,0,0,29,150,0,0,0,0,0,1,0, 
206,0,0,11,0,0,17,171,0,0,1,1,0,1,0,1,97,0,0, 
225,0,0,11,0,0,45,183,0,0,1,1,0,1,0,1,3,0,0, 
244,0,0,11,0,0,13,189,0,0,4,0,0,1,0,2,97,0,0,2,97,0,0,2,97,0,0,2,97,0,0, 
275,0,0,11,0,0,15,193,0,0,0,0,0,1,0, 
290,0,0,12,0,0,31,198,0,0,0,0,0,1,0, 
305,0,0,13,0,0,29,203,0,0,0,0,0,1,0, 
320,0,0,14,0,0,17,255,0,0,1,1,0,1,0,1,97,0,0, 
339,0,0,14,0,0,19,259,0,0,1,1,0,1,0,3,32,0,0, 
358,0,0,14,0,0,11,302,0,0,1,1,0,1,0,1,32,0,0, 
377,0,0,14,0,0,15,317,0,0,0,0,0,1,0, 
392,0,0,15,0,0,30,318,0,0,0,0,0,1,0, 
407,0,0,16,0,0,31,368,0,0,0,0,0,1,0, 
422,0,0,14,0,0,20,379,0,0,1,1,0,1,0,3,32,0,0, 
441,0,0,14,0,0,14,469,0,0,1,0,0,1,0,2,32,0,0, 
}; 
 
 
/***********************************************************  
 * TestAllMethods.pc  
 * created by Caoqing on 2003.12.24  
 *  
 * This project is used to realize dynamic sql statments used      
 * four methods.  
 *    
 *    
 *  
 ************************************************************/  
  
#include   
#include   
#include   
#include   
  
#include   
#include   
#include   
  
/* EXEC SQL INCLUDE sqlca;  
 */  
/* 
 * $Header: sqlca.h,v 1.3 1994/12/12 19:27:27 jbasu Exp $ sqlca.h  
 */ 
 
/* Copyright (c) 1985,1986, 1998 by Oracle Corporation. */ 
  
/* 
NAME 
  SQLCA : SQL Communications Area. 
FUNCTION 
  Contains no code. Oracle fills in the SQLCA with status info 
  during the execution of a SQL stmt. 
NOTES 
  ************************************************************** 
  ***                                                        *** 
  *** This file is SOSD.  Porters must change the data types *** 
  *** appropriately on their platform.  See notes/pcport.doc *** 
  *** for more information.                                  *** 
  ***                                                        *** 
  ************************************************************** 
 
  If the symbol SQLCA_STORAGE_CLASS is defined, then the SQLCA 
  will be defined to have this storage class. For example: 
  
    #define SQLCA_STORAGE_CLASS extern 
  
  will define the SQLCA as an extern. 
  
  If the symbol SQLCA_INIT is defined, then the SQLCA will be 
  statically initialized. Although this is not necessary in order 
  to use the SQLCA, it is a good pgming practice not to have 
  unitialized variables. However, some C compilers/OS's don't 
  allow automatic variables to be init'd in this manner. Therefore, 
  if you are INCLUDE'ing the SQLCA in a place where it would be 
  an automatic AND your C compiler/OS doesn't allow this style 
  of initialization, then SQLCA_INIT should be left undefined -- 
  all others can define SQLCA_INIT if they wish. 
 
  If the symbol SQLCA_NONE is defined, then the SQLCA variable will 
  not be defined at all.  The symbol SQLCA_NONE should not be defined 
  in source modules that have embedded SQL.  However, source modules 
  that have no embedded SQL, but need to manipulate a sqlca struct 
  passed in as a parameter, can set the SQLCA_NONE symbol to avoid 
  creation of an extraneous sqlca variable. 
  
MODIFIED 
    lvbcheng   07/31/98 -  long to int 
    jbasu      12/12/94 -  Bug 217878: note this is an SOSD file 
    losborne   08/11/92 -  No sqlca var if SQLCA_NONE macro set  
  Clare      12/06/84 - Ch SQLCA to not be an extern. 
  Clare      10/21/85 - Add initialization. 
  Bradbury   01/05/86 - Only initialize when SQLCA_INIT set 
  Clare      06/12/86 - Add SQLCA_STORAGE_CLASS option. 
*/ 
  
#ifndef SQLCA 
#define SQLCA 1 
  
struct   sqlca 
         { 
         /* ub1 */ char    sqlcaid[8]; 
         /* b4  */ int     sqlabc; 
         /* b4  */ int     sqlcode; 
         struct 
           { 
           /* ub2 */ unsigned short sqlerrml; 
           /* ub1 */ char           sqlerrmc[70]; 
           } sqlerrm; 
         /* ub1 */ char    sqlerrp[8]; 
         /* b4  */ int     sqlerrd[6]; 
         /* ub1 */ char    sqlwarn[8]; 
         /* ub1 */ char    sqlext[8]; 
         }; 
 
#ifndef SQLCA_NONE  
#ifdef   SQLCA_STORAGE_CLASS 
SQLCA_STORAGE_CLASS struct sqlca sqlca 
#else 
         struct sqlca sqlca 
#endif 
  
#ifdef  SQLCA_INIT 
         = { 
         {'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '}, 
         sizeof(struct sqlca), 
         0, 
         { 0, {0}}, 
         {'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '}, 
         {0, 0, 0, 0, 0, 0}, 
         {0, 0, 0, 0, 0, 0, 0, 0}, 
         {0, 0, 0, 0, 0, 0, 0, 0} 
         } 
#endif 
         ; 
#endif 
  
#endif 
  
/* end SQLCA */ 
/* EXEC SQL INCLUDE sqlda;   
 */  
/* 
 * $Header: sqlda.h 31-jul-99.19:34:41 apopat Exp $ sqlda.h  
 */ 
 
/*************************************************************** 
*      The SQLDA descriptor definition                         * 
*--------------------------------------------------------------* 
*      VAX/3B Version                                          * 
*                                                              * 
*  Copyright (c) 1987, 1997, 1998, 1999 by Oracle Corporation                    * 
***************************************************************/ 
 
 
/* NOTES 
  ************************************************************** 
  ***                                                        *** 
  *** This file is SOSD.  Porters must change the data types *** 
  *** appropriately on their platform.  See notes/pcport.doc *** 
  *** for more information.                                  *** 
  ***                                                        *** 
  ************************************************************** 
*/ 
 
/*  MODIFIED 
    apopat     07/31/99 -  [707588] TAB to blanks for OCCS 
    lvbcheng   10/27/98 -  change long to int for sqlda 
    lvbcheng   08/15/97 -  Move sqlda protos to sqlcpr.h 
    lvbcheng   06/25/97 -  Move sqlda protos to this file 
    jbasu      01/29/95 -  correct typo 
    jbasu      01/27/95 -  correct comment - ub2->sb2 
    jbasu      12/12/94 - Bug 217878: note this is an SOSD file 
    Morse      12/01/87 - undef L and S for v6 include files 
    Richey     07/13/87 - change int defs to long  
    Clare      09/13/84 - Port: Ch types to match SQLLIB structs 
    Clare      10/02/86 - Add ifndef SQLDA 
*/ 
 
#ifndef SQLDA_ 
#define SQLDA_ 1 
  
#ifdef T 
# undef T 
#endif 
#ifdef F 
# undef F 
#endif 
 
#ifdef S 
# undef S 
#endif 
#ifdef L 
# undef L 
#endif 
  
struct SQLDA { 
  /* ub4    */ int        N; /* Descriptor size in number of entries        */ 
  /* text** */ char     **V; /* Ptr to Arr of addresses of main variables   */ 
  /* ub4*   */ int       *L; /* Ptr to Arr of lengths of buffers            */ 
  /* sb2*   */ short     *T; /* Ptr to Arr of types of buffers              */ 
  /* sb2**  */ short    **I; /* Ptr to Arr of addresses of indicator vars   */ 
  /* sb4    */ int        F; /* Number of variables found by DESCRIBE       */ 
  /* text** */ char     **S; /* Ptr to Arr of variable name pointers        */ 
  /* ub2*   */ short     *M; /* Ptr to Arr of max lengths of var. names     */ 
  /* ub2*   */ short     *C; /* Ptr to Arr of current lengths of var. names */ 
  /* text** */ char     **X; /* Ptr to Arr of ind. var. name pointers       */ 
  /* ub2*   */ short     *Y; /* Ptr to Arr of max lengths of ind. var. names */ 
  /* ub2*   */ short     *Z; /* Ptr to Arr of cur lengths of ind. var. names */ 
  }; 
  
typedef struct SQLDA SQLDA; 
  
#endif 
 
/* ----------------- */ 
/* defines for sqlda */ 
/* ----------------- */ 
 
#define SQLSQLDAAlloc(arg1, arg2, arg3, arg4) sqlaldt(arg1, arg2, arg3, arg4)  
 
#define SQLSQLDAFree(arg1, arg2) sqlclut(arg1, arg2)  
 
 
 
/*  */  
/* 
 * $Header: sqlca.h,v 1.3 1994/12/12 19:27:27 jbasu Exp $ sqlca.h  
 */ 
 
/* Copyright (c) 1985,1986, 1998 by Oracle Corporation. */ 
  
/* 
NAME 
  SQLCA : SQL Communications Area. 
FUNCTION 
  Contains no code. Oracle fills in the SQLCA with status info 
  during the execution of a SQL stmt. 
NOTES 
  ************************************************************** 
  ***                                                        *** 
  *** This file is SOSD.  Porters must change the data types *** 
  *** appropriately on their platform.  See notes/pcport.doc *** 
  *** for more information.                                  *** 
  ***                                                        *** 
  ************************************************************** 
 
  If the symbol SQLCA_STORAGE_CLASS is defined, then the SQLCA 
  will be defined to have this storage class. For example: 
  
    #define SQLCA_STORAGE_CLASS extern 
  
  will define the SQLCA as an extern. 
  
  If the symbol SQLCA_INIT is defined, then the SQLCA will be 
  statically initialized. Although this is not necessary in order 
  to use the SQLCA, it is a good pgming practice not to have 
  unitialized variables. However, some C compilers/OS's don't 
  allow automatic variables to be init'd in this manner. Therefore, 
  if you are INCLUDE'ing the SQLCA in a place where it would be 
  an automatic AND your C compiler/OS doesn't allow this style 
  of initialization, then SQLCA_INIT should be left undefined -- 
  all others can define SQLCA_INIT if they wish. 
 
  If the symbol SQLCA_NONE is defined, then the SQLCA variable will 
  not be defined at all.  The symbol SQLCA_NONE should not be defined 
  in source modules that have embedded SQL.  However, source modules 
  that have no embedded SQL, but need to manipulate a sqlca struct 
  passed in as a parameter, can set the SQLCA_NONE symbol to avoid 
  creation of an extraneous sqlca variable. 
  
MODIFIED 
    lvbcheng   07/31/98 -  long to int 
    jbasu      12/12/94 -  Bug 217878: note this is an SOSD file 
    losborne   08/11/92 -  No sqlca var if SQLCA_NONE macro set  
  Clare      12/06/84 - Ch SQLCA to not be an extern. 
  Clare      10/21/85 - Add initialization. 
  Bradbury   01/05/86 - Only initialize when SQLCA_INIT set 
  Clare      06/12/86 - Add SQLCA_STORAGE_CLASS option. 
*/ 
  
#ifndef SQLCA 
#define SQLCA 1 
  
struct   sqlca 
         { 
         /* ub1 */ char    sqlcaid[8]; 
         /* b4  */ int     sqlabc; 
         /* b4  */ int     sqlcode; 
         struct 
           { 
           /* ub2 */ unsigned short sqlerrml; 
           /* ub1 */ char           sqlerrmc[70]; 
           } sqlerrm; 
         /* ub1 */ char    sqlerrp[8]; 
         /* b4  */ int     sqlerrd[6]; 
         /* ub1 */ char    sqlwarn[8]; 
         /* ub1 */ char    sqlext[8]; 
         }; 
 
#ifndef SQLCA_NONE  
#ifdef   SQLCA_STORAGE_CLASS 
SQLCA_STORAGE_CLASS struct sqlca sqlca 
#else 
         struct sqlca sqlca 
#endif 
  
#ifdef  SQLCA_INIT 
         = { 
         {'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '}, 
         sizeof(struct sqlca), 
         0, 
         { 0, {0}}, 
         {'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '}, 
         {0, 0, 0, 0, 0, 0}, 
         {0, 0, 0, 0, 0, 0, 0, 0}, 
         {0, 0, 0, 0, 0, 0, 0, 0} 
         } 
#endif 
         ; 
#endif 
  
#endif 
  
/* end SQLCA */ 
/*  */  
/* 
 * $Header: sqlda.h 31-jul-99.19:34:41 apopat Exp $ sqlda.h  
 */ 
 
/*************************************************************** 
*      The SQLDA descriptor definition                         * 
*--------------------------------------------------------------* 
*      VAX/3B Version                                          * 
*                                                              * 
*  Copyright (c) 1987, 1997, 1998, 1999 by Oracle Corporation                    * 
***************************************************************/ 
 
 
/* NOTES 
  ************************************************************** 
  ***                                                        *** 
  *** This file is SOSD.  Porters must change the data types *** 
  *** appropriately on their platform.  See notes/pcport.doc *** 
  *** for more information.                                  *** 
  ***                                                        *** 
  ************************************************************** 
*/ 
 
/*  MODIFIED 
    apopat     07/31/99 -  [707588] TAB to blanks for OCCS 
    lvbcheng   10/27/98 -  change long to int for sqlda 
    lvbcheng   08/15/97 -  Move sqlda protos to sqlcpr.h 
    lvbcheng   06/25/97 -  Move sqlda protos to this file 
    jbasu      01/29/95 -  correct typo 
    jbasu      01/27/95 -  correct comment - ub2->sb2 
    jbasu      12/12/94 - Bug 217878: note this is an SOSD file 
    Morse      12/01/87 - undef L and S for v6 include files 
    Richey     07/13/87 - change int defs to long  
    Clare      09/13/84 - Port: Ch types to match SQLLIB structs 
    Clare      10/02/86 - Add ifndef SQLDA 
*/ 
 
#ifndef SQLDA_ 
#define SQLDA_ 1 
  
#ifdef T 
# undef T 
#endif 
#ifdef F 
# undef F 
#endif 
 
#ifdef S 
# undef S 
#endif 
#ifdef L 
# undef L 
#endif 
  
struct SQLDA { 
  /* ub4    */ int        N; /* Descriptor size in number of entries        */ 
  /* text** */ char     **V; /* Ptr to Arr of addresses of main variables   */ 
  /* ub4*   */ int       *L; /* Ptr to Arr of lengths of buffers            */ 
  /* sb2*   */ short     *T; /* Ptr to Arr of types of buffers              */ 
  /* sb2**  */ short    **I; /* Ptr to Arr of addresses of indicator vars   */ 
  /* sb4    */ int        F; /* Number of variables found by DESCRIBE       */ 
  /* text** */ char     **S; /* Ptr to Arr of variable name pointers        */ 
  /* ub2*   */ short     *M; /* Ptr to Arr of max lengths of var. names     */ 
  /* ub2*   */ short     *C; /* Ptr to Arr of current lengths of var. names */ 
  /* text** */ char     **X; /* Ptr to Arr of ind. var. name pointers       */ 
  /* ub2*   */ short     *Y; /* Ptr to Arr of max lengths of ind. var. names */ 
  /* ub2*   */ short     *Z; /* Ptr to Arr of cur lengths of ind. var. names */ 
  }; 
  
typedef struct SQLDA SQLDA; 
  
#endif 
 
/* ----------------- */ 
/* defines for sqlda */ 
/* ----------------- */ 
 
#define SQLSQLDAAlloc(arg1, arg2, arg3, arg4) sqlaldt(arg1, arg2, arg3, arg4)  
 
#define SQLSQLDAFree(arg1, arg2) sqlclut(arg1, arg2)  
 
 
 
 
  
#define MAX_SELECT_ITEMS 40  
#define MAX_VNAME_LEN 64  
#define MAX_INAME_LEN 64  
  
typedef struct  
{  
	int precision;  
	int scale;  
}SELDA_LEN;  
  
jmp_buf restore_err;  
  
void testMethod1();  
void testMethod2();  
void testMethod3();  
void testMethod4();  
void AllocateDescriptors(SQLDA * sel_desc, SQLDA * bind_desc, int maxsize);  
void UnAllocateDescriptors(SQLDA * sel_desc, SQLDA * bind_desc, int maxsize);  
short getInputStmt(char * stmtarr);  
void errorProc();  
void QueryProcess(SQLDA * sel_desc, SQLDA * bind_desc);  
  
main()  
{  
/* EXEC SQL BEGIN DECLARE SECTION; */  
  
	char username[15] = "schoolfee";  
	char passwd[15] = "school";  
	char dbstring[25] = "syntong";	  
/* EXEC SQL END DECLARE SECTION; */  
  
  
	/* Connect database. */  
	/* EXEC SQL WHENEVER SQLERROR GOTO conn_err; */  
  
	/* EXEC SQL CONNECT :username IDENTIFIED BY :passwd USING :dbstring; */  
 
{ 
 struct sqlexd sqlstm; 
 sqlstm.sqlvsn = 10; 
 sqlstm.arrsiz = 4; 
 sqlstm.sqladtp = &sqladt; 
 sqlstm.sqltdsp = &sqltds; 
 sqlstm.iters = (unsigned int  )10; 
 sqlstm.offset = (unsigned int  )5; 
 sqlstm.cud = sqlcud0; 
 sqlstm.sqlest = (unsigned char  *)&sqlca; 
 sqlstm.sqlety = (unsigned short)256; 
 sqlstm.occurs = (unsigned int  )0; 
 sqlstm.sqhstv[0] = (         void  *)username; 
 sqlstm.sqhstl[0] = (unsigned int  )15; 
 sqlstm.sqhsts[0] = (         int  )15; 
 sqlstm.sqindv[0] = (         void  *)0; 
 sqlstm.sqinds[0] = (         int  )0; 
 sqlstm.sqharm[0] = (unsigned int  )0; 
 sqlstm.sqadto[0] = (unsigned short )0; 
 sqlstm.sqtdso[0] = (unsigned short )0; 
 sqlstm.sqhstv[1] = (         void  *)passwd; 
 sqlstm.sqhstl[1] = (unsigned int  )15; 
 sqlstm.sqhsts[1] = (         int  )15; 
 sqlstm.sqindv[1] = (         void  *)0; 
 sqlstm.sqinds[1] = (         int  )0; 
 sqlstm.sqharm[1] = (unsigned int  )0; 
 sqlstm.sqadto[1] = (unsigned short )0; 
 sqlstm.sqtdso[1] = (unsigned short )0; 
 sqlstm.sqhstv[2] = (         void  *)dbstring; 
 sqlstm.sqhstl[2] = (unsigned int  )25; 
 sqlstm.sqhsts[2] = (         int  )25; 
 sqlstm.sqindv[2] = (         void  *)0; 
 sqlstm.sqinds[2] = (         int  )0; 
 sqlstm.sqharm[2] = (unsigned int  )0; 
 sqlstm.sqadto[2] = (unsigned short )0; 
 sqlstm.sqtdso[2] = (unsigned short )0; 
 sqlstm.sqphsv = sqlstm.sqhstv; 
 sqlstm.sqphsl = sqlstm.sqhstl; 
 sqlstm.sqphss = sqlstm.sqhsts; 
 sqlstm.sqpind = sqlstm.sqindv; 
 sqlstm.sqpins = sqlstm.sqinds; 
 sqlstm.sqparm = sqlstm.sqharm; 
 sqlstm.sqparc = sqlstm.sqharc; 
 sqlstm.sqpadto = sqlstm.sqadto; 
 sqlstm.sqptdso = sqlstm.sqtdso; 
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
 if (sqlca.sqlcode < 0) goto conn_err; 
} 
 
  
	printf("connect success.\n");  
  
	/* EXEC SQL WHENEVER SQLERROR CONTINUE; */  
  
	  
	testMethod1();  
	testMethod2();  
	testMethod3();  
	testMethod4();  
  
	/* EXEC SQL COMMIT RELEASE; */  
 
{ 
 struct sqlexd sqlstm; 
 sqlstm.sqlvsn = 10; 
 sqlstm.arrsiz = 4; 
 sqlstm.sqladtp = &sqladt; 
 sqlstm.sqltdsp = &sqltds; 
 sqlstm.iters = (unsigned int  )1; 
 sqlstm.offset = (unsigned int  )36; 
 sqlstm.cud = sqlcud0; 
 sqlstm.sqlest = (unsigned char  *)&sqlca; 
 sqlstm.sqlety = (unsigned short)256; 
 sqlstm.occurs = (unsigned int  )0; 
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
	printf("Testing is Ok.\n");  
	exit(0);  
		  
conn_err:  
	printf("connect database failed!\n");  
	/* EXEC SQL WHENEVER SQLERROR CONTINUE; */  
  
	/* EXEC SQL ROLLBACK RELEASE; */  
 
{ 
 struct sqlexd sqlstm; 
 sqlstm.sqlvsn = 10; 
 sqlstm.arrsiz = 4; 
 sqlstm.sqladtp = &sqladt; 
 sqlstm.sqltdsp = &sqltds; 
 sqlstm.iters = (unsigned int  )1; 
 sqlstm.offset = (unsigned int  )51; 
 sqlstm.cud = sqlcud0; 
 sqlstm.sqlest = (unsigned char  *)&sqlca; 
 sqlstm.sqlety = (unsigned short)256; 
 sqlstm.occurs = (unsigned int  )0; 
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
	exit(1);  
sql_err:  
	printf("implements sql statements failed!\n");  
	/* EXEC SQL WHENEVER SQLERROR CONTINUE; */  
  
	/* EXEC SQL ROLLBACK RELEASE; */  
 
{ 
 struct sqlexd sqlstm; 
 sqlstm.sqlvsn = 10; 
 sqlstm.arrsiz = 4; 
 sqlstm.sqladtp = &sqladt; 
 sqlstm.sqltdsp = &sqltds; 
 sqlstm.iters = (unsigned int  )1; 
 sqlstm.offset = (unsigned int  )66; 
 sqlstm.cud = sqlcud0; 
 sqlstm.sqlest = (unsigned char  *)&sqlca; 
 sqlstm.sqlety = (unsigned short)256; 
 sqlstm.occurs = (unsigned int  )0; 
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
	exit(1);  
}  
  
void testMethod1()  
{  
	/* EXEC SQL BEGIN DECLARE SECTION; */  
  
		char sqlstmt1[1024];  
	/* EXEC SQL END DECLARE SECTION; */  
  
	int opt,ch;  
	int i;  
  
	printf("Please input e exit the test method 1,input others continue.\n");  
	fflush(stdin);  
	while((opt = getchar()) != 'e')  
	{		  
		fflush(stdin);  
		printf("please input sql statement for dynamic method1:\n");  
		memset(sqlstmt1, 0, sizeof(sqlstmt1));  
		for(i = 0; (i < 1024) && ((ch=getchar()) != EOF) && (ch != '\n'); i++)  
			sqlstmt1[i] = ch;  
  
		/* implements operation. */  
		printf("start run sql :%s.\n",sqlstmt1);  
		  
		/* EXEC SQL EXECUTE IMMEDIATE :sqlstmt1; */  
 
{ 
  struct sqlexd sqlstm; 
  sqlstm.sqlvsn = 10; 
  sqlstm.arrsiz = 4; 
  sqlstm.sqladtp = &sqladt; 
  sqlstm.sqltdsp = &sqltds; 
  sqlstm.stmt = ""; 
  sqlstm.iters = (unsigned int  )1; 
  sqlstm.offset = (unsigned int  )81; 
  sqlstm.cud = sqlcud0; 
  sqlstm.sqlest = (unsigned char  *)&sqlca; 
  sqlstm.sqlety = (unsigned short)256; 
  sqlstm.occurs = (unsigned int  )0; 
  sqlstm.sqhstv[0] = (         void  *)sqlstmt1; 
  sqlstm.sqhstl[0] = (unsigned int  )1024; 
  sqlstm.sqhsts[0] = (         int  )0; 
  sqlstm.sqindv[0] = (         void  *)0; 
  sqlstm.sqinds[0] = (         int  )0; 
  sqlstm.sqharm[0] = (unsigned int  )0; 
  sqlstm.sqadto[0] = (unsigned short )0; 
  sqlstm.sqtdso[0] = (unsigned short )0; 
  sqlstm.sqphsv = sqlstm.sqhstv; 
  sqlstm.sqphsl = sqlstm.sqhstl; 
  sqlstm.sqphss = sqlstm.sqhsts; 
  sqlstm.sqpind = sqlstm.sqindv; 
  sqlstm.sqpins = sqlstm.sqinds; 
  sqlstm.sqparm = sqlstm.sqharm; 
  sqlstm.sqparc = sqlstm.sqharc; 
  sqlstm.sqpadto = sqlstm.sqadto; 
  sqlstm.sqptdso = sqlstm.sqtdso; 
  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
		if (sqlca.sqlcode < 0)  
		{  
			printf("%70s\n", sqlca.sqlerrm.sqlerrmc);  
			printf("Implement sql failed!\n");  
			/* EXEC SQL ROLLBACK; */  
 
{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 4; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )100; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
		}		  
		printf("Implement Success.affective %d recordsets.\n", sqlca.sqlerrd[2]);  
		/* EXEC SQL COMMIT; */  
 
{ 
  struct sqlexd sqlstm; 
  sqlstm.sqlvsn = 10; 
  sqlstm.arrsiz = 4; 
  sqlstm.sqladtp = &sqladt; 
  sqlstm.sqltdsp = &sqltds; 
  sqlstm.iters = (unsigned int  )1; 
  sqlstm.offset = (unsigned int  )115; 
  sqlstm.cud = sqlcud0; 
  sqlstm.sqlest = (unsigned char  *)&sqlca; 
  sqlstm.sqlety = (unsigned short)256; 
  sqlstm.occurs = (unsigned int  )0; 
  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
  
		fflush(stdin);  
		printf("Please input e exit the test method 1,input others continue.\n");  
	}  
}  
  
void testMethod2()  
{  
	/* EXEC SQL BEGIN DECLARE SECTION; */  
  
		char sqlstmt2[1024];  
		int ccode, dcode, ecode;  
	/* EXEC SQL END DECLARE SECTION; */  
  
  
	int opt;  
  
	strcpy(sqlstmt2, "update employee set ccode=:v1, dcode=:v2 where ecode=:v3");  
	/* EXEC SQL PREPARE UPDATE_EMPLOYEE FROM :sqlstmt2; */  
 
{ 
 struct sqlexd sqlstm; 
 sqlstm.sqlvsn = 10; 
 sqlstm.arrsiz = 4; 
 sqlstm.sqladtp = &sqladt; 
 sqlstm.sqltdsp = &sqltds; 
 sqlstm.stmt = ""; 
 sqlstm.iters = (unsigned int  )1; 
 sqlstm.offset = (unsigned int  )130; 
 sqlstm.cud = sqlcud0; 
 sqlstm.sqlest = (unsigned char  *)&sqlca; 
 sqlstm.sqlety = (unsigned short)256; 
 sqlstm.occurs = (unsigned int  )0; 
 sqlstm.sqhstv[0] = (         void  *)sqlstmt2; 
 sqlstm.sqhstl[0] = (unsigned int  )1024; 
 sqlstm.sqhsts[0] = (         int  )0; 
 sqlstm.sqindv[0] = (         void  *)0; 
 sqlstm.sqinds[0] = (         int  )0; 
 sqlstm.sqharm[0] = (unsigned int  )0; 
 sqlstm.sqadto[0] = (unsigned short )0; 
 sqlstm.sqtdso[0] = (unsigned short )0; 
 sqlstm.sqphsv = sqlstm.sqhstv; 
 sqlstm.sqphsl = sqlstm.sqhstl; 
 sqlstm.sqphss = sqlstm.sqhsts; 
 sqlstm.sqpind = sqlstm.sqindv; 
 sqlstm.sqpins = sqlstm.sqinds; 
 sqlstm.sqparm = sqlstm.sqharm; 
 sqlstm.sqparc = sqlstm.sqharc; 
 sqlstm.sqpadto = sqlstm.sqadto; 
 sqlstm.sqptdso = sqlstm.sqtdso; 
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
  
	fflush(stdin);  
	printf("Please input e exit the test method 2,input others continue.\n");  
	while((opt = getchar()) != 'e')  
	{  
		fflush(stdin);  
		printf("please input ecode:");scanf("%d",&ecode);  
		printf("please input ccode:");scanf("%d",&ccode);  
		printf("please input dcode:");scanf("%d",&dcode);  
		printf("start run sql :update employee set ccode=%d, dcode=%d where ecode=%d.\n",ccode,dcode,ecode);  
		  
		/* implements operation. */  
		/* EXEC SQL EXECUTE UPDATE_EMPLOYEE USING :ccode, :dcode, :ecode; */  
 
{ 
  struct sqlexd sqlstm; 
  sqlstm.sqlvsn = 10; 
  sqlstm.arrsiz = 4; 
  sqlstm.sqladtp = &sqladt; 
  sqlstm.sqltdsp = &sqltds; 
  sqlstm.stmt = ""; 
  sqlstm.iters = (unsigned int  )1; 
  sqlstm.offset = (unsigned int  )149; 
  sqlstm.cud = sqlcud0; 
  sqlstm.sqlest = (unsigned char  *)&sqlca; 
  sqlstm.sqlety = (unsigned short)256; 
  sqlstm.occurs = (unsigned int  )0; 
  sqlstm.sqhstv[0] = (         void  *)&ccode; 
  sqlstm.sqhstl[0] = (unsigned int  )sizeof(int); 
  sqlstm.sqhsts[0] = (         int  )0; 
  sqlstm.sqindv[0] = (         void  *)0; 
  sqlstm.sqinds[0] = (         int  )0; 
  sqlstm.sqharm[0] = (unsigned int  )0; 
  sqlstm.sqadto[0] = (unsigned short )0; 
  sqlstm.sqtdso[0] = (unsigned short )0; 
  sqlstm.sqhstv[1] = (         void  *)&dcode; 
  sqlstm.sqhstl[1] = (unsigned int  )sizeof(int); 
  sqlstm.sqhsts[1] = (         int  )0; 
  sqlstm.sqindv[1] = (         void  *)0; 
  sqlstm.sqinds[1] = (         int  )0; 
  sqlstm.sqharm[1] = (unsigned int  )0; 
  sqlstm.sqadto[1] = (unsigned short )0; 
  sqlstm.sqtdso[1] = (unsigned short )0; 
  sqlstm.sqhstv[2] = (         void  *)&ecode; 
  sqlstm.sqhstl[2] = (unsigned int  )sizeof(int); 
  sqlstm.sqhsts[2] = (         int  )0; 
  sqlstm.sqindv[2] = (         void  *)0; 
  sqlstm.sqinds[2] = (         int  )0; 
  sqlstm.sqharm[2] = (unsigned int  )0; 
  sqlstm.sqadto[2] = (unsigned short )0; 
  sqlstm.sqtdso[2] = (unsigned short )0; 
  sqlstm.sqphsv = sqlstm.sqhstv; 
  sqlstm.sqphsl = sqlstm.sqhstl; 
  sqlstm.sqphss = sqlstm.sqhsts; 
  sqlstm.sqpind = sqlstm.sqindv; 
  sqlstm.sqpins = sqlstm.sqinds; 
  sqlstm.sqparm = sqlstm.sqharm; 
  sqlstm.sqparc = sqlstm.sqharc; 
  sqlstm.sqpadto = sqlstm.sqadto; 
  sqlstm.sqptdso = sqlstm.sqtdso; 
  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
		if (sqlca.sqlcode < 0)  
		{  
			printf("Implement sql failed!\n%70s\n", sqlca.sqlerrm.sqlerrmc);  
			/* EXEC SQL ROLLBACK; */  
 
{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 4; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )176; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
		}  
		else  
		{  
			printf("Implement Success.affective %d recordsets.\n", sqlca.sqlerrd[2]);  
			/* EXEC SQL COMMIT; */  
 
{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 4; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )191; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
		}  
  
		fflush(stdin);  
		printf("Please input e exit the test method 2,input others continue.\n");  
	}  
}  
  
void testMethod3()  
{  
	/* EXEC SQL BEGIN DECLARE SECTION; */  
  
		char sqlstmt3[1024];  
		int ccode;  
		char ename[30];  
		char duty[64];  
		char cname[30];  
		char dname[30];  
	/* EXEC SQL END DECLARE SECTION; */  
  
	int opt;  
  
	strcpy(sqlstmt3, "select emp.ename, cmp.cname, edp.dname, emp.duty from employee emp,company cmp,edepartment edp where emp.ccode=:v1 and cmp.ccode=emp.ccode and edp.dcode=emp.dcode");  
	/* EXEC SQL PREPARE select_emp FROM :sqlstmt3; */  
 
{ 
 struct sqlexd sqlstm; 
 sqlstm.sqlvsn = 10; 
 sqlstm.arrsiz = 4; 
 sqlstm.sqladtp = &sqladt; 
 sqlstm.sqltdsp = &sqltds; 
 sqlstm.stmt = ""; 
 sqlstm.iters = (unsigned int  )1; 
 sqlstm.offset = (unsigned int  )206; 
 sqlstm.cud = sqlcud0; 
 sqlstm.sqlest = (unsigned char  *)&sqlca; 
 sqlstm.sqlety = (unsigned short)256; 
 sqlstm.occurs = (unsigned int  )0; 
 sqlstm.sqhstv[0] = (         void  *)sqlstmt3; 
 sqlstm.sqhstl[0] = (unsigned int  )1024; 
 sqlstm.sqhsts[0] = (         int  )0; 
 sqlstm.sqindv[0] = (         void  *)0; 
 sqlstm.sqinds[0] = (         int  )0; 
 sqlstm.sqharm[0] = (unsigned int  )0; 
 sqlstm.sqadto[0] = (unsigned short )0; 
 sqlstm.sqtdso[0] = (unsigned short )0; 
 sqlstm.sqphsv = sqlstm.sqhstv; 
 sqlstm.sqphsl = sqlstm.sqhstl; 
 sqlstm.sqphss = sqlstm.sqhsts; 
 sqlstm.sqpind = sqlstm.sqindv; 
 sqlstm.sqpins = sqlstm.sqinds; 
 sqlstm.sqparm = sqlstm.sqharm; 
 sqlstm.sqparc = sqlstm.sqharc; 
 sqlstm.sqpadto = sqlstm.sqadto; 
 sqlstm.sqptdso = sqlstm.sqtdso; 
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
  
	fflush(stdin);  
	printf("Please input e exit the test method 3,input others continue.\n");  
	while((opt = getchar()) != 'e')  
	{  
		fflush(stdin);  
		printf("please input ccode:");scanf("%d",&ccode);  
		printf("start run sql...\n");  
		  
		/* implements operation. */  
		/* EXEC SQL DECLARE empcus CURSOR FOR select_emp; */  
  
		/* EXEC SQL OPEN empcus USING :ccode; */  
 
{ 
  struct sqlexd sqlstm; 
  sqlstm.sqlvsn = 10; 
  sqlstm.arrsiz = 4; 
  sqlstm.sqladtp = &sqladt; 
  sqlstm.sqltdsp = &sqltds; 
  sqlstm.stmt = ""; 
  sqlstm.iters = (unsigned int  )1; 
  sqlstm.offset = (unsigned int  )225; 
  sqlstm.selerr = (unsigned short)1; 
  sqlstm.cud = sqlcud0; 
  sqlstm.sqlest = (unsigned char  *)&sqlca; 
  sqlstm.sqlety = (unsigned short)256; 
  sqlstm.occurs = (unsigned int  )0; 
  sqlstm.sqhstv[0] = (         void  *)&ccode; 
  sqlstm.sqhstl[0] = (unsigned int  )sizeof(int); 
  sqlstm.sqhsts[0] = (         int  )0; 
  sqlstm.sqindv[0] = (         void  *)0; 
  sqlstm.sqinds[0] = (         int  )0; 
  sqlstm.sqharm[0] = (unsigned int  )0; 
  sqlstm.sqadto[0] = (unsigned short )0; 
  sqlstm.sqtdso[0] = (unsigned short )0; 
  sqlstm.sqphsv = sqlstm.sqhstv; 
  sqlstm.sqphsl = sqlstm.sqhstl; 
  sqlstm.sqphss = sqlstm.sqhsts; 
  sqlstm.sqpind = sqlstm.sqindv; 
  sqlstm.sqpins = sqlstm.sqinds; 
  sqlstm.sqparm = sqlstm.sqharm; 
  sqlstm.sqparc = sqlstm.sqharc; 
  sqlstm.sqpadto = sqlstm.sqadto; 
  sqlstm.sqptdso = sqlstm.sqtdso; 
  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
  
		/* EXEC SQL WHENEVER NOT FOUND DO break; */  
  
		printf("%-30s %-30s %-30s %-60s \n","employee name","company","department","duty");  
		while(1)  
		{  
			/* EXEC SQL FETCH	empcus INTO :ename, :cname, :dname, :duty; */  
 
{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 4; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )244; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlstm.sqhstv[0] = (         void  *)ename; 
   sqlstm.sqhstl[0] = (unsigned int  )30; 
   sqlstm.sqhsts[0] = (         int  )0; 
   sqlstm.sqindv[0] = (         void  *)0; 
   sqlstm.sqinds[0] = (         int  )0; 
   sqlstm.sqharm[0] = (unsigned int  )0; 
   sqlstm.sqadto[0] = (unsigned short )0; 
   sqlstm.sqtdso[0] = (unsigned short )0; 
   sqlstm.sqhstv[1] = (         void  *)cname; 
   sqlstm.sqhstl[1] = (unsigned int  )30; 
   sqlstm.sqhsts[1] = (         int  )0; 
   sqlstm.sqindv[1] = (         void  *)0; 
   sqlstm.sqinds[1] = (         int  )0; 
   sqlstm.sqharm[1] = (unsigned int  )0; 
   sqlstm.sqadto[1] = (unsigned short )0; 
   sqlstm.sqtdso[1] = (unsigned short )0; 
   sqlstm.sqhstv[2] = (         void  *)dname; 
   sqlstm.sqhstl[2] = (unsigned int  )30; 
   sqlstm.sqhsts[2] = (         int  )0; 
   sqlstm.sqindv[2] = (         void  *)0; 
   sqlstm.sqinds[2] = (         int  )0; 
   sqlstm.sqharm[2] = (unsigned int  )0; 
   sqlstm.sqadto[2] = (unsigned short )0; 
   sqlstm.sqtdso[2] = (unsigned short )0; 
   sqlstm.sqhstv[3] = (         void  *)duty; 
   sqlstm.sqhstl[3] = (unsigned int  )64; 
   sqlstm.sqhsts[3] = (         int  )0; 
   sqlstm.sqindv[3] = (         void  *)0; 
   sqlstm.sqinds[3] = (         int  )0; 
   sqlstm.sqharm[3] = (unsigned int  )0; 
   sqlstm.sqadto[3] = (unsigned short )0; 
   sqlstm.sqtdso[3] = (unsigned short )0; 
   sqlstm.sqphsv = sqlstm.sqhstv; 
   sqlstm.sqphsl = sqlstm.sqhstl; 
   sqlstm.sqphss = sqlstm.sqhsts; 
   sqlstm.sqpind = sqlstm.sqindv; 
   sqlstm.sqpins = sqlstm.sqinds; 
   sqlstm.sqparm = sqlstm.sqharm; 
   sqlstm.sqparc = sqlstm.sqharc; 
   sqlstm.sqpadto = sqlstm.sqadto; 
   sqlstm.sqptdso = sqlstm.sqtdso; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
   if (sqlca.sqlcode == 1403) break; 
} 
 
			  
			printf("%-30s %-30s %-30s %-60s \n", ename, cname, dname, duty);  
		}  
		/* EXEC SQL WHENEVER SQLERROR CONTINUE; */  
  
		/* EXEC SQL CLOSE empcus; */  
 
{ 
  struct sqlexd sqlstm; 
  sqlstm.sqlvsn = 10; 
  sqlstm.arrsiz = 4; 
  sqlstm.sqladtp = &sqladt; 
  sqlstm.sqltdsp = &sqltds; 
  sqlstm.iters = (unsigned int  )1; 
  sqlstm.offset = (unsigned int  )275; 
  sqlstm.cud = sqlcud0; 
  sqlstm.sqlest = (unsigned char  *)&sqlca; 
  sqlstm.sqlety = (unsigned short)256; 
  sqlstm.occurs = (unsigned int  )0; 
  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
  
		if (sqlca.sqlcode < 0)  
		{  
			printf("Implement sql failed!\n%70s\n", sqlca.sqlerrm.sqlerrmc);  
			/* EXEC SQL ROLLBACK; */  
 
{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 4; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )290; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
		}  
		else  
		{  
			printf("Implement Success.affective %d recordsets.\n", sqlca.sqlerrd[2]);  
			/* EXEC SQL COMMIT; */  
 
{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 4; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )305; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
		}  
  
		fflush(stdin);  
		printf("Please input e exit the test method 3,input others continue.\n");  
	}  
}  
  
void testMethod4()  
{  
	/* EXEC SQL BEGIN DECLARE SECTION; */  
  
		char sqlstmt4[1024];  
	/* EXEC SQL END DECLARE SECTION; */  
  
  
	int i,loopflag,opt;  
	char bindvar[MAX_VNAME_LEN];  
	char * ptmp;  
  
	SQLDA * bind_desc;  
	SQLDA * sel_desc;  
  
	/* initializes descriptors. */  
	if ((sel_desc = sqlald((int)MAX_SELECT_ITEMS, (int)MAX_VNAME_LEN, (int)MAX_INAME_LEN)) == (SQLDA *)0)  
	{  
		printf("initializes select descriptor failed!\n");  
		return;  
	}  
  
	if ((bind_desc = sqlald((int)MAX_SELECT_ITEMS, (int)MAX_VNAME_LEN, (int)MAX_INAME_LEN)) == (SQLDA *)0)  
	{  
		printf("initializes bind descriptor failed!\n");  
		return;  
	}  
  
	/* allocates memory for descriptors. */  
	AllocateDescriptors(sel_desc, bind_desc, MAX_SELECT_ITEMS);  
  
	/* test4 is runing. */  
	fflush(stdin);  
	printf("Please input e exit the test method 4,input others continue.\n");  
	while((opt = getchar()) != 'e')  
	{  
		(void)setjmp(restore_err);  
  
		memset(sqlstmt4, 0, sizeof(sqlstmt4));  
		getInputStmt(sqlstmt4);  
  
		if ((strncmp(sqlstmt4, "exit", 4) == 0) || (strncmp(sqlstmt4, "EXIT", 4) == 0))  
			goto rebegin;  
				  
		/* EXEC SQL WHENEVER SQLERROR DO errorProc(); */  
  
  
		/* EXEC SQL PREPARE S FROM :sqlstmt4; */  
 
{ 
  struct sqlexd sqlstm; 
  sqlstm.sqlvsn = 10; 
  sqlstm.arrsiz = 4; 
  sqlstm.sqladtp = &sqladt; 
  sqlstm.sqltdsp = &sqltds; 
  sqlstm.stmt = ""; 
  sqlstm.iters = (unsigned int  )1; 
  sqlstm.offset = (unsigned int  )320; 
  sqlstm.cud = sqlcud0; 
  sqlstm.sqlest = (unsigned char  *)&sqlca; 
  sqlstm.sqlety = (unsigned short)256; 
  sqlstm.occurs = (unsigned int  )0; 
  sqlstm.sqhstv[0] = (         void  *)sqlstmt4; 
  sqlstm.sqhstl[0] = (unsigned int  )1024; 
  sqlstm.sqhsts[0] = (         int  )0; 
  sqlstm.sqindv[0] = (         void  *)0; 
  sqlstm.sqinds[0] = (         int  )0; 
  sqlstm.sqharm[0] = (unsigned int  )0; 
  sqlstm.sqadto[0] = (unsigned short )0; 
  sqlstm.sqtdso[0] = (unsigned short )0; 
  sqlstm.sqphsv = sqlstm.sqhstv; 
  sqlstm.sqphsl = sqlstm.sqhstl; 
  sqlstm.sqphss = sqlstm.sqhsts; 
  sqlstm.sqpind = sqlstm.sqindv; 
  sqlstm.sqpins = sqlstm.sqinds; 
  sqlstm.sqparm = sqlstm.sqharm; 
  sqlstm.sqparc = sqlstm.sqharc; 
  sqlstm.sqpadto = sqlstm.sqadto; 
  sqlstm.sqptdso = sqlstm.sqtdso; 
  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
  if (sqlca.sqlcode < 0) errorProc(); 
} 
 
  
		/* EXEC SQL DECLARE C CURSOR FOR S; */  
  
  
		bind_desc->N = MAX_SELECT_ITEMS;  
		/* EXEC SQL DESCRIBE BIND VARIABLES FOR S INTO bind_desc; */  
 
{ 
  struct sqlexd sqlstm; 
  sqlstm.sqlvsn = 10; 
  sqlstm.arrsiz = 4; 
  sqlstm.sqladtp = &sqladt; 
  sqlstm.sqltdsp = &sqltds; 
  sqlstm.iters = (unsigned int  )1; 
  sqlstm.offset = (unsigned int  )339; 
  sqlstm.cud = sqlcud0; 
  sqlstm.sqlest = (unsigned char  *)&sqlca; 
  sqlstm.sqlety = (unsigned short)256; 
  sqlstm.occurs = (unsigned int  )0; 
  sqlstm.sqhstv[0] = (         void  *)bind_desc; 
  sqlstm.sqhstl[0] = (unsigned int  )0; 
  sqlstm.sqhsts[0] = (         int  )0; 
  sqlstm.sqindv[0] = (         void  *)0; 
  sqlstm.sqinds[0] = (         int  )0; 
  sqlstm.sqharm[0] = (unsigned int  )0; 
  sqlstm.sqadto[0] = (unsigned short )0; 
  sqlstm.sqtdso[0] = (unsigned short )0; 
  sqlstm.sqphsv = sqlstm.sqhstv; 
  sqlstm.sqphsl = sqlstm.sqhstl; 
  sqlstm.sqphss = sqlstm.sqhsts; 
  sqlstm.sqpind = sqlstm.sqindv; 
  sqlstm.sqpins = sqlstm.sqinds; 
  sqlstm.sqparm = sqlstm.sqharm; 
  sqlstm.sqparc = sqlstm.sqharc; 
  sqlstm.sqpadto = sqlstm.sqadto; 
  sqlstm.sqptdso = sqlstm.sqtdso; 
  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
  if (sqlca.sqlcode < 0) errorProc(); 
} 
 
  
		if (bind_desc->F < 0)  
		{  
			printf("the count of bind variables is %d, don't be larger than MAX_SELECT_ITEMS %d.\n",   
				-(bind_desc->F), MAX_SELECT_ITEMS);  
			continue;  
		}  
		bind_desc->N = bind_desc->F;  
  
		for(loopflag = 1;loopflag; )  
		{  
			fflush(stdin);  
			for(i = 0; i < bind_desc->F; i++)  
			{  
				/* input variable binding */  
				printf("please input the value of %.*s:", (int)bind_desc->C[i], bind_desc->S[i]);  
				fgets(bindvar, sizeof(bindvar), stdin);  
				if (bindvar[0] == '\n')  
				{  
					loopflag = 0;  
					break;  
				}  
  
				/* bind the variable with bind_desc */  
				ptmp = (char *) realloc(bind_desc->V[i], bind_desc->L[i]+1);  
				if (ptmp != NULL)  
					bind_desc->V[i] = ptmp;  
				strncpy(bind_desc->V[i], bindvar, strlen(bindvar)-1);  
				bind_desc->L[i] = strlen(bindvar)-1;  
				bind_desc->T[i] = 1;  
  
				/* set the value of indicators. */   
				if ((strncmp(bind_desc->V[i], "NULL", 4) == 0) ||   
					(strncmp(bind_desc->V[i], "null", 4)== 0))  
					*bind_desc->I[i] = -1;  
				else  
					*bind_desc->I[i] = 0;  
					  
			}  
			if (!loopflag) break;  
			else if (!i) loopflag = 0;  
  
			/* open cursor */  
			/* EXEC SQL OPEN C USING DESCRIPTOR bind_desc; */  
 
{ 
   struct sqlexd sqlstm; 
   sqlstm.sqlvsn = 10; 
   sqlstm.arrsiz = 4; 
   sqlstm.sqladtp = &sqladt; 
   sqlstm.sqltdsp = &sqltds; 
   sqlstm.stmt = ""; 
   sqlstm.iters = (unsigned int  )1; 
   sqlstm.offset = (unsigned int  )358; 
   sqlstm.selerr = (unsigned short)1; 
   sqlstm.cud = sqlcud0; 
   sqlstm.sqlest = (unsigned char  *)&sqlca; 
   sqlstm.sqlety = (unsigned short)256; 
   sqlstm.occurs = (unsigned int  )0; 
   sqlstm.sqhstv[0] = (         void  *)bind_desc; 
   sqlstm.sqhstl[0] = (unsigned int  )0; 
   sqlstm.sqhsts[0] = (         int  )0; 
   sqlstm.sqindv[0] = (         void  *)0; 
   sqlstm.sqinds[0] = (         int  )0; 
   sqlstm.sqharm[0] = (unsigned int  )0; 
   sqlstm.sqadto[0] = (unsigned short )0; 
   sqlstm.sqtdso[0] = (unsigned short )0; 
   sqlstm.sqphsv = sqlstm.sqhstv; 
   sqlstm.sqphsl = sqlstm.sqhstl; 
   sqlstm.sqphss = sqlstm.sqhsts; 
   sqlstm.sqpind = sqlstm.sqindv; 
   sqlstm.sqpins = sqlstm.sqinds; 
   sqlstm.sqparm = sqlstm.sqharm; 
   sqlstm.sqparc = sqlstm.sqharc; 
   sqlstm.sqpadto = sqlstm.sqadto; 
   sqlstm.sqptdso = sqlstm.sqtdso; 
   sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
   if (sqlca.sqlcode < 0) errorProc(); 
} 
 
  
  
			if ((strncmp(sqlstmt4, "SELECT", 6) == 0) || (strncmp(sqlstmt4, "select", 6) == 0))  
				QueryProcess(sel_desc, bind_desc);  
  
		}  
		  
		rebegin:  
			fflush(stdin);  
			printf("Please input e exit the test method 4,input others continue.\n");  
	}  
	UnAllocateDescriptors(sel_desc, bind_desc, MAX_SELECT_ITEMS);  
	sqlclu(bind_desc);  
	sqlclu(sel_desc);  
	/* EXEC SQL WHENEVER SQLERROR CONTINUE; */  
  
	/* EXEC SQL CLOSE C; */  
 
{ 
 struct sqlexd sqlstm; 
 sqlstm.sqlvsn = 10; 
 sqlstm.arrsiz = 4; 
 sqlstm.sqladtp = &sqladt; 
 sqlstm.sqltdsp = &sqltds; 
 sqlstm.iters = (unsigned int  )1; 
 sqlstm.offset = (unsigned int  )377; 
 sqlstm.cud = sqlcud0; 
 sqlstm.sqlest = (unsigned char  *)&sqlca; 
 sqlstm.sqlety = (unsigned short)256; 
 sqlstm.occurs = (unsigned int  )0; 
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
	/* EXEC SQL COMMIT WORK RELEASE; */  
 
{ 
 struct sqlexd sqlstm; 
 sqlstm.sqlvsn = 10; 
 sqlstm.arrsiz = 4; 
 sqlstm.sqladtp = &sqladt; 
 sqlstm.sqltdsp = &sqltds; 
 sqlstm.iters = (unsigned int  )1; 
 sqlstm.offset = (unsigned int  )392; 
 sqlstm.cud = sqlcud0; 
 sqlstm.sqlest = (unsigned char  *)&sqlca; 
 sqlstm.sqlety = (unsigned short)256; 
 sqlstm.occurs = (unsigned int  )0; 
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
	exit(0);  
}  
  
void AllocateDescriptors(SQLDA * sel_desc, SQLDA * bind_desc, int maxsize)  
{  
	int i;  
	for (i = 0; i < maxsize; i++)  
	{  
		sel_desc->V[i] = (char *)malloc(1);  
		assert(sel_desc->V[i]);  
		sel_desc->I[i] = (short *)malloc(sizeof(short));  
		assert(sel_desc->I[i]);  
		bind_desc->V[i] = (char *)malloc(1);  
		assert(bind_desc->V[i]);  
		bind_desc->I[i] = (short *)malloc(sizeof(short));  
		assert(bind_desc->I[i]);  
	}  
}  
  
void UnAllocateDescriptors(SQLDA * sel_desc, SQLDA * bind_desc, int maxsize)  
{  
	int i;  
	for (i = 0; i < maxsize; i++)  
	{  
		free(sel_desc->V[i]);  
		assert(sel_desc->V[i]);  
		free(sel_desc->I[i]);  
		assert(sel_desc->I[i]);  
		free(bind_desc->V[i]);  
		assert(bind_desc->V[i]);  
		free(bind_desc->I[i]);  
		assert(bind_desc->I[i]);  
	}  
}  
  
short getInputStmt(char * stmtarr)  
{  
	int ch,i;  
	fflush(stdin);  
	printf("please input dynamic sql statement(input 'exit' to leave):\n");  
	for(i = 0; (i < 1024) && ((ch=getchar()) != EOF) && (ch != '\n'); i++)  
		stmtarr[i] = ch;  
	return 1;  
}  
  
void errorProc()  
{  
	printf("Occurs an error :\n%s\n",sqlca.sqlerrm.sqlerrmc);  
	/* EXEC SQL WHENEVER SQLERROR CONTINUE; */  
  
	/* EXEC SQL ROLLBACK; */  
 
{ 
 struct sqlexd sqlstm; 
 sqlstm.sqlvsn = 10; 
 sqlstm.arrsiz = 4; 
 sqlstm.sqladtp = &sqladt; 
 sqlstm.sqltdsp = &sqltds; 
 sqlstm.iters = (unsigned int  )1; 
 sqlstm.offset = (unsigned int  )407; 
 sqlstm.cud = sqlcud0; 
 sqlstm.sqlest = (unsigned char  *)&sqlca; 
 sqlstm.sqlety = (unsigned short)256; 
 sqlstm.occurs = (unsigned int  )0; 
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
} 
 
  
	longjmp(restore_err, 1);  
}  
  
void QueryProcess(SQLDA * sel_desc, SQLDA * bind_desc)  
{  
	int i, isnull, precision, scale;  
	SELDA_LEN SeldaLen[MAX_SELECT_ITEMS];  
	char ColName[MAX_VNAME_LEN+1];  
	/* EXEC SQL WHENEVER SQLERROR DO errorProc(); */  
  
	sel_desc->N = MAX_SELECT_ITEMS;  
	/* EXEC SQL DESCRIBE SELECT LIST FOR S INTO sel_desc; */  
 
{ 
 struct sqlexd sqlstm; 
 sqlstm.sqlvsn = 10; 
 sqlstm.arrsiz = 4; 
 sqlstm.sqladtp = &sqladt; 
 sqlstm.sqltdsp = &sqltds; 
 sqlstm.iters = (unsigned int  )1; 
 sqlstm.offset = (unsigned int  )422; 
 sqlstm.cud = sqlcud0; 
 sqlstm.sqlest = (unsigned char  *)&sqlca; 
 sqlstm.sqlety = (unsigned short)256; 
 sqlstm.occurs = (unsigned int  )0; 
 sqlstm.sqhstv[0] = (         void  *)sel_desc; 
 sqlstm.sqhstl[0] = (unsigned int  )0; 
 sqlstm.sqhsts[0] = (         int  )0; 
 sqlstm.sqindv[0] = (         void  *)0; 
 sqlstm.sqinds[0] = (         int  )0; 
 sqlstm.sqharm[0] = (unsigned int  )0; 
 sqlstm.sqadto[0] = (unsigned short )0; 
 sqlstm.sqtdso[0] = (unsigned short )0; 
 sqlstm.sqphsv = sqlstm.sqhstv; 
 sqlstm.sqphsl = sqlstm.sqhstl; 
 sqlstm.sqphss = sqlstm.sqhsts; 
 sqlstm.sqpind = sqlstm.sqindv; 
 sqlstm.sqpins = sqlstm.sqinds; 
 sqlstm.sqparm = sqlstm.sqharm; 
 sqlstm.sqparc = sqlstm.sqharc; 
 sqlstm.sqpadto = sqlstm.sqadto; 
 sqlstm.sqptdso = sqlstm.sqtdso; 
 sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
 if (sqlca.sqlcode < 0) errorProc(); 
} 
 
  
  
	if (sel_desc->F < 0)  
	{  
		printf("the count of bind variables is %d, don't be larger than MAX_SELECT_ITEMS %d.\n",   
				-(bind_desc->F), MAX_SELECT_ITEMS);  
		return;  
	}  
	sel_desc->N = sel_desc->F;  
	  
	for(i = 0; i < sel_desc->F; i++)  
	{  
		sqlnul((unsigned short*)&sel_desc->T[i], (unsigned short*)&sel_desc->T[i], &isnull);  
		switch (sel_desc->T[i])  
		{  
		case 1:	/* CHAR datatype: no change in length  
				needed, except possibly for TO_CHAR  
				conversions (not handled here). */  
				break;  
		case 2:	/* NUMBER datatype: use SQLNumberPrecV6() to  
				extract precision and scale. */  
			sqlprc(&(sel_desc->L[i]), &precision, &scale);  
			if (precision == 0) precision = 38;  
			if (scale > 0)  
				sel_desc->L[i] = sizeof(float);  
			else  
				sel_desc->L[i] = sizeof(int);  
  
			SeldaLen[i].precision = precision;  
			SeldaLen[i].scale = scale;  
			break;  
		case 8 : /* LONG datatype */  
				sel_desc->L[i] = 240;  
				break;  
		case 11 : /* ROWID datatype */  
				sel_desc->L[i] = 18;  
				break;  
		case 12 : /* DATE datatype */  
				sel_desc->L[i] = 9;  
				break;  
		case 23 : /* RAW datatype */  
				break;  
		case 24 : /* LONG RAW datatype */  
				sel_desc->L[i] = 240;  
				break;  
		}  
  
		if (sel_desc->T[i] != 2)  
			sel_desc->V[i] = (char *) realloc(sel_desc->V[i],  
				sel_desc->L[i] + 1);  
		else  
			sel_desc->V[i] = (char *) realloc(sel_desc->V[i],  
				sel_desc->L[i]);  
  
		/* get column name */  
		memset(ColName, 0, MAX_VNAME_LEN);  
		strncpy(ColName, sel_desc->S[i], sel_desc->C[i]);  
  
		/* get the suitable len of displaying column and value. */  
		if (sel_desc->T[i] == 2)  
			if (scale > 0)  
			{  
				SeldaLen[i].precision = (precision > sel_desc->C[i])? precision : sel_desc->C[i];  
			}  
			else  
			{  
				SeldaLen[i].precision = (sel_desc->L[i] > sel_desc->C[i])? sel_desc->L[i] : sel_desc->C[i];  
			}  
		else  
		{  
			SeldaLen[i].precision = (sel_desc->L[i] > sel_desc->C[i])? sel_desc->L[i] : sel_desc->C[i];			  
		}  
		printf ("%-*s ", SeldaLen[i].precision, ColName);  
  
  
		/* Coerce ALL datatypes except for LONG RAW and NUMBER to character. */  
		if (sel_desc->T[i] != 24 && sel_desc->T[i] != 2)  
			sel_desc->T[i] = 1;  
		/* Coerce the datatypes of NUMBERs to float or int depending on the scale. */  
		if (sel_desc->T[i] == 2)  
			if (scale > 0)  
				sel_desc->T[i] = 4; /* float */  
			else  
				sel_desc->T[i] = 3; /* int */	  
	}  
	printf("\n");  
  
	/* EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop; */  
  
	for(;;)  
	{  
		/* EXEC SQL FETCH C USING DESCRIPTOR sel_desc; */  
 
{ 
  struct sqlexd sqlstm; 
  sqlstm.sqlvsn = 10; 
  sqlstm.arrsiz = 4; 
  sqlstm.sqladtp = &sqladt; 
  sqlstm.sqltdsp = &sqltds; 
  sqlstm.iters = (unsigned int  )1; 
  sqlstm.offset = (unsigned int  )441; 
  sqlstm.cud = sqlcud0; 
  sqlstm.sqlest = (unsigned char  *)&sqlca; 
  sqlstm.sqlety = (unsigned short)256; 
  sqlstm.occurs = (unsigned int  )0; 
  sqlstm.sqhstv[0] = (         void  *)sel_desc; 
  sqlstm.sqhstl[0] = (unsigned int  )0; 
  sqlstm.sqhsts[0] = (         int  )0; 
  sqlstm.sqindv[0] = (         void  *)0; 
  sqlstm.sqinds[0] = (         int  )0; 
  sqlstm.sqharm[0] = (unsigned int  )0; 
  sqlstm.sqadto[0] = (unsigned short )0; 
  sqlstm.sqtdso[0] = (unsigned short )0; 
  sqlstm.sqphsv = sqlstm.sqhstv; 
  sqlstm.sqphsl = sqlstm.sqhstl; 
  sqlstm.sqphss = sqlstm.sqhsts; 
  sqlstm.sqpind = sqlstm.sqindv; 
  sqlstm.sqpins = sqlstm.sqinds; 
  sqlstm.sqparm = sqlstm.sqharm; 
  sqlstm.sqparc = sqlstm.sqharc; 
  sqlstm.sqpadto = sqlstm.sqadto; 
  sqlstm.sqptdso = sqlstm.sqtdso; 
  sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); 
  if (sqlca.sqlcode == 1403) goto end_select_loop; 
  if (sqlca.sqlcode < 0) errorProc(); 
} 
 
  
		/* Since each variable returned has been coerced to a  
		character string, int, or float very little processing  
		is required here. This routine just prints out the  
		values on the terminal. */  
		for (i = 0; i < sel_desc->F; i++)  
		{  
			if (*sel_desc->I[i] < 0)  
				printf ("%-*c ", SeldaLen[i].precision, ' ');  
			else  
				if (sel_desc->T[i] == 3) /* int datatype */  
					printf ("%*d ", SeldaLen[i].precision, *(int *)sel_desc->V[i]);  
				else if (sel_desc->T[i] == 4) /* float datatype */  
					printf ("%*.*f ", SeldaLen[i].precision, SeldaLen[i].scale, *(float *)sel_desc->V[i]);  
				else /* character string */  
					printf ("%-.*s ", SeldaLen[i].precision, sel_desc->V[i]);  
		}  
		printf ("\n");  
	}  
	end_select_loop:  
		return;  
}