15.10 - Example - Preprocessor2 for Embedded SQL

Teradata Preprocessor2 for Embedded SQL Programmer Guide

prodname
Preprocessor2 for Embedded SQL
vrm_release
15.10
category
Programming Reference
featnum
B035-2446-035K
#include <stdio.h>
#include <string.h>
        
EXEC SQL BEGIN DECLARE SECTION;
  char        LOGON_STRING[30];
  char        USER[30];
  char        CNAME[30];
  long        EMPNUM;
  int         SQLCODE;
  short int   EMPIND;
  VARCHAR     errmsg[81];
  short       USERIND;
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
long   errcode;
short  maxlen = 80;
char   REQUEST_TYPE[30];
/**************************************************************/
/* DECLARE CURSORS /**************************************************************/
EXEC SQL DECLARE EMPCUR1 CURSOR FOR
          SELECT EMPLOYEE_NUMBER
            FROM EMPLOYEE;
EXEC SQL DECLARE EMPCUR2 CURSOR FOR
          SELECT EMPLOYEE_NUMBER
            FROM EMPLOYEE;
EXEC SQL DECLARE EMPCUR3 CURSOR FOR
          SELECT EMPLOYEE_NUMBER
            FROM EMPLOYEE;
/**************************************************************/
/*ERROR_CHECK - check the sqlcode from the last SQL request made*/
/*               and print a message for any non-zero sqlcode     */
/**************************************************************/
ERROR_CHECK(char  *REQUEST_TYPE)
 {
   if (sqlca.sqlcode != 0)
    {
      PPRTEXT(&SQL_RDTRTCON, &errcode, &errmsg, &maxlen);
      errmsg.arr[errmsg.len] = '\0';
      printf("\n");
      printf("ERROR/WARNING DETECTED IN %s\n", REQUEST_TYPE);
      printf("   SQL CODE  : %d\n", sqlca.sqlcode);
      printf("   ERROR CODE: %d\n", sqlca.sqlerrd[0]);
      printf("   MSG : %s\n", errmsg.arr);
    }
 }
/**************************************************************/
/*LOGON_FUNC - logon to the DBS using the specified LOGON string*/
/*              and connection name.                              */
/**************************************************************/
logon_func(char  *string,
           char  *conname)
 {
   strcpy(LOGON_STRING, string);
   strcpy(CNAME, conname);
   EXEC SQL LOGON :LOGON_STRING AS :CNAME;
   ERROR_CHECK("LOGON");
   if (sqlca.sqlcode != 0)
      return;
 }
/**************************************************************/
/* SELECT_USER - get the name of this DBS user and store it.      */
/**************************************************************/
SELECT_USER()
 {
   EXEC SQL SELECT USER
             INTO :USER INDICATOR :USERIND;
 
   ERROR_CHECK("SELECT");
 
   if (sqlca.sqlcode == 0)
    {
      USER[29] = '\0';
      printf("\n");
      printf("USER         : %s\n", USER);
    }
 }
/**************************************************************/
/*SET_CONNECTION - the the programs's current session to the one*/
/*                  associated with the specified connection name */
/**************************************************************/
 
set_connection(char  *conname)
 {
   strcpy(CNAME, conname);
   EXEC SQL SET CONNECTION :CNAME;
          
   ERROR_CHECK("SET CONNECTION");
 
   if (sqlca.sqlcode != 0)
      return;
 
   SELECT_USER();
 }
/**************************************************************/
/* MAIN PROGRAM                                                  */
/**************************************************************/
main(int     argn,
     char  **log)
 {
   /* Create 5 DBS sessions */
   logon_func(log[1], "STV2A");
   logon_func(log[1], "STV2B");
   logon_func(log[1], "STV2C");
   logon_func(log[1], "STV2D");
   logon_func(log[1], "STV2E");
   set_connection("STV2A");  /* Set the current session to STV2A */
   /* Initiate the SQL SELECT associated with cursor EMPCUR1,    */
   /* labeling this asynchronous request SELECT1, but don't wait */
   /* for the request to be completed.                           */
    
   EXEC SQL ASYNC (SELECT1) OPEN EMPCUR1;
   ERROR_CHECK("OPEN EMPCUR1");
   set_connection("STV2B");  /* Set the current session to STV2B */
   /* Initiate the SQL SELECT associated with cursor EMPCUR2,    */
   /* labeling this asynchronous request SELECT2, but don't wait */
   /* for the request to be completed.                           */
   EXEC SQL ASYNC (SELECT2) OPEN EMPCUR2;
 
   ERROR_CHECK("OPEN EMPCUR2");
   set_connection("STV2C");  /* Set the current session to STV2C */
   /* Initiate the SQL SELECT associated with cursor EMPCUR3,    */
   /* labeling this asynchronous request SELECT3, but don't wait */
   /* for the request to be completed.                           */
 
   EXEC SQL ASYNC (SELECT3) OPEN EMPCUR3;
 
   ERROR_CHECK("OPEN EMPCUR3");
 
   /* Now, wait here for request SELECT1 to be completed. */
   
   EXEC SQL WAIT SELECT1 COMPLETION;
   ERROR_CHECK("WAIT SELECT1");
   if (sqlca.sqlcode == 0)
    {
      printf("\nWAIT FOR SELECT1 REQUEST COMPLETED. \n");
    }
   /* Test for the completion of request SELECT1. */
   EXEC SQL TEST SELECT1 COMPLETION;
 
   ERROR_CHECK("TEST FOR SELECT1");
   set_connection("STV2A");  /* Reset the current session to STV2A */
   while (sqlca.sqlcode == 0)  /* Retrieve the rows from the SELECT */
    {                          /* associated with cursor EMPCUR1    */
      EXEC SQL FETCH EMPCUR1
               INTO :EMPNUM INDICATOR :EMPIND;
      ERROR_CHECK("FETCH EMPCUR1");
      if (sqlca.sqlcode == 0)
       {
         printf("\nEMPLOYEE NUMBER   : %ld\n", EMPNUM);
       }
    }
   /* Now, wait here for all other outstanding asynchronous      */
   /* requests to be completed (in this case SELECT2 & SELECT3). */
   EXEC SQL WAIT ALL COMPLETION;
  
   ERROR_CHECK("WAIT ALL");
 
   if (sqlca.sqlcode == 0)
    {
      printf("\nWAIT ALL COMPLETED. \n");
    }
   /* Test for the completion of request SELECT2. */
   EXEC SQL TEST SELECT2 COMPLETION;
   
   ERROR_CHECK("TEST FOR SELECT2");
   set_connection("STV2B");  /* Set the current session to STV2B */
   
   while (sqlca.sqlcode == 0)  /* Retrieve the rows from the SELECT */
    {                          /* associated with cursor EMPCUR2    */
      EXEC SQL FETCH EMPCUR2 INTO :EMPNUM INDICATOR :EMPIND;
      ERROR_CHECK("FETCH EMPCUR2");
      printf("EMPLOYEE NUMBER   : %ld\n", EMPNUM);
    }
   /* Logoff from the DBS all (5) sessions created by this program */
 
   EXEC SQL LOGOFF ALL;
   ERROR_CHECK("LOGOFF");
 }