Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2009, 00:22   #1
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию Вызов изменяемого exception в InterBase

Возможно, кому-то пригодится
Понадобилось мне тут на триггере выводить сообщение об ошибке с возможностью собрать текст ошибки (подставить туда, например, числа) и при этом значения параметров непредсказуемы. А нутрянка Ибазе предоставляет возможность выводить только предопределенные сообщения об ошибках.

вот каким образом можно достичь желаемого:

Код:
/*  создадим наше собственное изменяемое исключение */
CREATE EXCEPTION MY_VARIABLE_ERROR '???';

SET TERM ^ ;

CREATE PROCEDURE SHOW_ERROR(E VARCHAR(2000))
AS
declare variable EE varchar(78);
/*максимально возможный размер для текста ошибки*/
BEGIN
   EE='';
   EE=:E;
   /*если входной параметр больше чем 78 то тут возникает ошибка
   которая успешно обрабатывается ниже*/
   UPDATE rdb$exceptions
   SET rdb$message=:E
   WHERE rdb$exception_name='MY_VARIABLE_ERROR';
   
   EXCEPTION MY_VARIABLE_ERROR;
   /*сюда попадаем только если входной параметр Е больше 78 символов*/
   /*EE - содержит 78 символов в обрезанных от E*/
 when any do
   begin
      UPDATE rdb$exceptions
      SET rdb$message=:EE
      WHERE rdb$exception_name='MY_VARIABLE_ERROR';
	  
      EXCEPTION MY_VARIABLE_ERROR;
   end
END
^

SET TERM ; ^
а так вызываем само исключение:
Код:
....
AS
DECLARE VARIABLE L_AVAIL_QTY INTEGER;
DECLARE VARIABLE L_MSG VARCHAR(255);
BEGIN
....
        IF (NEW.QTY > :L_AVAIL_QTY) THEN
        BEGIN
		L_MSG = 'Ошибка! Для прихода по этой позиции доступно не более '||:L_AVAIL_QTY||' шт.';
		EXECUTE PROCEDURE SHOW_ERROR(:L_MSG);
        END
....
END

Последний раз редактировалось soleil@mmc; 31.03.2009 в 00:38.
soleil@mmc вне форума Ответить с цитированием
Старый 07.04.2009, 20:27   #2
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
Возможно, кому-то пригодится
Понадобилось мне тут на триггере выводить сообщение об ошибке с возможностью собрать текст ошибки (подставить туда, например, числа) и при этом значения параметров непредсказуемы. А нутрянка Ибазе предоставляет возможность выводить только предопределенные сообщения об ошибках.

вот каким образом можно достичь желаемого:

Код:
/*  создадим наше собственное изменяемое исключение */
CREATE EXCEPTION MY_VARIABLE_ERROR '???';

SET TERM ^ ;

CREATE PROCEDURE SHOW_ERROR(E VARCHAR(2000))
AS
declare variable EE varchar(78);
/*максимально возможный размер для текста ошибки*/
BEGIN
   EE='';
   EE=:E;
   /*если входной параметр больше чем 78 то тут возникает ошибка
   которая успешно обрабатывается ниже*/
   UPDATE rdb$exceptions
   SET rdb$message=:E
   WHERE rdb$exception_name='MY_VARIABLE_ERROR';
   
   EXCEPTION MY_VARIABLE_ERROR;
   /*сюда попадаем только если входной параметр Е больше 78 символов*/
   /*EE - содержит 78 символов в обрезанных от E*/
 when any do
   begin
      UPDATE rdb$exceptions
      SET rdb$message=:EE
      WHERE rdb$exception_name='MY_VARIABLE_ERROR';
	  
      EXCEPTION MY_VARIABLE_ERROR;
   end
END
^

SET TERM ; ^
а так вызываем само исключение:
Код:
....
AS
DECLARE VARIABLE L_AVAIL_QTY INTEGER;
DECLARE VARIABLE L_MSG VARCHAR(255);
BEGIN
....
        IF (NEW.QTY > :L_AVAIL_QTY) THEN
        BEGIN
		L_MSG = 'Ошибка! Для прихода по этой позиции доступно не более '||:L_AVAIL_QTY||' шт.';
		EXECUTE PROCEDURE SHOW_ERROR(:L_MSG);
        END
....
END
Хм, зачем такие сложности, а так что не работает?
EXCEPTION MY_VARIABLE_ERROR 'Здесь вы пишите что хотите и приклеиваете непредсказуемые параметры ' || :MY_PARAM1;

