Страницы

7 августа 2012 г.

Дизайн блога. Нужны рекомендации...

Доброго времени суток Вам, уважаемые. :)
       Со временем, относительно разных вещей в жизни, приходит понимание, что надо что-то менять.

       Обратил внимание на дизайн своего блога. В последнее время мне все больше кажется, что что-то нужно изменить. Никак не могу до конца определить что не так. Может все слишком темно и мрачно? Может цвета подобраны не так? Может нужно еще что-то добавить или убрать? А может вобще все изменить? Вобщем я не могу определиться как улучшить внешний вид и читабельность блога...

Что бы Вы поменяли в этом блоге, чтобы Вам было приятнее его читать?

Заранее благодарен за советы. :)

2 августа 2012 г.

PostgreSQL. Логирование исключений. Часть 2. Реализация.

Hello World! :)

       В данном посте мне хотелось бы продолжить тему разработки логирования исключений для PostgreSQL. В предыдущем посте я обозначил требования и способы реализации. Сейчас я хочу приступить непосредственно к реализации.

       Как я и говорил, этим хранилищем будет являтсья таблица. В соответствии с описанием в предыдущем посте, я определил все необходимые мне поля. Получился следующий скрипт:



CREATE TABLE sys.exception_log
(
  id_exception_log bigserial NOT NULL, -- идентификатор записи
  exception_time timestamp without time zone NOT NULL, --время исключения
  exception_code character varying NOT NULL DEFAULT 0, --код исключения
  exception_message character varying NOT NULL, --сообщение
  exception_query text NOT NULL, --текст запроса возбудившего исключение
  exception_label character varying, --метка
  usr_name character varying NOT NULL, --пользователь запустивший запрос
  server_version character varying NOT NULL, --версия сервера PostgreSQL
  db_location character varying NOT NULL, -- локация сервера
  client_location character varying NOT NULL, --локация удаленного клиента
  CONSTRAINT pk_exception_log_id_exception_log PRIMARY KEY (id_exception_log)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE sys.exception_log OWNER TO postgres;


PostgreSQL. Логирование исключений. Часть 1. Требования, тесты, поиски вариантов.

       Добро пожаловать в "Будни программиста".
       Сегодня я хотел бы начать освящать вопрос логирования исключительных ситуаций происходящих во время выполнения хранимых процедур. Не буду говорить о пользе такого функционала, ибо, думаю, это и так понятно. Скажу только, что из-за отсутствия такого функционала вчера пришлось потратить более часа на локализацию исключения возникающего у клиента, и чуть более минуты на устранение причины исключения.

Что нужно от логирования?

  1. Доступное хранилище лога исключений;
  2. Добавление в лог новых записей при возникновении исключений любого типа;
  3. Возможность хранения кода и текстового сообщения исключения;
  4. Необходимо хранить данные для локализации. В идеале SQL-запрос который вызвал исключение (в т.ч. имя хранимки (породившей исключение) с указанными значениями параметров); 
  5. Способ разметки областей хранимой процедуры для более точной локализации возникновения исключений.

1 августа 2012 г.

PostgreSQL. Методы проверки результатов выполнения запроса

Доброго времени суток.
       Я относительно недавно начал пользоваться PostgreSQL, и каждый день приносит мне новые открытия, которые я хотел бы законспектировать.

       Итак, в PostgreSQL есть способы проанализировать результаты выполенения запросов на предмет наличия возвращаемых данных. Ранее, я делал что-то типа:

if not exists(select null from table where rec_id = record_id) then
 insert... ;
else
 update... ;
end if;

Этот способ бесспорно работает, но PostgreSQL предоставлет более изящные решения, например: 

PostgreSQL. Полезные запросы к системным таблицам

Доброго времени суток.
Создаю очередную памятку полезных запросов, к которым время от времени приходится обращаться. Возможно настолько редко, что без памятки не обойтись.
Запросы будут как самописные так и взятые из различны источников (во избежание изобретения велосипедов).

Пост будет постоянно расширяться.

Запросы под катом.

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

18 июня 2012 г.

PostgreSQL. Обработка исключений внутри функций.

Добро пожаловать в "Будни программиста"
       Сегодня вернулся к написанию хранимых процедур на plpgsql. После долгого периода некоторые моменты изрядно подзабылись. В том числе и синтаксис, да и вообще механизм обработки исключений. В связи с этим, хочу создать этот пост-пометку. Надеюсь он мне больше не понадобится, ибо если я забуду это еще раз, надо будет бежать к хирургу и просить вставить еще пару планок памяти :).

       Общий синтаксис функции с обработчиком исключений выглядит следующим образом:

[ DECLARE
 declarations ]
BEGIN
 statements
EXCEPTION
 WHEN condition [ OR condition ... ] THEN
  handler_statements
 [ WHEN condition [ OR condition ... ] THEN
  handler_statements
   ... ]

END;