| 
ALLBASE/SQL C Application Programming Guide: HP 3000 MPE/iX Computer Systems > Chapter 5 Simple Data ManipulationSample Program Using Simple DML Commands | 
 
  | 
 The flow chart shown in Figure 5-1 summarizes the functionality of program cex7. This program uses the four simple data manipulation commands to operate on the PurchDB.Vendors table. A function menu determines whether to execute one or more SELECT, UPDATE, DELETE, or INSERT operations. Each execution of a simple data manipulation command is done in a separate transaction. The runtime dialog for program cex7 appears in Figure 5-2, and the source code in Figure 5-3. Function ConnectDBE starts a DBE session 51 . This function executes the CONNECT command 2 for the sample DBEnvironment, PartsDBE. The operation performed next depends on the number entered when a function menu is displayed 52 : 
 The Select function 9 prompts for a vendor number or a 0 10 . If a 0 is entered, the function menu is re-displayed. If a vendor number is entered, function BeginTransaction is executed 11 to issue the BEGIN WORK command 4 . Then a SELECT command is executed to retrieve all data for the vendor specified from PurchDB.Vendors 12 . The sqlca.sqlcode returned is examined to determine the next action: 
 The Update function 23 lets the user UPDATE the value of a column only if it contains a null value. The function prompts 24 for a vendor number or a 0. If a 0 is entered, the function menu is re-displayed. If a vendor number is entered, function BeginTransaction is executed 25 . Then a SELECT command is executed 26 to retrieve data from PurchDB.Vendors for the vendor specified. The sqlca.sqlcode returned is examined to determine the next action: 
 Function Delete 35 lets the user DELETE one row. The function prompts for a vendor number or a 0 36 . If a 0 is entered, the function menu is re-displayed. If a vendor number is entered, function BeginTransaction is executed 37 . Then a SELECT command is executed to retrieve all data for the vendor specified from PurchDB.Vendors 38 . The sqlca.sqlcode returned is examined to determine the next action: 
 The Insert function 44 lets the user INSERT one row. The function prompts for a vendor number or a 0 45 . If a 0 is entered, the function menu is re-displayed. If a vendor number is entered, the user is prompted for values for each column. The user can enter a 0 to specify a null value for potentially null columns 46 ; to assign a null value, the program assigns a -1 to the appropriate null indicator 47 . After a transaction is started 48 , an INSERT command 49 is used to insert a row containing the specified values. After the INSERT operation, the transaction is terminated 50 , and the user re-prompted for a vendor number or a 0. When the user enters a 0 in response to the function menu display, the program terminates by executing function ReleaseDBE 53 . This function executes the RELEASE command 3 . Figure 5-3 Runtime Dialog of Program cex7 Program for Simple Data Manipulation of Vendors Table - cex7 Connect to PartsDBE 1 . . . . SELECT rows from PurchDB.Vendors table 2 . . . . UPDATE rows with null values in PurchDB.Vendors table 3 . . . . DELETE rows from PurchDB.Vendors table 4 . . . . INSERT rows into PurchDB.Vendors table Enter choice or 0 to STOP > 4 *** Function to INSERT rows into PurchDB.Vendors *** Enter Vendor Number to INSERT into Vendors Table or 0 for MENU > 9016 Enter Vendor Name > Wolfe Works Enter Contact Name or a 0 for null > Stanley Wolfe Enter Phone Number or a 0 for null > 408 975 6061 Enter Vendor Street > 7614 Canine Way Enter Vendor City > San Jose Enter Vendor State > CA Enter Vendor Zip Code > 90016 Enter Vendor Remarks or a 0 for null > 0 Begin Work INSERT row into PurchDB.Vendors Commit Work Enter Vendor Number to INSERT into Vendors Table or 0 for MENU > 0 1 . . . SELECT rows from PurchDB.Vendors table 2 . . . UPDATE rows with null values in PurchDB.Vendors table 3 . . . DELETE rows from PurchDB.Vendors table 4 . . . INSERT rows into PurchDB.Vendors table Enter choice or 0 to STOP > 1 *** Function to SELECT a row from the Vendors Table *** Enter Vendor Number to SELECT from Vendors Table or 0 for MENU > 9016 Begin Work SELECT * from PurchDB.Vendors VendorNumber: 9016 VendorName: Wolfe Works ContactName: Stanley Wolfe PhoneNumber: 408 975 6061 VendorStreet: 7614 Canine Way VendorCity: San Jose VendorState: CA VendorZipCode: 90016 VendorRemarks is NULL Commit Work Enter Vendor Number to SELECT from Vendors Table or 0 for MENU > 0 1 . . . SELECT rows from PurchDB.Vendors table 2 . . . UPDATE rows with null values in PurchDB.Vendors table 3 . . . DELETE rows from PurchDB.Vendors table 4 . . . INSERT rows into PurchDB.Vendors table Enter choice or 0 to STOP > 2 *** Function to UPDATE rows in PurchDB.Vendors *** Enter Vendor Number to UPDATE within Vendors Table or 0 for MENU > 9016 Begin Work SELECT * from PurchDB.Vendors VendorNumber: 9016 VendorName: Wolfe Works ContactName: Stanley Wolfe PhoneNumber: 408 975 6061 VendorStreet: 7614 Canine Way VendorCity: San Jose VendorState: CA VendorZipCode: 90016 VendorRemarks is NULL Enter new VendorRemarks or 0 for null > can expedite shipments Commit Work Enter Vendor Number to UPDATE within Vendors Table or 0 for MENU > 0 1 . . . SELECT rows from PurchDB.Vendors table 2 . . . UPDATE rows with null values in PurchDB.Vendors table 3 . . . DELETE rows from PurchDB.Vendors table 4 . . . INSERT rows into PurchDB.Vendors table Enter choice or 0 to STOP > 3 *** Function to DELETE rows from PurchDB.Vendors *** Enter Vendor Number to DELETE from Vendors Table or 0 for MENU > 9016 Begin Work SELECT * from PurchDB.Vendors VendorNumber: 9016 VendorName: Wolfe Works ContactName: Stanley Wolfe PhoneNumber: 408 975 6061 VendorStreet: 7614 Canine Way VendorCity: San Jose VendorState: CA VendorZipCode: 90016 VendorRemarks: can expedite shipments Is it OK to DELETE this row (N/Y)? > Y DELETE row from PurchDB.Vendors Commit Work Enter Vendor Number to DELETE from Vendors Table or 0 for MENU > 0 1 . . . SELECT rows from PurchDB.Vendors table 2 . . . UPDATE rows with null values in PurchDB.Vendors table 3 . . . DELETE rows from PurchDB.Vendors table 4 . . . INSERT rows into PurchDB.Vendors table Enter choice or 0 to STOP > 0 Figure 5-4 Program cex7: Using INSERT, UPDATE, SELECT and DELETE 
