понедельник, 6 июля 2009 г.

Программируем на шелл

"Бросая в воду камни, наблюдай за кругами,
которые они оставляют"

Эта небольшая заметка про то как правильно вести лог выполняемых команд SQL. Как правило небольшие скрипты sql, не требующие интерактивной обработки проще всего реализовать с помощью программирования на шелле и dbaccess. Результат выполнения (или журнал) для дальнейшего анализа направляется в файл например так:

dbaccess test test.sql >test.log 2>&1


При этом сообщения об ошибках также можно направить в этот же файл журнала, как это сделано выше. Если скрипт небольшой то разобраться где произошла ошибка труда не составит, однако в случае большого кол-ва операторов SQL в скрипте придется долго искать в каком именно операторе произошла ошибка. Главный недостаток такого способа - в файле журнала есть только сообщения о результате работы каждого оператора SQL, но нет самих операторов, и поэтому анализ такого журнала достаточно трудоемкий.

Например есть такой скрипт:
create table t1 (id int);

insert into t1 values (1);
insert into t1 values (2);
insert into t1 values (3);

insert into t1 values (1, 2);

select * from t1;

drop table t1;

тогда журнал выполнения скрипта будет таким:

Database selected.


Table created.


1 row(s) inserted.


1 row(s) inserted.


1 row(s) inserted.


236: Number of columns in INSERT does not match number of VALUES.
Error in line 7
Near character position 24


id

1
2
3

3 row(s) retrieved.


Table dropped.


Database closed.



Чтобы включить в файл журнала инструкции SQL, надо воспользоваться флагом -e для dbaccess:

dbaccess -e test test.sql >test.log 2>&1


Тогда журнал выполнения будет таким:


Database selected.

create table t1 (id int);
Table created.



insert into t1 values (1);
1 row(s) inserted.


insert into t1 values (2);
1 row(s) inserted.


insert into t1 values (3);
1 row(s) inserted.



insert into t1 values (1, 2);
236: Number of columns in INSERT does not match number of VALUES.
Error in line 7
Near character position 24


select * from t1;

id

1
2
3

3 row(s) retrieved.



drop table t1;
Table dropped.



Database closed.


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