|
|
|
как реализовать этот SQLServer-код в IB
|
|||
|---|---|---|---|
|
#18+
на 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2003, 09:37 |
|
||
|
как реализовать этот SQLServer-код в IB
|
|||
|---|---|---|---|
|
#18+
if (...) then exception err_parameter; где err_parameter - зарегистрированное исключение! При этом происходит выход из процедуры с откатом транзакции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2003, 10:22 |
|
||
|
как реализовать этот SQLServer-код в IB
|
|||
|---|---|---|---|
|
#18+
можно написать процедуру которая будет генерировать произвольный текст исключения длянной до 80 символов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2003, 10:40 |
|
||
|
как реализовать этот SQLServer-код в IB
|
|||
|---|---|---|---|
|
#18+
Во-первых, при возникновении исключения в IB транзакция не откатывается, откатывается только текущее выражение (в триггере - зименения, в процедуре - до предыдущего suspend, если было, иначе - все). А вот "честно" сделать произвольный текст сообщения можно только в Firebird 1.5, для IB есть "хак" http://www.ibase.ru/devinfo/customex.htm Впрочем, нужно это редко, обычно достаточно CREATE EXCEPTION с фиксированным текстом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2003, 10:57 |
|
||
|
как реализовать этот SQLServer-код в IB
|
|||
|---|---|---|---|
|
#18+
>Roman Ignatiev Очень, как бы сказать помягче, странное высказывание! Для автора Динамическое формирование сообщения EXCEPTION в процедурах и триггерах С уважением, Denis Uskov ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 08:53 |
|
||
|
как реализовать этот SQLServer-код в IB
|
|||
|---|---|---|---|
|
#18+
Чем странное? Управление транзакциями в IB осуществляется только с клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 11:03 |
|
||
|
как реализовать этот SQLServer-код в IB
|
|||
|---|---|---|---|
|
#18+
Во-первых, при возникновении исключения в IB транзакция не откатывается, откатывается только текущее выражение (в триггере - зименения, в процедуре - до предыдущего suspend, если было, иначе - все). А вот "честно" сделать произвольный текст сообщения можно только в Firebird 1.5, для IB есть "хак" http://www.ibase.ru/devinfo/customex.htm Впрочем, нужно это редко, обычно достаточно CREATE EXCEPTION с фиксированным текстом Все чушь до последней точки. Причем в наихудшей, декларативной форме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 12:32 |
|
||
|
как реализовать этот SQLServer-код в IB
|
|||
|---|---|---|---|
|
#18+
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. По поводу остального - просто нет слов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 12:41 |
|
||
|
как реализовать этот SQLServer-код в IB
|
|||
|---|---|---|---|
|
#18+
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; что является честным способом. Где чушь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 14:01 |
|
||
|
как реализовать этот SQLServer-код в IB
|
|||
|---|---|---|---|
|
#18+
Ладно, все фигня. Надо пчел разводить... 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2003, 15:39 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32357571&tid=1579458]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
183ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 516ms |

| 0 / 0 |