/* Program cex7 */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* This program illustrates the use of SQL's data manipulation     */
/* commands for simple operations.  It uses the UPDATE             */
/* command with indicator variables to update any row in the       */
/* Vendors table that contains null values. It also uses indicator */
/* variables in conjunction with SELECT and INSERT commands.       */
/* The DELETE command is also illustrated.                         */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
typedef int boolean;
boolean     Abort;
int         response1;
char        response2[2];
#include <stdio.h>
#define    OK                 0
#define    NotFound         100
#define    MultipleRows  -10002
#define    DeadLock      -14024
#define    FALSE              0
#define    TRUE               1
sqlca_type sqlca;    /* SQL Communication Area */
          /* Begin Host Variable Declarations */
    EXEC SQL BEGIN DECLARE SECTION;
    int       VendorNumber;
    char      VendorName[31];
    char      ContactName[31];
    sqlind    ContactNameInd;
    char      PhoneNumber[16];
    sqlind    PhoneNumberInd;
    char      VendorStreet[31];
    char      VendorCity[21];
    char      VendorState[3];
    char      VendorZipCode[11];
    char      VendorRemarks[61];
    sqlind    VendorRemarksInd;
    char      SQLMessage[133];
    EXEC SQL END DECLARE SECTION;
          /* End Host Variable Declarations */
