/*-------------------------------------------------------------------+ | COPYRIGHT (C) 1995, SAS INSTITUTE INC. | | UNPUBLISHED - ALL RIGHTS RESERVED | | S A S / C S A M P L E | | | | | | NAME: ORASASC | | LANGUAGE: C | | PURPOSE: This program is an example of using the ORACLE Pro*C | | Precompiler with SAS/C. | | MVS - | | COMPILE: See JCL in prefix.SAMPLE.AUX(SQLJCL). | | LINK: See JCL in prefix.SAMPLE.AUX(SQLJCL). | | EXECUTE: See JCL in prefix.SAMPLE.AUX(ORALOAD). | | NOTE: This example requires that you have the ORACLE Pro*C | | Precompiler, version 1.3. | +-------------------------------------------------------------------*/ #include #include #include #include #define MAXEMPLOY 600 #define SASC #define SQLCA_INIT void printdb(); void sortdb(); void getdb(); static int cmp(const void *,const void *); EXEC SQL BEGIN DECLARE SECTION; /* Declare host variables */ char *uname = "SCOTT"; char *pw = "TIGER"; int empno; /* temporary variables for SQL */ VARCHAR elast[10]; char efirst[2]; VARCHAR j[4]; int d; float s; char sqlstmt[110]; /* dynamic SQL statement */ EXEC SQL END DECLARE SECTION; typedef struct { /* Employee Structure */ int empno; /* employee number, */ char efirst[2]; /* first initial, */ char elast[10]; /* last name, */ char job[4]; /* position abbrev. */ int deptno; /* dept number */ float sal; /* monthly salary */ } EMP_STRUCT; EMP_STRUCT e[MAXEMPLOY]; char temp[5]; char c; int i,count; /* array counter,record counter */ EXEC SQL DECLARE SQLOBJ STATEMENT; EXEC SQL INCLUDE SQLCAC; /* this was sqlca teb*/ void main() { EXEC SQL WHENEVER SQLERROR GOTO iferror; EXEC SQL CONNECT :uname IDENTIFIED BY :pw; printf("Connected to ORACLE. \n"); for(i=0;i<110;i++) /* initialize sqlstmt */ sqlstmt[i] = ' '; /* set sqlstmt for dynamic call */ strcpy(sqlstmt,"INSERT INTO EMP (EMPNO, EFIRST, ELAST, JOB, SAL,"); strcat(sqlstmt," DEPTNO) VALUES (:empno, :efirst, :elast, :j,"); strcat(sqlstmt," :s, :d)"); for(i=110;sqlstmt[i]='\0';i--) sqlstmt[i] = ' '; EXEC SQL PREPARE SQLOBJ FROM :sqlstmt; for(;;) { /* get the current database from ORACLE */ getdb(); /* sort the database by name */ sortdb(); /* print the database */ printdb(); printf("Would you like to 1) insert, or 2) delete a record, or "); printf("0) quit? \n"); while((c = getchar()) != 0 ) { getchar(); /* get rid of excess characters */ switch (c) { case '0': /* QUIT */ { EXEC SQL COMMIT WORK RELEASE; exit(0); } case '1': /* INSERT */ { strcpy(j.arr,"New"); /* set initial values of 3 vars */ s = 0.0; d = 100; printf("Enter the employee information in the "); printf("form: LASTNAME FIRSTINITIAL EMPNO \n"); printf("The lastname should be <10 chars. \n"); scanf("%s %s %d",elast.arr,efirst,&empno); getchar(); /* get rid of excess characters */ EXEC SQL EXECUTE SQLOBJ USING :empno,:efirst,:elast,:j,:s,:d; break; } case '2': /* DELETE */ { printf("Enter the Employee Number to delete: "); scanf("%d",&empno); getchar(); /* get rid of excess characters */ EXEC SQL DELETE FROM EMP WHERE EMPNO = :empno; break; } default: { printf("Invalid response. Please choose again. \n"); break; } } getdb(); /* updated database -- sort and print */ sortdb(); printdb(); printf("Would you like to 1) insert, or 2) delete a record, or "); printf("0) quit? \n"); } } /* if an SQL error should result during processing */ iferror: { printf("SQL error: %.70s \n",sqlca.sqlerrm.sqlerrmc); EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL ROLLBACK WORK RELEASE; exit(1); } return; } void printdb() /*-----------------------------------------------------------------*/ /* This routine prints the current database as read in from ORACLE */ /* by the routine getdb(). The information is stored in e array. */ /*-----------------------------------------------------------------*/ { /* print the database */ printf("The current database: \n"); printf("Employee Emp No. Position Salary DeptNo.\n"); for(i=0;ielast,esecond->elast); if(x) return(x); else return(strcmp(efirst->efirst,esecond->efirst)); }