Страницы

5 июля 2012 г.

pgScript. Иллюстрация еще одного рабочего примера.

Доброго времени суток.
       Опыт изучения технической литературы показывает, что трудно уяснить теорию не закрепленную примерами. Да, я стараюсь везде выкладывать примеры использование тех или иных инструкций, но разница между "школьными" примерами и боевыми рабочими скриптами все таки колоссальна. Я буду стараться выгружать сюда как можно больше разнообразной практики, чтобы остальным было легче понять и разобраться в нюансах. И, может быть, сделать мне пару замечаний, ибо я все же еще новичок.
       Итак, вот собственно скрипт:

declare
 @SesNULLRec,
 @i,
 @max_prev_session;
begin
 /*Выгружаем все пропущенные сессиии в таблице security_price*/
 set @SesNULLRec = select distinct ses.id_session
  from session ses
  left join security_price sp on ses.id_session = sp.id_session
  where sp.id_session is null;

 --счетчик цикла (индекс значений в SesNULLRec)
 set @i = 0;
 while @SesNULLRec[@i][0] --пока значение есть...
 begin
  --пристваиваем отдельной пеерменной значение RECORD-переменной, ибо RECORD неправильно интерпретируется
  --select запросом
  set @max_prev_session = @SesNULLRec[@i][0]; -- строка i, столбец 0
  --выводим значение (для информативности)
  print @max_prev_session;

  /*Вставить в security_price записи из security_price с наибольшим идентификатором сессии который
  меньше чем указанный (указанный в данном случае - это тот который отсуствует в таблице security_price)
  Короче: Если в security_price нет записей за нужную сессию, копируем записи из ближайшей последней
  сессии подставляем идентификатор НУЖНОЙ, тем самым восполняя пробелы...*/
  insert into security_price (id_security, id_session, lot_size, cur_price)
  select
   id_security,
   @max_prev_session::bigint, -- нужной сессии
   lot_size,
   cur_price
  from 
   security_price
  where id_session in ( -- максимальный идентификатор предшествующей сессии
   select
    max(id_session)
   from security_price
   where id_session < @max_prev_session::bigint
   );

  --наращиваем счетчик цикла (индекс значений в SesNULLRec)
  set @i = @i+1;
 end
end

Думаю комментариев в данном скрипте достаточно и дополнительные объяснения будут лишними.

При написании данного скрипта я изредка поглядывал с статьи:
pgScript. Написание простых скриптов. Первый опыт.
pgScript. Использование типа RECORD

Комментариев нет:

Отправить комментарий