Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / как реализовать этот SQLServer-код в IB / 10 сообщений из 10, страница 1 из 1
19.12.2003, 09:37
    #32357504
avarch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как реализовать этот SQLServer-код в IB
на SQL - сервере существует процедура.
В самом начале идет проверка входных параметров.
Что-то типа - если неправильные данных, то сообщение и выход:

IF <проверка параметра1>
BEGIN
RAISERROR 50015 'Ошибка в параметре1'
RETURN -101
END

IF <проверка параметра2>
BEGIN
RAISERROR 50015 'Ошибка в параметре2'
RETURN -101
END

IF <проверка параметра3>
BEGIN
RAISERROR 50015 'Ошибка в параметре3'
RETURN -101
END

.......

Как подобная структура реализуется в IB ?

(!) Важно, Так как много входных параметров. Не использовать сложную вложенность структуры: IF - THEN - ELSE.
...
Рейтинг: 0 / 0
19.12.2003, 10:22
    #32357546
Fighter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как реализовать этот SQLServer-код в IB
if (...) then
exception err_parameter;

где err_parameter - зарегистрированное исключение!

При этом происходит выход из процедуры с откатом транзакции
...
Рейтинг: 0 / 0
19.12.2003, 10:40
    #32357571
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как реализовать этот SQLServer-код в IB
можно написать процедуру которая будет генерировать произвольный текст исключения длянной до 80 символов
...
Рейтинг: 0 / 0
19.12.2003, 10:57
    #32357601
Roman Ignatiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как реализовать этот SQLServer-код в IB
Во-первых, при возникновении исключения в IB транзакция не откатывается, откатывается только текущее выражение (в триггере - зименения, в процедуре - до предыдущего suspend, если было, иначе - все).
А вот "честно" сделать произвольный текст сообщения можно только в Firebird 1.5, для IB есть "хак" http://www.ibase.ru/devinfo/customex.htm
Впрочем, нужно это редко, обычно достаточно CREATE EXCEPTION с фиксированным текстом
...
Рейтинг: 0 / 0
23.12.2003, 08:53
    #32360345
Denis Uskov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как реализовать этот SQLServer-код в IB
>Roman Ignatiev

Очень, как бы сказать помягче, странное высказывание!

Для автора
Динамическое формирование сообщения EXCEPTION в процедурах и триггерах

С уважением, Denis Uskov
...
Рейтинг: 0 / 0
23.12.2003, 11:03
    #32360481
Roman Ignatiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как реализовать этот SQLServer-код в IB
Чем странное? Управление транзакциями в IB осуществляется только с клиента.
...
Рейтинг: 0 / 0
23.12.2003, 12:32
    #32360637
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как реализовать этот SQLServer-код в IB
Во-первых, при возникновении исключения в IB транзакция не откатывается, откатывается только текущее выражение (в триггере - зименения, в процедуре - до предыдущего suspend, если было, иначе - все).
А вот "честно" сделать произвольный текст сообщения можно только в Firebird 1.5, для IB есть "хак" http://www.ibase.ru/devinfo/customex.htm
Впрочем, нужно это редко, обычно достаточно CREATE EXCEPTION с фиксированным текстом


Все чушь до последней точки. Причем в наихудшей, декларативной форме.
...
Рейтинг: 0 / 0
23.12.2003, 12:41
    #32360665
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как реализовать этот SQLServer-код в IB
1.
ALTER DOMAIN "RDB$MESSAGE" type VARCHAR(128);
/* Это По поводу ограничения длины сообщений */

2.
create exception CUSTOM_RESTRICT 'CUSTOM_RESTRICT';
/* Динамические исключения*/
set term !! ;
create PROCEDURE C_R
( CUSTOM_MESSAGE VARCHAR(128) CHARACTER SET WIN1251 )
AS
begin
update RDB$Exceptions
set RDB$MESSAGE = :custom_message
where RDB$EXCEPTION_NAME = 'CUSTOM_RESTRICT';
exception CUSTOM_RESTRICT;
end !!
/* Это по поводу предопределенных эксцепш */
3.
По поводу остального - просто нет слов.
...
Рейтинг: 0 / 0
23.12.2003, 14:01
    #32360826
