CHAPTER 3: SQL プリコンパイラ サンプルプログラム


以下の C プログラムは、埋め込みEmpress SQLステートメントを使用した プログラムで、この中ではいくつかのコマンドが示され、コンセプトが含まれています。 このプログラムは、テストデータベース repairsにアクセスしします。 プログラムの実行は、このデータベースが置かれているディレクトリから起動する必要があります。

注意

このプログラムをプリコンパイルする場合、-ptrを指定してください。

   # include <mscc.h>
   
   # define       DOLLSIZE    25
   
   extern         double      dollcvt ();
   
   EXEC SQL INCLUDE SQLCA;
   
   EXEC SQL BEGIN DECLARE SECTION;
        char      name[64], date[10], amount[10];
        char      newamount[10];
   EXEC SQL END DECLARE SECTION;
   
   main ()
   {
        double     sum, dollars, interest, total;
   
        EXEC SQL INIT;
        err_check( SQLCODE, "init" );
   
        EXEC SQL DATABASE IS "repairs";
        err_check( SQLCODE, "database is" );
   
        EXEC SQL OPEN_TABLE "loans" FOR UPDATE;
        err_check( SQLCODE, "open_table" );
   
        EXEC SQL DECLARE pers_name CURSOR
            FOR SELECT name FROM personnel;
        err_check( SQLCODE, "declare pers_name" );
   
        EXEC SQL OPEN pers_name;
        err_check( SQLCODE, "open pers_name" );
   
        EXEC SQL FETCH pers_name name INTO :name;
        err_check( SQLCODE, "fetch pers_name" );
   
        EXEC SQL DECLARE date_amount CURSOR
            FOR SELECT date, amount FROM loans
            WHERE name = :name FOR UPDATE;
        err_check( SQLCODE, "declare date_amount" );
   
        while (SQLCODE != 100)
        {
             printf ("()Monthly Statement for %s:()", name );
             printf (" Loan    Date Made    Interest Total()" );
   
             sum = -1;
   
             EXEC SQL OPEN date_amount;
             err_check( SQLCODE, "open date_amount" );
   
             EXEC SQL FETCH date_amount date, amount
                  INTO :date, :amount;
             err_check( SQLCODE, "fetch date_amount" );
   
             while ( SQLCODE != 100 )
             {
                  dollars = dollcvt(amount);
                  interest = dollars * 0.02;
                  total = dollars + interest;
                  sum += total;
   
                  sprintf (newamount, "%6.2f", total);
   
                  printf ("$%-6.2f     %s      $%-6.2f     $%s()",
                     dollars, date, interest, newamount);
   
                  EXEC SQL UPDATE loans
                  SET amount = :newamount
                  WHERE CURRENT OF date_amount;
   
                  if (SQLCODE == -8)
                       fprintf (stderr, "Conversion error:
                          cannot convert '%f'
                          for 'amount'()", newamount);
   
                  EXEC SQL FETCH date_amount date, amount
                  INTO :date, :amount;
                  err_check( SQLCODE, "fetch date_amount" );
             }
             EXEC SQL CLOSE date_amount;
             err_check( SQLCODE, "close date_amount" );
             if (sum > 0)
                 printf ("()Total now owing: $%-6.2f ()", sum);
             else
                 printf ("()No loans outstanding.()");
   
             EXEC SQL FETCH pers_name name
                 INTO :name;
             err_check( SQLCODE, "fetch pers_name" );
        }
        EXEC SQL CLOSE pers_name;
        err_check( SQLCODE, "close pers_name" );
   
        EXEC SQL CLOSE_TABLE loans, personnel;
        err_check( SQLCODE, "close_table" );
   
        EXEC SQL EXIT;
   }

   double dollcvt (string)
   
        char      *string;
   
   {
        extern      double     atof ();
        char     c, buffer [DOLLSIZE], *buf_ptr;
   
        for (buf_ptr = buffer; (c = *string++)
                                != '\0';)
             if (c != '$' &&
                c != '*' &&
                c != ' ' &&
                c != ',')
             *buf_ptr++ = c;
        *buf_ptr = '\0';
        return (atof (buffer));
   }
   
   err_check( sqlcode, sql_string )
   char  *sql_string;
   int     sqlcode;
   {
        if ( sqlcode != 0 && sqlcode != 100)
        {
             fprintf( stderr, "SQL error, code %d, in line
                  'exec sql ... %s ' n",sqlcode,
                  sql_string);
             EXEC SQL EXIT;
         }
   }