Формирование выводов запросов

Автор: Пользователь скрыл имя, 16 Декабря 2011 в 07:17, реферат

Описание работы

Большинство основанных на SQL баз данных предоставляют специальные средства, позволяющие совершенствовать вывод ваших запросов. Конечно, они претерпевают значительные изменения от программы к программе, и их обсуждения здесь не будет, однако имеются пять особенностей, созданных в стандарте SQL, которые позволяют вам делать нечто большее, чем просто вывод значений полей и агрегатных данных.

Работа содержит 1 файл

ФОРМИРОВАНИЕ ВЫВОДА ЗАПРОСОВ.doc

— 205.50 Кб (Скачать)

EXEC SQL BEGIN DECLARE SECTION;

   SQLCODE:   integer;

   odernum      integer;

   cnum         integer;

   snum         integer;

   custnum:     integer;

   salesnum:    integer;

EXEC SQL END DECLARE SECTION;

EXEC SQL DECLARE Wrong_Orders AS CURSOR FOR

   SELECT onum, cnum, snum

      FROM Orders a

      WHERE snum < >

        (SELECT snum

            FROM Customers b

WHERE a.cnum = b.cnum);

EXEC SQL DECLARE Cust _ assigns AS CURSOR FOR

   SELECT cnum, snum

      FROM Customers;

begin { основная программа }

EXEC SQL OPEN CURSOR Wrong_Orders;

while SQLCODE = O do {Цикл  до тех пор пока Wrong_Orders

не опустеет}

   begin

   EXEC SQL FETCH Wrong_Orders

      INTO (:odernum, :cnum, :snum);

   if SQLCODE = O then

       begin

       EXEC SQL OPEN CURSOR Cust_Assigns;

       repeat

          EXEC SQL FETCH Cust_Assigns

             INTO (:custnum, :salesnum);

       until :custnum = :cnum; 

       EXEC SQL CLOSE CURSOR Cust_assigns;

       EXEC SQL UPDATE Orders

          SET snum = :salesnum

          WHERE CURRENT OF Wrong_Orders;

      end; {If SQLCODE = 0}

    end; { While SQLCODE . . . do }

EXEC SQL CLOSE CURSOR Wrong_Orders;

end; { main program }

3. EXEC SQL BEGIN DECLARE SECTION;

      SQLCODE  integer;

      newcity      packed array[1. .12] of char;

      commnull    boolean;

      citynull     boolean;

      response    char; 

   EXEC SQL END DECLARE SECTION;

   EXEC SQL DECLARE CURSOR Salesperson AS

      SELECT * FROM SALESPEOPLE;

   begln { main program }

   EXEC SQL OPEN CURSOR Salesperson;

   EXEC SQL FETCH Salesperson

      INTO (:snum, :sname, :city:i_cit, :comm:i_com); 

{Выборка первой  строки}

while SQLCODE = O do

{Пока эти  строки в таблице Продавцов.}

      begin

      if i_com < O then commnull: = true;

      if i_cit < O then citynull: = true;

{Установить  логические флаги, которые могут показать NULLS.} 

      if citynull then

            begin

            write  ('Нет текущего значения city для продавца ',

            snum,   ' Хотите предоставить  хотя бы одно? (Y/N)'); 

{Подсказка покажет  значение city, состоящее из NULL-значений.} 

             read (ответ); 

{Ответ может  быть сделан позже.} 

             end {если конечно - citynull} 

      else { не citynull }

          begin

          if not commnull then 

{Чтобы выполнять  сравнение и операции только  для не-NULL значений связи}

              begin

              if city = 'London' then comm: = comm * .02 * .02

                    else comm: = comm + .02;

              end;

{Даже если  значение и не commnull, begin и end здесь  для ясности.} 

         write ('Текущий city для продавца',

                 snum, 'есть', city,

                 Хотите его изменить? (Y/N)');

3.  Обратите Внимание: Продавец, не назначенный в данное время

    в  определенный город, не будет  иметь изменений комиссионных

    при  определении того, находится ли он в Лондоне. 

    read (ответ); 

    {Ответ  теперь имеет значение, независимо  от того, верен или неверен  citynull.} 

          end; {иначе не citynull}

    if response = 'Y' then

          begin

          write ('Введите новое значение city:');

          read (newcity);

          if not commnull then 

    {Эта операция может быть выполнена только для не-NULL значений.} 

              case newcity of:

                 begin

                'Barcelona':comm:= comm + .01,

                'San Jose': comm: = comm *.01

                 end; {случно и если не commnull}

          EXEC SQL UPDATE Salespeople

             SET city = :newcity, comm = :comm:i_com

             WHERE CURRENT OF Salesperson; 

    {Переменная  индикатора может поместить NULL-значение в поле comm, если так назначено.} 

             end; {Если ответ = 'Y' или если  ответ < > 'Y', изменений не будет.} 

             EXEC SQL FETCH Salesperson

                INTO (:snum, :sname, :city:i_clt,

                 :comm:l_com); 

{выборка следующей строки} 

   end; {если SQLCODE = 0}

   EXEC SQL CLOSE CURSOR Salesperson;

   end; {основной программы} 

Информация о работе Формирование выводов запросов