Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru) 148


Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 148 (28 июля 2007 г.)

SQL Exercises

Новым посетителям сайта

Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.

Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 57-ти задач первого этапа. При подсчете рейтинга каждого участника отбрасывается один самый худший показатель среди всех решенных им упражнений.

Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов, которые пригодятся на третьем рейтинговом этапе, который начинается после 138 задачи.

Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.


Новости сайта

§ Добавил данные для проверки задач 124 и 127. Спасибо Vezyr, Roman S. Golubin, Sp999, 7_x_F1WC и xlum, заметившим прорехи в проверке.
Кроме того, принял уточнение формулировки задачи 124, предложенное 15th.

§ Продолжил чистку рядов, удалив повторные регистрации, которые смог идентифицировать. Таковых оказалось около 250. Однако следует заметить, что среди удаленных не было записей, повливших на рейтинг, за исключением повышения позиций нижеидущих.
В итоге получил уже проверенные цифры, говорящие о том, что только 10 процентов участников доходит до второго этапа. 447 человек преодолели нынешний (67 задач) первый сертификационный порог, среди которых 92 - второй.

§ Исправил номера рекомендуемых задач на страницах справки, т.к. после замены задач некоторые задачи не соответствовали теме страницы.
Хочу заметить, что эти рекомендации достаточно условны, поскольку для решения не самых простых задач, как правило, используется сразу несколько синтаксических конструкций, скажем, соединение и группировка, в то время как задача попадает только в один из разделов справки.

§ Опубликован критический комментарий Архангельского А.Г. на статью Фуллера (Fuller) "Использование хэш-ключей вместо строковых индексов". Этот комментарий можно почитать здесь. Рекомендую.

§ Новые лица в сотне:
Guy (задач 121, время 1.821)
Кажется, конкуренция среди лидеров возрастет :-).

§ Продвинулись в рейтинге:
_x_F1WC (134, 45.007)
modicus (131, 7.884)
elka (124, 58.259)
azavyalov1 (120, 43.609)

§ На этой неделе сертифицированы:
Fairo (A07016967) [BK] (г.Смоленск, Россия)
Roman Karelin (A07019322) [BK] (г.Великий Новгород, Россия)
Bob Andreev (A07014038) [BK] (г.Санкт-Петербург, Россия)

§ Число подписчиков - 3576

Число участников рейтинга - 10172

Число участников второго этапа - 1016

Сертифицировано на сайте - 174

Лучшие результаты (ТОР 20)

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 Days_3 S_3 LastSolved LastVisit
1 Северюхин Ю.А. (Venser) 142 142 21 341 36 4.912 .655 14 08 Apr 2007 21 Jul 2007
2 Солдатенков Ю.С. (SolYUtor) 142 142 21 341 320 17.807 2.695 14 03 Apr 2007 27 Jul 2007
3 Шептунов П.П. (PavelPS) 142 142 21 341 119 8.145 3.499 14 25 Apr 2007 25 Jul 2007
4 Мурашкин И.В. (lepton) 142 142 21 341 371 15.737 5.539 14 29 Mar 2007 13 Jul 2007
5 Карасёва Н.В. (vlksm) 142 142 21 341 389 31.344 5.912 14 30 May 2007 26 Jul 2007
6 Мальцев А.В. (Палкин) 142 142 21 341 310 27.974 7.690 14 23 Jun 2007 26 Jul 2007
7 Голубин Р.С. (Roman S. Golubin) 142 142 21 341 588 55.391 34.203 14 29 Mar 2007 27 Jul 2007
8 Агапов В. (KERBEROS) 138 141 20 330 89 6.163 1.262 11 20 Nov 2006 27 Jul 2007
9 Кувалкин К.С. (Cyrilus) 141 141 20 336 901 12.541 2.519 11 14 May 2007 26 Jul 2007
10 Зверев Д.Л. (dimzv) 138 141 20 330 1141 9.294 4.938 11 19 Dec 2006 22 Dec 2006
11 Войнов П.Е. (pаparome) 141 142 21 337 616 2.765 .049 10 02 May 2007 29 Jun 2007
12 Любченко В.А. (IAS56) 141 142 21 337 313 176.801 20.130 10 14 Jul 2007 17 Jul 2007
13 Тарасов Д.Б. (Gavrila) 140 140 21 334 691 20.381 .513 7 18 Jul 2007 27 Jul 2007
14 Васьков Е.В. (Johan) 140 140 21 334 253 12.786 11.402 7 29 Mar 2007 26 Jul 2007
15 Валуев Д.И. (Fiolent) 139 140 20 329 1345 117.088 62.302 4 11 May 2007 27 Jul 2007
16 Юлдашев М.Р. (Snowbear) 139 139 21 330 642 4.132 .000 3 21 Apr 2007 26 Jul 2007
17 Креславский О.М. (Arcan) 139 139 21 330 67 9.932 .315 3 07 Apr 2007 25 Jul 2007
18 Держальцев В.А. (MadVet) 135 139 20 321 540 34.190 3.085 3 08 Oct 2006 19 Oct 2006
19 Палий С.А. (PS_Sergey) 136 139 20 322 212 15.704 4.188 3 01 Dec 2006 03 Dec 2006
20 Солопов А.Н. (15th) 138 138 21 327 125 16.082 .000 0 25 Apr 2007 27 Jul 2007

