Gistrec

БД 5

Nov 14th, 2019
250
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.24 KB | None | 0 0
  1. #include <sqlca.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <sys/time.h>
  6. #include <unistd.h>
  7. #include <sqltypes.h>
  8.  
  9. void error_func(char* message) {
  10.     printf("Message: %s\n", message);
  11.     printf("Error code: %d\n", sqlca.sqlcode);
  12.     printf("Error message: %s\n", sqlca.sqlerrm.sqlerrmc);
  13. }
  14.  
  15. int main() {
  16.     EXEC SQL begin declare section;
  17.     char queryFirst[]  = "SELECT ROUND(SUM(t.sves), 2) sum                "
  18.                          "FROM (SELECT spj.n_post, AVG(spj.kol*p.ves) sves"
  19.                          "      FROM spj                                  "
  20.                          "      JOIN p ON p.n_det = spj.n_det             "
  21.                          "      GROUP BY spj.n_post                       "
  22.                          "      ORDER BY 1) t                             ";
  23.  
  24.     char querySecond[] = "SELECT t.n_izd, j.name, j.town, t.sves                    "
  25.                          "FROM (SELECT spj.n_izd, ROUND (AVG (spj.kol*p.ves),2) sves"
  26.                          "      FROM spj                                            "
  27.                          "      JOIN p ON p.n_det = spj.n_det                       "
  28.                          "      WHERE spj.n_det = ?                                 "
  29.                          "      GROUP BY spj.n_izd) t                               "
  30.                          "JOIN j ON t.n_izd = j.n_izd                               "
  31.                          "ORDER BY n_izd                                            ";
  32.  
  33.     char queryThird[]  = "SELECT a.n_izd, a.sves, b.oves, ROUND(a.sves*100.0/b.oves,2) proc "
  34.                          "FROM (SELECT spj.n_izd, ROUND(SUM(spj.kol), 2) sves               "
  35.                          "      FROM spj                                                    "
  36.                          "      WHERE spj.n_det = ?                                         "
  37.                          "      GROUP BY spj.n_izd )a                                       "
  38.                          "CROSS JOIN (SELECT SUM (spj.kol) oves                             "
  39.                          "            FROM spj                                              "
  40.                          "            WHERE spj.n_det = ?) b                                ";
  41.  
  42.     char arg[20];  // аргумент для запросов
  43.  
  44.     char n_izd[5];
  45.     char name[40];
  46.     char town[40];
  47.     float sum;
  48.     float sves;
  49.     float oves;
  50.     float proc;
  51.  
  52.     EXEC SQL end declare section;
  53.  
  54.  
  55.     /*********************\
  56.     |* Подключаемся к БД *|
  57.     \*********************/
  58.     exec sql connect to students@fpm2.ami.nstu.ru user "pmi-b6103" using "juIppOw";
  59.     if(sqlca.sqlcode != 0) {
  60.         error_func("Authentication failed");
  61.         return 1;
  62.     }
  63.  
  64.     /*******************************************************\
  65.     |* Устанавливаем схему, в которой будем искать таблицу *|
  66.     \*******************************************************/
  67.     EXEC SQL set search_path to pmib6103;
  68.  
  69.     if(sqlca.sqlcode != 0) {
  70.         printf("Error\n");
  71.         return 2;
  72.     }
  73.  
  74.  
  75.     int num= 1 ;
  76.     while(num!=0) {
  77.         printf("\nEnter query number: 1,2,3 or 0 for exit\n");
  78.         scanf("%d", &num);   // ввод номера запроса
  79.  
  80.         switch(num) {
  81.             case 1:
  82.                 printf("First query\n");
  83.  
  84.                 EXEC SQL prepare query1 FROM :queryFirst;
  85.                 if(sqlca.sqlcode < 0) {
  86.                     error_func("Preparing error in first query");
  87.                     break;
  88.                 }
  89.  
  90.                 Exec SQL execute query1 INTO :sum;
  91.                 if(sqlca.sqlcode < 0) {
  92.                     error_func("Execution error in first query");
  93.                     break;
  94.                 } else {
  95.                     printf("Result query: %.2f\n", sum);
  96.                 }
  97.                 break;
  98.  
  99.             case 2:
  100.                 printf("Second query\n");
  101.  
  102.                 printf("\nEnter arg: ");
  103.                 scanf("%s", arg);
  104.  
  105.                 EXEC SQL prepare query2 FROM :querySecond;
  106.                 if(sqlca.sqlcode < 0) {
  107.                     error_func("Preparing error in second query");
  108.                     break;
  109.                 }
  110.  
  111.                 EXEC SQL declare curs2 cursor for query2; // определение курсора для нашего запроса
  112.                 EXEC SQL open curs2 using :arg;
  113.  
  114.                 if(sqlca.sqlcode < 0) {
  115.                     error_func("Opening cursor error in second query");
  116.                     break;
  117.                 }
  118.  
  119.                 EXEC SQL fetch curs2 INTO :n_izd, :name, :town, :sves;// результат запроса - множество значений
  120.                 while(sqlca.sqlcode==0) {
  121.                     printf("%s  %s  %s  %.2f\n", n_izd, name, town, sves);
  122.                     EXEC SQL fetch curs2 INTO :n_izd, :name, :town, :sves;
  123.                 }
  124.  
  125.                 if (sqlca.sqlcode != 100) error_func("Internal error");
  126.                 break;
  127.  
  128.             case 3:
  129.                 printf("Third query\n");
  130.  
  131.                 printf("\nEnter arg: ");
  132.                 scanf("%s", arg);
  133.  
  134.                 EXEC SQL prepare query3 FROM :queryThird;
  135.                 if(sqlca.sqlcode < 0) {
  136.                     error_func("Preparing error in third query");
  137.                     break;
  138.                 }
  139.  
  140.                 EXEC SQL declare curs3 cursor for query3; // определение курсора для нашего запроса
  141.                 EXEC SQL open curs3 using :arg, :arg;
  142.  
  143.                 if(sqlca.sqlcode < 0) {
  144.                     error_func("Opening cursor error in third query");
  145.                     break;
  146.                 }
  147.  
  148.                 EXEC SQL fetch curs3 INTO :n_izd, :sves, :oves, :proc;// результат запроса - множество значений
  149.                 while(sqlca.sqlcode==0) {
  150.                     printf("%.2s  %.2f  %.2f  %.2f\n", n_izd, sves, oves, proc);
  151.                     EXEC SQL fetch curs3 INTO :n_izd, :sves, :oves, :proc;
  152.                 }
  153.  
  154.                 if (sqlca.sqlcode != 100) error_func("Internal error");
  155.                 break;
  156.         }
  157.     }
  158.     return 0;
  159. }
Comments
  • User was banned
Add Comment
Please, Sign In to add comment