/* Copyright © 1995, 2002, Oracle Corporation. All Rights Reserved. */ #pragma module SQL_DYNAMIC_DRIVER_M /* **++ ** ABSTRACT: sql_dynamic_driver_m.c ** ** This program is the main driver for the version of the Dynamic SQL ** Interface which executes and re-executes multiple SQL statements. ** The purpose of this program is to illustrate how to coordinate ** the processing of multiple SQL statements with the sql_dynamic ** routine. This program maintains multiple SQL statements in a PREPARE'd ** state and re-executes the statements (optionally with new parametric ** values). Associated with this program are the following modules: ** ** . sql_dynamic.c : processes statements passed by ** sql_dynamic_driver_m.c ** ** . sql_dynamic_c.sqlmod : SQL module language file that contains ** all the procedures called by ** sql_dynamic_multiple.c ** ** ** CREATION DATE: ** ** May 1991 ** ** LAST MODIFIED: November 1993 **/ /* ** ** INCLUDE FILES ** **/ #include #include #include #include #include /* Declarations */ #define sql_success 0 #define MAX_STMT_SIZE 1024 /* max length of a statement to be processed */ #define IDLEN 128 /* ** Max number of parameters or select list items is 16 */ #define MAXPARAMS 50 /* Declare the SQLDA2. */ typedef struct { char sqldaid[8]; int sqlabc; short sqln; short sqld; struct sqlvar_struct { short sqltype; long sqllen; int sqloctet_len; char *sqldata; int *sqlind; int sqlchrono_scale; int sqlchrono_precision; short sqlname_len; char sqlname[IDLEN]; char sqlchar_set_name[IDLEN]; char sqlchar_set_schema[IDLEN]; char sqlchar_set_catalog[IDLEN]; } sqlvar[MAXPARAMS]; } sqlda_rec, *sqlda; extern int sql_dynamic(); extern void commit_transaction(); /* SQL Modular procedure */ /* ** ** Main Program ** */ main() { char sql_statement[MAX_STMT_SIZE+1]; /* The sql statement input by the user. */ char *pstmt = &sql_statement[0]; char save_sel[MAX_STMT_SIZE+1]; char save_ins[MAX_STMT_SIZE+1]; char save_upd[MAX_STMT_SIZE+1]; char *null_stmt; /* template for blanking out buffer */ int i, status; /* Declare the SQLCA structure. */ struct { char SQLCAID[8]; int SQLCABC; int SQLCODE; struct { short SQLERRML; char SQLERRMC[70]; } SQLERRM; int SQLERRD[6]; struct { char SQLWARN0[1]; char SQLWARN1[1]; char SQLWARN2[1]; char SQLWARN3[1]; char SQLWARN4[1]; char SQLWARN5[1]; char SQLWARN6[1]; char SQLWARN7[1]; } SQLWARN; char SQLEXT[8]; } SQLCA = { {'S','Q','L','C','A',' ',' ',' '}, 128, 0, {0, ""}, {0,0,0,0,0,0}, {"", "", "", "", "", "", "", ""}, "" }; /* Declare the SQLDA structures. */ sqlda sqlda_in_upd, sqlda_out_upd, /* for update */ sqlda_in_ins, sqlda_out_ins, /* for insert */ sqlda_in_sel, sqlda_out_sel; /* for select */ /* Declare statement id's for modular SQL multiple statement processing. */ long upd = 0, /* update */ ins = 0, /* insert */ sel = 0; /* select */ int upd_flag = 0; /* Indicates whether statement was select or not */ int ins_flag = 0; int sel_flag = 0; sqlda_in_upd = NULL; sqlda_in_ins = NULL; sqlda_in_sel = NULL; sqlda_out_upd = NULL; sqlda_out_ins = NULL; sqlda_out_sel = NULL; null_stmt = (char *) calloc (MAX_STMT_SIZE+1, sizeof(char)); strncpy (sql_statement, null_stmt, MAX_STMT_SIZE+1); printf ("\nProgram running to demonstrate multiply prepared SQL statements"); printf ("\n------------------------------------------------------------------"); printf ("\n* Executing INSERT... to exit"); strcpy (pstmt, "insert into employees (employee_id,last_name,first_name) values (?,?,?)"); printf ("\n%s",sql_statement); strcpy(save_ins,sql_statement); if ((status = sql_dynamic (sql_statement, &sqlda_in_ins, &sqlda_out_ins, &ins, &ins_flag)) != 0) printf ("\nError returned from sql_dynamic()"); /* clear statement buffer */ strncpy (sql_statement, null_stmt, MAX_STMT_SIZE+1); printf ("\n------------------------------------------------------------------"); printf ("\n* Executing SELECT... to exit"); strcpy (pstmt, "select employee_id,last_name,first_name from employees where employee_id = ?"); printf ("\n%s",sql_statement); strcpy(save_sel,sql_statement); if ((status = sql_dynamic (sql_statement, &sqlda_in_sel,&sqlda_out_sel, &sel, &sel_flag)) != 0) printf ("\nError returned from sql_dynamic()"); /* Clear statement buffer. */ strncpy (sql_statement, null_stmt, MAX_STMT_SIZE+1); /* Call SQL Modular procedure to commit the transaction. */ printf ("\n------------------------------------------------------------------"); printf ("\n* Executing UPDATE... to exit"); strcpy(pstmt,"update employees set first_name=? where employee_id=?"); printf ("\n%s",sql_statement); strcpy(save_upd,sql_statement); if ((status = sql_dynamic(sql_statement, &sqlda_in_upd, &sqlda_out_upd, &upd, &upd_flag )) != 0) printf ("\nError returned from sql_dynamic()"); /* Clear statement buffer. */ strncpy (sql_statement, null_stmt, MAX_STMT_SIZE+1); printf ("\n------------------------------------------------------------------"); printf ("\n* Executing COMMIT..."); commit_transaction (&SQLCA); if (SQLCA.SQLCODE != 0) printf ("\n6) Error in Commit transaction..."); SQLCA.SQLCODE = sql_success; while(1) { printf ("\n------------------------------------------------------------------"); printf ("\n* Re-executing INSERT... to exit"); printf("\n%s",save_ins); if ((status = sql_dynamic(sql_statement, &sqlda_in_ins, &sqlda_out_ins, &ins, &ins_flag)) != 0) printf ("\nError returned from sql_dynamic()"); printf ("\n------------------------------------------------------------------"); printf ("\n* Re-executing SELECT... to exit"); printf("\n%s",save_sel); if ((status = sql_dynamic(sql_statement, &sqlda_in_sel, &sqlda_out_sel, &sel, &sel_flag)) != 0) printf ("\nError returned from sql_dynamic()"); printf ("\n------------------------------------------------------------------"); printf ("\n* Re-executing UPDATE... to exit"); printf("\n%s",save_upd); if ((status = sql_dynamic(sql_statement, &sqlda_in_upd, &sqlda_out_upd, &upd, &upd_flag )) != 0) printf ("\nError returned from sql_dynamic()"); /* Call SQL Modular procedure to commit the transaction. */ printf ("\n------------------------------------------------------------------"); printf ("\n* Executing COMMIT..."); commit_transaction (&SQLCA); if (SQLCA.SQLCODE != 0) printf ("\n6) Error in Commit transaction..."); } /* end while */ } /* end main */