Лучшие результаты за неделю

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 >Gaponenko E. (IsThisOK?) 47 47 85 34 119 943 27 Jul 2007
2 >Красавин О. (okras) 48 48 90 17 107 1132 27 Jul 2007
3 >khomeriki I. (ikhomeriki) 35 72 71 34 105 344 27 Jul 2007
4 Бурлов Е.П. (Женя06) 40 53 83 19 102 959 26 Jul 2007
5 >Темченко А.В. (Beryl) 53 53 102 0 102 1258 27 Jul 2007
6 Orlov A. (scoand) 31 53 72 3 75 1186 26 Jul 2007
7 Strelkov F.N. (fender) 35 35 62 9 71 2153 27 Jul 2007
8 >Klimenko A. (Klimenko) 30 37 59 8 67 1994 27 Jul 2007
9 Медведев К.А. (Linus) 36 36 67 0 67 2338 24 Jul 2007
10 >Efimtsev M.A. (madmax14) 36 36 67 0 67 2342 27 Jul 2007
11 >Bogatova O.V. (Polymerase) 33 33 50 15 65 2427 27 Jul 2007
12 Zolotyh (Guy) 26 121 64 0 64 81 26 Jul 2007
13 >Makukha A.V. (iov) 34 34 61 1 62 2564 27 Jul 2007
14 >Шестаков Н.М. (thefire) 29 29 52 9 61 2608 27 Jul 2007
15 >Tskitishvili A. (Atski) 34 34 61 0 61 2609 27 Jul 2007
16 (XMbIPb) 33 33 53 3 56 2930 27 Jul 2007
17 >Getman B.A. (BGladiator2007) 13 60 26 29 55 550 27 Jul 2007
18 Мирошниченко В.И. (Domovik) 30 30 55 0 55 3025 23 Jul 2007
19 Косотухин А.А. (sanich) 31 31 55 0 55 3031 26 Jul 2007
20 >Бажанова М.А. (RedMouse) 30 30 55 0 55 3037 27 Jul 2007
21 >MMM I. (John) 32 32 54 0 54 3145 27 Jul 2007
22 >Лазарева Е. (elena_laz) 29 29 50 3 53 3188 27 Jul 2007
23 >Боронникова Т. (tanusha) 29 29 52 0 52 3224 27 Jul 2007
24 >Усович Д.А. (Demon_85) 28 28 49 0 49 3452 27 Jul 2007
25 >Федоров В.В. (ViNT07) 28 28 49 0 49 3460 27 Jul 2007
26 Razdolbenc (Domeno) 28 28 49 0 49 3472 26 Jul 2007
27 Федотова Е. (Eka) 15 56 31 17 48 886 27 Jul 2007
28 >Филин К.А. (E@gle-owl) 15 53 30 16 46 940 27 Jul 2007
29 >Фарзатинов А. (Андрухха) 27 27 46 0 46 3687 27 Jul 2007
30 Иванов (Igor_12) 26 26 44 0 44 3799 24 Jul 2007
31 >Papukashvili (MasterRezo) 12 34 24 19 43 2066 27 Jul 2007
32 Назарова (criska) 26 26 43 0 43 3873 27 Jul 2007
33 >AlexMyst (Alex_Myst) 25 25 41 0 41 4008 27 Jul 2007

Изучаем SQL

Новые возможности T-SQL в SQL Server 2005 - Часть 2/3 (окончание, начало в вып.146)

Kevin S. Goff, Microsoft MVP (оригинал: New T-SQL Capabilities in SQL Server 2005 - Part 2 of 3 )
Перевод Моисеенко С.И.

3 - Обработка ошибок с помощью Try…Catch

В течение многих лет, разработчики SQL Server искали способы обеспечить разумную обработку ошибок в хранимых процедурах, и ждали возможности использовать Try…Catch, имевшуюся в языках программирования типа C# и VB.NET. T-SQL 2005 ввел основные возможности Try…Catch, которые позволяют Вам более эффективно тестировать ошибки, и возвращать их в слой приложения.

Например, предположим, что мы пытаемся удалить запись из таблицы заголовков заказа по номеру заказа:

DELETE FROM Purchasing.PurchaseOrderHeader WHERE PurchaseOrderID = 44