int getline(linebuff)   /* Function to get a line of characters */
char linebuff[80];
{
while (strlen(gets(linebuff)) == 0);
}     /* End of function to get a line of characters  */
int SQLStatusCheck()  /* Function to Display Error Messages */   16 
{
Abort = FALSE;
if (sqlca.sqlcode < DeadLock) Abort = TRUE;
do {
EXEC SQL SQLEXPLAIN :SQLMessage;                                 1 
printf("%s\n",SQLMessage);
} while (sqlca.sqlcode != 0);
if (Abort) ReleaseDBE();
}  /* End SQLStatusCheck Function */
boolean ConnectDBE()  /* Function to Connect to PartsDBE */
                                                                 51 
{
boolean ConnectDBE;
printf("\n Connect to PartsDBE");
EXEC SQL CONNECT TO 'PartsDBE';                                  2 
ConnectDBE = TRUE;
if (sqlca.sqlcode != OK) {
  ConnectDBE = FALSE;
  SQLStatusCheck();
  }  /* End if */
return (ConnectDBE);
}  /* End of ConnectDBE Function */
int ReleaseDBE()   /* Function to Release PartsDBE */
                                                                 53 
{
printf("\n Release PartsDBE");
printf("\n");
EXEC SQL RELEASE;                                                3 
if (sqlca.sqlcode != OK) SQLStatusCheck();
}  /* End ReleaseDBE Function */
boolean BeginTransaction()    /* Function to Begin Work */       11 
{
boolean BeginTransaction;
printf("\n");
printf("\n Begin Work");
EXEC SQL BEGIN WORK;                                             4 
if (sqlca.sqlcode != OK)  {
  BeginTransaction = FALSE;
  SQLStatusCheck();
  ReleaseDBE();
  }
else
  BeginTransaction = TRUE;
return (BeginTransaction);
}  /* End BeginTransaction Function */
int EndTransaction()  /* Function to Commit Work */              17 
{
printf("\n");
printf("\n Commit Work");
EXEC SQL COMMIT WORK;                                            5 
if (sqlca.sqlcode != OK) {
  SQLStatusCheck();
  ReleaseDBE();
  }
}  /* End EndTransaction Function */
boolean AnyNulls()     /* Function to test a row for null values  */
{
boolean AnyNulls;
AnyNulls = TRUE;
if ((ContactNameInd == 0)&(PhoneNumberInd == 0)&(VendorRemarksInd == 0)) {
  /* All columns that might be null contain non-null values */   6 
  printf("\n No null values exist for this vendor!");            7 
  AnyNulls = FALSE;
  }
return (AnyNulls);
}  /* End of AnyNulls Function */
int DisplayRow()   /* Function to Display Parts Table Rows */    13 
{
  printf("\n");
  printf("Vendor Number:      %10d\n", VendorNumber);
  printf("Vendor Name:        %s\n", VendorName);
  if (ContactNameInd != 0) {                                     8 
    printf("Contact Name:       is NULL \n");
    }
  else
    printf("Contact Name:       %s\n", ContactName);
  if (PhoneNumberInd != 0) {                                     8 
    printf("Phone Number:       is NULL \n");
    }
  else
    printf("PhoneNumber:        %s\n", PhoneNumber);
  printf("VendorStreet:       %s\n", VendorStreet);
  printf("VendorCity:         %s\n", VendorCity);
  printf("VendorState:        %s\n", VendorState);
  printf("VendorZipCode:      %s\n", VendorZipCode);
  if (VendorRemarksInd != 0) {                                   8 
    printf("Vendor Remarks:     is NULL \n");
    }
  else
    printf("VendorRemarks:      %s\n", VendorRemarks);
}  /* End of DisplayRow */
int Select()    /* Function to Query Parts Table */              9 
{
printf("\n");
printf("\n  *** Function to SELECT a row from the Vendors table. ***");
printf("\n");
do {
printf("\nEnter Vendor Number to SELECT from Vendors Table or 0 for
MENU>");
  while (scanf("%d%*c", &VendorNumber) == 0;|                     10 
  if (VendorNumber != 0) {
    BeginTransaction();                                          11 
    printf("\n");
    printf("\n SELECT * from PurchDB.Vendors");
    EXEC SQL SELECT  VendorNumber,                               12 
                     VendorName,
                     ContactName,
                     PhoneNumber,
                     VendorStreet,
                     VendorCity,
                     VendorState,
                     VendorZipCode,
                     VendorRemarks
               INTO :VendorNumber,
                    :VendorName,
                    :ContactName :ContactNameInd,
                    :PhoneNumber :PhoneNumberInd,
                    :VendorStreet,
                    :VendorCity,
                    :VendorState,
                    :VendorZipCode,
                    :VendorRemarks :VendorRemarksInd
               FROM  PurchDB.Vendors
              WHERE  VendorNumber = :VendorNumber;
    switch(sqlca.sqlcode) {
      case  OK:           DisplayRow();                          13 
                          break;
      case  NotFound:     printf("\n");
                          printf("\n Row not found!");           14 
                          break;
      case  MultipleRows: printf("\n");
                          printf("\nWARNING: More than one row qualifies!");
                          break;                                 15 
      default:            SQLStatusCheck();                      16 
                          break;
      }  /* End switch */
    EndTransaction();                                            17 
    }  /* End if */
} while (VendorNumber != 0);
}   /* End of Select Function */
int DisplayUpdate()   /* Display & Update row in Parts Table */  27 
{
DisplayRow();                                                    18 
if (AnyNulls) {
  if (ContactNameInd != 0) {                                     19 
    printf("\n");
    printf("\n Enter new Contact Name or 0 for NULL > ");        20 
    getline(ContactName);
    }
  if (PhoneNumberInd != 0) {                                     19 
    printf("\n");
    printf("\n Enter new Phone Number of 0 for NULL > ");        20 
    getline(PhoneNumber);
    }
  if (VendorRemarksInd != 0) {                                   19 
    printf("\n");
    printf("]\n Enter new Vendor Remarks or 0 for NULL > ");     20 
    getline(VendorRemarks);
    }
  if (ContactName[0] == '0') ContactNameInd = -1;                21 
  else
    ContactNameInd = 0;
  if (PhoneNumber[0] == '0') PhoneNumberInd = -1;                21 
  else
    PhoneNumberInd = 0;
  if (VendorRemarks[0] == '0') VendorRemarksInd = -1;            21 
  else
    VendorRemarksInd = 0;
printf("\n");
printf("\n UPDATE the Vendors Table");
EXEC SQL UPDATE PurchDB.Vendors                                  22 
            SET ContactName =   :ContactName :ContactNameInd,
                PhoneNumber =   :PhoneNumber :PhoneNumberInd,
                VendorRemarks = :VendorRemarks :VendorRemarksInd
          WHERE VendorNumber =  :VendorNumber;
if (sqlca.sqlcode != OK )  SQLStatusCheck();
}   /* End if AnyNulls */
}   /* End of DisplayUpdate Function */
int Update()    /* Update a row within the Parts Table */        23 
{
printf("\n");
printf("\n  *** Function to UPDATE rows in PurchDB.Vendors ***");
printf("\n");
do {
printf("\n Enter Vendor Number to UPDATE in Vendors Table or 0 for MENU >");
while (scanf("%d%*c", &VendorNumber) == 0);                      24 
if (VendorNumber != 0) {
  BeginTransaction();                                            25 
  printf("\n");
  printf("\n SELECT * from PurchDB.Vendors");
    EXEC SQL SELECT  VendorNumber,                               26 
                     VendorName,
                     ContactName,
                     PhoneNumber,
                     VendorStreet,
                     VendorCity,
                     VendorState,
                     VendorZipCode,
                     VendorRemarks
               INTO :VendorNumber,
                    :VendorName,
                    :ContactName :ContactNameInd,
                    :PhoneNumber :PhoneNumberInd,
                    :VendorStreet,
                    :VendorCity,
                    :VendorState,
                    :VendorZipCode,
                    :VendorRemarks :VendorRemarksInd
               FROM  PurchDB.Vendors
              WHERE  VendorNumber = :VendorNumber;
  if (sqlca.sqlcode == OK)
    DisplayUpdate();                                             27 
  else if (sqlca.sqlcode == NotFound)
    printf("\n Row not found!");                                 28 
  else if (sqlca.sqlcode == MultipleRows)
    printf("\n WARNING: More than one row qualifies!");          29 
  else
    SQLStatusCheck();                                            30 
EndTransaction();                                                31 
}  /* End if */
} while (VendorNumber != 0);
}  /* End of Update Function */
int DisplayDelete()   /* Display & optionally Delete Rows */     39 
{
DisplayRow();                                                    32 
printf("\n");
printf("\n Is it OK to DELETE this row (N/Y) ? > ");             33 
scanf("%s",response2);
if ((response2[0] == 'Y') || (response2[0] == 'y')) {
  printf("\n");
  printf("\n DELETE Row from PurchDB.Vendors Table");
  EXEC SQL DELETE FROM PurchDB.Vendors                           34 
            WHERE VendorNumber = :VendorNumber;
  if (sqlca.sqlcode != OK)   SQLStatusCheck();
  }
}  /* End of DisplayDelete */
int Delete() /* Function to Delete a row from the Parts Table */ 35 
{
printf("\n");
printf("\n  *** Function to DELETE rows from PurchDB.Vendors ***");
printf("\n");
do {
printf("\nEnter Vendor Number to DELETE from Vendors Table or 0 for MENU>");
while(scanf("%d%*c", &VendorNumber) == 0);                       36 
if (VendorNumber != 0) {
  BeginTransaction();                                            37 
  printf("\n");
  printf("\n SELECT * from PurchDB.Vendors");
    EXEC SQL SELECT  VendorNumber,                               38 
                     VendorName,
                     ContactName,
                     PhoneNumber,
                     VendorStreet,
                     VendorCity,
                     VendorState,
                     VendorZipCode,
                     VendorRemarks
               INTO :VendorNumber,
                    :VendorName,
                    :ContactName :ContactNameInd,
                    :PhoneNumber :PhoneNumberInd,
                    :VendorStreet,
                    :VendorCity,
                    :VendorState,
                    :VendorZipCode,
                    :VendorRemarks :VendorRemarksInd
               FROM  PurchDB.Vendors
              WHERE  VendorNumber = :VendorNumber;
  if (sqlca.sqlcode == OK)
    DisplayDelete();                                             39 
  else if (sqlca.sqlcode == NotFound)
    printf("\n Row not found!");                                 40 
  else if (sqlca.sqlcode == MultipleRows)
    printf("\n WARNING: More than one row qualifies!");          41 
  else
    SQLStatusCheck();                                            42 
  EndTransaction ();                                             43 
  }  /* End if */
} while (VendorNumber != 0);
}  /* End of Delete */
int Insert()     /* Insert a row into the Parts Table */         44 
{
printf("\n");
printf("\n  *** Function to INSERT rows into PurchDB.Vendors ***");
printf("\n");
do {
VendorNumber = 0;
printf("\nEnter Vendor Number to INSERT into Vendors Table or 0 for MENU>");
while(scanf("%d%*c", &VendorNumber) == 0);                       45 
if (VendorNumber != 0)  {
  printf("\n Enter Vendor Name > ");
  getline(VendorName);
  printf("\n Enter Contact Name or a 0 for NULL > ");            46 
  getline(ContactName);
  if (ContactName[0] == '0') ContactNameInd = -1;                47 
  else
    ContactNameInd = 0;
  printf("\n Enter Phone Number or a 0 for NULL > ");            46 
  getline(PhoneNumber);
  if (PhoneNumber[0] == '0') PhoneNumberInd = -1                 47 
  else
    PhoneNumberInd = 0;
  printf("\n Enter Vendor Street > ");
  getline(VendorStreet);
  printf("\n Enter Vendor City > ");
  getline(VendorCity);
  printf("\n Enter Vendor State > ");
  getline(VendorState);
  printf("\n Enter Vendor Zip Code > ");
  getline(VendorZipCode);
  printf("\n Enter Vendor Remarks or a 0 for NULL > ");          46 
  getline(VendorRemarks);
  if (VendorRemarks[0] == '0') VendorRemarksInd = -1;            47 
  else
    VendorRemarksInd = 0;
  BeginTransaction();                                            48 
  printf("\n");
  printf("\n INSERT row into PurchDB.Vendors");
  EXEC SQL INSERT                                                49 
             INTO  PurchDB.Vendors
                  (VendorNumber,
                   VendorName,
                   ContactName,
                   PhoneNumber,
                   VendorStreet,
                   VendorCity,
                   VendorState,
                   VendorZipCode,
                   VendorRemarks)
          VALUES (:VendorNumber,
                  :VendorName,
                  :ContactName :ContactNameInd,
                  :PhoneNumber :PhoneNumberInd,
                  :VendorStreet,
                  :VendorCity,
                  :VendorState,
                  :VendorZipCode,
                  :VendorRemarks :VendorRemarksInd);
  if (sqlca.sqlcode != OK) SQLStatusCheck();
  EndTransaction();                                              50 
  }  /* End if */
} while (VendorNumber != 0);
}  /* End of Insert */
main()          /* Beginning of program */
{
printf("\n Program for Simple Data Manipulation of Vendors Table-cex7")
printf("\n");
if (ConnectDBE())  {                                             51 
  do {
  printf("\n");                                                  52 
  printf("\n 1 . . .SELECT rows from PurchDB.Vendors Table");
  printf("\n 2 . . .UPDATE rows with NULL values in PurchDB.Vendors Table");
  printf("\n 3 . . .DELETE rows from PurchDB.Vendors Table");
  printf("\n 4 . . .INSERT rows into PurchDB.Vendors Table");
  printf("\n");
  printf("\n Enter choice or 0 to STOP > ");
  scanf("%2d%*c", &response1);
  if (response1 != 0)  {
      switch (response1) {                                       50 
       case  1:  Select();                                        9 
                 break;
       case  2:  Update();                                       23 
                 break;
       case  3:  Delete();                                       35 
                 break;
       case  4:  Insert();                                       44 
                 break;
       default:  printf("\n Enter 0-4 only, please!");
                 break;
      } /* switch */
    }  /* End if response1 */
  } while ( response1 != 0);
  ReleaseDBE();                                                  53 
}  /* End if Connect */
else
  printf("\n Error: Cannot Connect to PartsDBE!\n");
}  /* End of Program */
 | 
|||||||||||||||||||||||||||||||||||||||||||