/****************************************************************/ /* Dynamic SQL -- prepare and execute (Section 3.10.2) */ /* Chapter 3; Oracle Programming -- A Primer */ /* by R. Sunderraman */ /****************************************************************/ #include #define FALSE 0 #define TRUE 1 EXEC SQL begin declare section; char sql_stmt[256]; int num; varchar userid[10], password[15]; EXEC SQL end declare section; EXEC SQL include sqlca; void sql_error(char msg[]); main () { int loginok=FALSE,logintries=0; do { printf("Enter your USERID: "); scanf("%s", userid.arr); userid.len = strlen(userid.arr); printf("Enter your PASSWORD: "); system("stty -echo"); scanf("%s", password.arr); password.len = strlen(password.arr); system("stty echo"); printf("\n"); EXEC SQL connect :userid identified by :password; if (sqlca.sqlcode == 0) loginok = TRUE; else printf("Connect Failed\n"); logintries++; } while ((!loginok) && (logintries <3)); if ((logintries == 3) && (!loginok)) { printf("Too many tries at signing on!\n"); exit(0); } strcpy(sql_stmt,"update employees set hdate=sysdate where eno = :n"); EXEC SQL set transaction read write; EXEC SQL prepare s from :sql_stmt; do { printf("Enter eno to update (0 to stop):>"); scanf("%d",&num); if (num > 0) { EXEC SQL execute s using :num; if (sqlca.sqlcode < 0) { sql_error("Problem\n"); exit(1); } EXEC SQL commit; } } while (num > 0); EXEC SQL commit release; exit(0); } void sql_error(char msg[]) { char err_msg[128]; size_t buf_len, msg_len; EXEC SQL whenever sqlerror continue; printf("\n%s\n", msg); buf_len = sizeof (err_msg); sqlglm(err_msg, &buf_len, &msg_len); printf("%.*s\n", msg_len, err_msg); EXEC SQL rollback release; exit(1); }