Эта строка кода прерывается в SQL Server ошибкой, поскольку мы пытались нарушить ограничение между таблицами Order Header и Order Detail. Если мы выполняем этот оператор в хранимой процедуре и вызываем ее из приложения .NET (или любого другого приложения, но я буду использовать .NET в качестве примера), выполнение оператора будет прервано в базе данных, не возвращая сколь-нибудь осмысленного сообщения в слой приложения.

То, что мы хотели бы сделать, - перехватить эту ошибку в хранимой процедуре, и затем сгенерировать ошибку, сообщение о которой база данных могла бы вернуть в слой приложения, которое, в свою очередь, обнаружит ее в части своего собственного блока TRY…CATCH. Ниже приведен полный код для такой хранимой процедуры, который: мы разберем подробно по частям:

USE AdventureWorks
BEGIN
BEGIN TRANSACTION
BEGIN TRY
DELETE FROM Purchasing.PurchaseOrderHeader WHERE PurchaseOrderID = 44
END TRY
BEGIN CATCH
DECLARE @ErrorSeverity INT, @ErrorNumber INT, @ErrorMessage NVARCHAR(4000), @ErrorState INT
SET @ErrorSeverity = ERROR_SEVERITY()
SET @ErrorNumber = ERROR_NUMBER()
SET @ErrorMessage = ERROR_MESSAGE()
SET @ErrorState = ERROR_STATE()
IF @ErrorState = 0
SET @ErrorState = 1
RAISERROR ('ERROR OCCURED:%d', @ErrorSeverity, @ErrorState, @ErrorNumber)
IF XACT_STATE() < 0
ROLLBACK TRANSACTION
END CATCH
COMMIT TRANSACTION
END
GO

Первое, что мы должны сделать, - это обертку вокруг оператора DELETE, поместив его внутри блока BEGIN TRY…END TRY. Сразу после этого мы напишем наш блок Begin Catch…End Catch, который будет выполняться, только если код внутри BEGIN TRY…END TRY вызывает некоторую ошибку:

BEGIN TRY
DELETE FROM Purchasing.PurchaseOrderHeader WHERE PurchaseOrderID = 44
END TRY
BEGIN CATCH
-- процедура обработки ошибки
END CATCH

Внутри блока CATCH мы хотим определить для ошибки уровень серьезности, номер ошибки, сообщение об ошибке и состояние ошибки с тем, чтобы вернуть в приложение эту информацию. Для этого мы создаем переменные и используем соответствующие функции SQL, чтобы получить информацию об ошибке:

DECLARE @ErrorSeverity INT, @ErrorNumber INT, @ErrorMessage NVARCHAR(4000), @ErrorState INT
SET @ErrorSeverity = ERROR_SEVERITY()
SET @ErrorNumber = ERROR_NUMBER()
SET @ErrorMessage = ERROR_MESSAGE()
SET @ErrorState = ERROR_STATE()

Теперь мы собираемся использовать функцию SQL RAISERROR, которую наше приложение .NET обнаружит в своем собственном блоке TRY….CATCH:

RAISERROR ('ERROR OCCURED:%d', @ErrorSeverity, @ErrorState, @ErrorNumber)

Однако в меде имеется одна маленькая муха. Ошибки нарушения ограничения не сообщают конкретный код состояния ошибки, а RAISERROR требует состояние ошибки. Таким образом, мы должны проверить состояние ошибки, чтобы выяснить, является ли значение нолем, и если так, установить его в значение 1 ПЕРЕД генерацией ошибки в SQL Server:

IF @ErrorState = 0
SET @ErrorState = 1
RAISERROR ('ERROR OCCURED:%d', @ErrorSeverity, @ErrorState, @ErrorNumber)

Наконец, мы можем откатить транзакцию, если SQL Server в настоящее время имеет активную транзакцию в сессии, которая, однако, не может быть зафиксирована из-за ошибки. Мы используем XACT_STATE (), чтобы определить, классифицировал ли SQL Server 2005 транзакцию как uncommittable (нефиксируемая):

IF XACT_STATE() < 0
ROLLBACK TRANSACTION

Еще два замечания относительно обработки ошибок в SQL Server. Первое (плохие новости), T-SQL 2005 не содержит оператора FINALLY, который существует в языках программирования, которые реализуют TRY…CATCH. Второе (хорошие новости), разработчики могут использовать вложенные блоки TRY…CATCH в хранимой процедуре.

Полезная информация

§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL.

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

§ Желающих поспособствовать популяризации сайта прошу проголосовать/поставить закладку в социальных сетях:
del.icio.us
dzone.com
Digg.com
Reddit.com

Контакты

По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.

Подписка Subscribe.Ru
Новости сайта "Упражнения по SQL"

В избранное