#include <stdio.h> #include <string.h> EXEC SQL INCLUDE sqlca;
struct { VARCHAR emp_name[30]; float salary; float commission; } emprec; /* Define an indicator struct to correspond to the host output struct. */ struct { short emp_name_ind; short sal_ind; short comm_ind; } emprec_ind;
/* Input host variable. */ int emp_number; int total_queried; /* Include the SQL Communications Area. You can use #include or EXEC SQL INCLUDE. */
int databaseopen() { EXEC SQL BEGIN DECLARE SECTION; char username[20]; char password[20]; char db_string[20]; EXEC SQL END DECLARE SECTION;
strcpy(username,"agent"); strcpy(password,"agent"); strcpy(db_string,"oraagent");
EXEC SQL CONNECT :username IDENTIFIED BY :password using :db_string; if(sqlca.sqlcode != 0) { printf("open database error[%d]\n",sqlca.sqlcode); return (-1); } return 0; }
/* Declare error handling function. */ void sql_error();
main() { EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n"); char temp_char[32]; if(databaseopen()<0){ sql_error("database open error\n"); }
/* Loop, selecting individual employee's results */ total_queried = 0; for (;;) { /* Break out of the inner loop when a * 1403 ("No data found") condition occurs. */ EXEC SQL WHENEVER NOT FOUND DO break; for (;;) { emp_number = 0; printf("\nEnter employee number (0 to quit): "); gets(temp_char); emp_number = atoi(temp_char); if (emp_number == 0) break; EXEC SQL SELECT ename, sal, comm INTO :emprec INDICATOR :emprec_ind FROM EMP WHERE EMPNO = :emp_number; /* Print data. */ printf("\n\nEmployee\tSalary\t\tCommission\n"); printf("--------\t------\t\t----------\n"); /* Null-terminate the output string data. */ emprec.emp_name.arr[emprec.emp_name.len] = '\0'; printf("%-8s\t%6.2f\t\t", emprec.emp_name.arr, emprec.salary); if (emprec_ind.comm_ind == -1) printf("NULL\n"); else printf("%6.2f\n", emprec.commission);
total_queried++; } /* end inner for (;;) */ if (emp_number == 0) break; printf("\nNot a valid employee number - try again.\n"); } /* end outer for(;;) */
printf("\n\nTotal rows returned was %d.\n", total_queried); printf("\nG'day.\n\n\n");
/* Disconnect from ORACLE. */ EXEC SQL COMMIT WORK RELEASE; exit(0); } void sql_error(msg) char *msg; { char err_msg[128]; int 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); }
|