Roman Ignatiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как реализовать этот SQLServer-код в IB
2mv >Все чушь до последней точки. Причем в наихудшей, декларативной форме.
По-моему, декларативная форма у вас. Но не это важно, а то, что я все-таки не с неба упал, и немного понимаю, что пишу. Причем проверить можно очень просто и примитивно, хотя бы в том же IBExpert, это удобно
1. create table TEST_EX (ID integer not null, NAME varchar(20), constraint PK_TEST_EX primary key (ID)) Примитивно, просто таблица из двух полей. Теперь эксперименты:
2. insert into test_ex (ID, NAME) values (1, 'A') Открылась транзакция, вставилась строка.
3. insert into test_ex (ID, NAME) values (1, 'B') В этой же транзакции. Естественно, exception. Но транзакция осталась, select * from SP_TEST_EX нормально выдает 1 строку, предыдущий инсерт. Если бы, как здесь утверждалось, транзакция откатывалась, этой строки бы не было. Конечно, можно ее откатить, тогда останется пустая таблица. Но сделаем commit.
Это к "при возникновении исключения в IB транзакция не откатывается, откатывается только текущее выражение"
4. create procedure SP_TEST_EX
returns(NAME varchar(20))
as
begin
insert into TEST_EX (ID, NAME)
values (3, 'C');
NAME = 'C';
suspend;
insert into TEST_EX (ID, NAME)
values (1, 'D'); /*exception*/
NAME = 'D';
suspend;
end
И, разумеется, простой select * from SP_TEST_EX выдающий нарушение первичного ключа (строка с ID=1 уже есть). Но при этом выдается результат первого suspend. И если сделать commit, а затем посмотреть на таблицу, там будет строка (3, 'C'). Это к " в процедуре - до предыдущего suspend"

Насчет остального: Динамически подменять текст исключения в системной таблице все-таки не есть хорошо, это от бедности. Поэтому я и называю это хаком. а в Firebird 1.5 есть EXCEPTION Ex_Overflow ’Overflow in ’ || TableName; что является честным способом.

Где чушь?
...
Рейтинг: 0 / 0
23.12.2003, 15:39
    #32361018
Малиновский Владимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как реализовать этот SQLServer-код в IB
Ладно, все фигня. Надо пчел разводить...

2 avarch
Отвечаю на Ваш вопрос.
Вот вариантпроцедуры, принимающую 2 параметра типа Integer, анализирующая их (без всяких Exceptions), и возвращающая набор данных, сформированный из таблицы Bank. В качестве 1-го поля набора данных - код завершения. Если один из параметров пустой или = 0, то возвращается одна строка, в которой пырвое поле имеет отрицательное значение. Если Параметры больше нуля оба, то возвращается полный набор, и первое поле в этом наборе = 0.
Формат обращения к процедуре, например:

Select * from TESTPROC(1,0)
Текст процедуры:
/*-------------------*/
CREATE PROCEDURE TESTPROC (
PARAM1 INTEGER,
PARAM2 INTEGER)
RETURNS (
CODERESULT INTEGER,
DATAFIELD1 INTEGER,
DATAFIELD2 VARCHAR(180))
AS
begin
Datafield1 = 0; /* Значения по умолчанию*/
Datafield2 = '';

if (Param1 = 0 or Param1 is Null) then begin
Coderesult = -1; /* Код завершения, если параметр 1 нулевой*/
suspend;
exit;
end

if (Param1 = 0 or Param2 is Null) then begin
Coderesult = -2; /* Код завершения, если параметр 2 нулевой*/
suspend;
exit;
end

Coderesult = 0; /* Код завершения, если параметры допустимые*/
for select b.bank_id, b.fname from bank b into
:datafield1, :datafield2 do
suspend;
end
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / как реализовать этот SQLServer-код в IB / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]