На FireBird ограничение сообщения об ошибке в 78 символов давным давно ликвидировано...

Последний раз редактировалось Rik; 07.04.2009 в 20:30.
Rik вне форума Ответить с цитированием
Старый 07.04.2009, 22:17   #3
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Во-первых, речь про Ибазе (угу, я в курсе, что есть еще огненная_птица), но вот задача ограничена таким образом.
Во-вторых, лучше сначала проверить работоспособность того что пишешь - речь про это
Код:
EXCEPTION MY_VARIABLE_ERROR 'Здесь вы пишите что хотите и приклеиваете непредсказуемые параметры ' || :MY_PARAM1;
soleil@mmc вне форума Ответить с цитированием
Старый 08.04.2009, 09:35   #4
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
Во-первых, речь про Ибазе (угу, я в курсе, что есть еще огненная_птица), но вот задача ограничена таким образом.
Во-вторых, лучше сначала проверить работоспособность того что пишешь - речь про это
Код:
EXCEPTION MY_VARIABLE_ERROR 'Здесь вы пишите что хотите и приклеиваете непредсказуемые параметры ' || :MY_PARAM1;
Ну что-ж, простите, не знал что в InterBase до сих пор такие проблемы... В FireBird таких проблем уже нет...

Последний раз редактировалось Rik; 08.04.2009 в 11:47.
Rik вне форума Ответить с цитированием
Старый 08.04.2009, 12:22   #5
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

сначала создаешь эксепшон, потом его показываешь
просто версия иб5.5
вопросы миграции на старшие версии или клоны не поднимались

З.Ы.: и ваще не слежу, что там в ибазе нового - я все больше по ораклу
soleil@mmc вне форума Ответить с цитированием
Старый 08.04.2009, 12:35   #6
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
сначала создаешь эксепшон, потом его показываешь
просто версия иб5.5
вопросы миграции на старшие версии или клоны не поднимались

З.Ы.: и ваще не слежу, что там в ибазе нового - я все больше по ораклу
В данном случае, если нагрузка на сервре набольшая, то проблем нет, в противно случае, в виду многоверсионности сервера при большой нагрузке, пользователь рискует увидеть сообщение, совсем другое, не предназнченное ему, если другой, более "шустрый" пользователь, за это время успеет изменить текст сообщения...
Rik вне форума Ответить с цитированием
Старый 08.04.2009, 18:05   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

есть желание отображать динамический экспешон, а если начнутся траблы, то переведем в статику
(просто, по сравнению с ораклом, не иметь возможности в ИБ вывести любую мессагу - как без рук, про все остальные танцы с бубнами ваще не вспоминаю)
soleil@mmc вне форума Ответить с цитированием
Старый 09.04.2009, 13:36   #8
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
есть желание отображать динамический экспешон, а если начнутся траблы, то переведем в статику
(просто, по сравнению с ораклом, не иметь возможности в ИБ вывести любую мессагу - как без рук, про все остальные танцы с бубнами ваще не вспоминаю)
Переводите IBэсовские базы на FireBird.
Я сделал несколько крупных приложений на FireBird, работают на 10ках предприятий, всё обошлось без танцев и без бубнов...
Rik вне форума Ответить с цитированием
Старый 09.04.2009, 13:50   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от Rik Посмотреть сообщение
Переводите IBэсовские базы на FireBird.
Я сделал несколько крупных приложений на FireBird, работают на 10ках предприятий, всё обошлось без танцев и без бубнов...
мне эта БД попалась в кач-ве фриланса - вопросами стратегии ведаю не я (по слухам, была у них попытка переехать на ФБ, но по каким-то причинам не удалась, а чтобы доделать - руки не дошли и оставили как есть - работает и хорошо)

З.Ы.: а бубны - это я про то, что нужно совершать много лишних телодвижений в ИБ чтобы реализовать задуманное так же просто как в оракле

Последний раз редактировалось soleil@mmc; 09.04.2009 в 13:56.
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
.Net генерируеn Exception Dimass Общие вопросы Delphi 2 07.06.2010 13:21
raised exception class EIdSocketError with message' Socket Error # 10022 Invalid argument eldar Работа с сетью в Delphi 16 08.08.2008 23:49
IdTCPServer Exception Comer_Jus Работа с сетью в Delphi 2 25.06.2008 22:23
Unhandled Exception Chazki Общие вопросы Delphi 2 14.04.2007 14:05