powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / set bail on: разное поведение при вызове: isql -i X.SQL =vs= SQL> in X.SQL
3 сообщений из 3, страница 1 из 1
set bail on: разное поведение при вызове: isql -i X.SQL =vs= SQL> in X.SQL
    #38715405
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Дано:
1) некий здоровенный скрипт, сгенерённый автоматом и содержащий десятки тысяч строк вида:
Код: sql
1.
insert into gtt(. . .) values( . . . );


2) программулька, генерившая этот скрипт, утеряна, новую писать в лом;
3) табличка, в которую надо скормить не более, чем N строк скрипта из п. "1)", после чего перейти к другим операциям.
:: NB :: ввиду большого кол-ва строк в скрипте п. 1, заключение его в execute block с отловом исключения невозможен. Дробление скрипта на пачки insert'ов, и заключением в execute block'и уже этих пачек - из области садомазо.

Требуется: реализация п. 3.

Упрощенный DDL и тест:
file = `s1.sql`
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
rollback;
recreate global temporary table gtt(id int) on commit preserve rows; 
commit;
recreate sequence g;
recreate exception ex_enough 'enough records generated';
commit;
show sequ g;

set term ^;
create or alter trigger gtt_bi for gtt active
before insert position 0
as
begin
   new.id = coalesce(new.id, gen_id(g, 1) );
   if (new.id > 3) then exception ex_enough;
end
^
set term ;^
commit;

 set bail off; 
 in s2.sql ;
show sequ g;
- где файл `s2.sql`, вызываемый из этого скрипта через IN-команду, есть вот это:
Код: plaintext
1.
2.
3.
4.
5.
 set bail on; 
insert into gtt(id) values( gen_id(g, 1) );
insert into gtt(id) values( gen_id(g, 1) );
insert into gtt(id) values( gen_id(g, 1) );
insert into gtt(id) values( gen_id(g, 1) );
insert into gtt(id) values( gen_id(g, 1) );

А теперь делаем два варианта вызова скрипта `s1.sql`:
var-1.
Код: plaintext
isql 192.168.0.220/3330:oltp30b -i s1.sql -m 1>s1.log 2>&1

Result:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
--- begin of file `s1.log` ---
Generator G, current value is 0
Statement failed, SQLSTATE = 42000
exception 67
-EX_ENOUGH
-enough records generated
-At trigger 'GTT_BI' line: 6, col: 25
After line 4 in file s2
--- end of file `s1.log` ---

Таки обр., исключение внутри `s2.sql`, которое сделал триггер на вставку, привело к:
1) немедленному прекращению работы s2.sql - ибо сообщение об исключении вылезло только один раз;
2) также к немедленному прекращению вызвавшего его s1.sql ("главного" скрипта) - ибо мы не видим итогового значения генератора G.

var-2.
Код: plaintext
1.
2.
isql 192.168.0.220/3330:oltp30b
SQL> in s1.sql
Result:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Generator G, current value is 0
Statement failed, SQLSTATE = 42000
exception 68
-EX_ENOUGH
-enough records generated
-At trigger 'GTT_BI' line: 6, col: 25
After line 4 in file s2
Statement failed, SQLSTATE = 42000
exception 68
-EX_ENOUGH
-enough records generated
-At trigger 'GTT_BI' line: 6, col: 25
After line 5 in file s2
Generator G, current value is 5
SQL>
Здесь всё по-другому:
1) исключение в s2.sql (вернее, в триггере на вставку, которая там делалась) было выброшено несколько раз. Таким обр., команда set bail on в скрипте s2.sql - проигнорирована;
2) скрипт s1.sql продолжил работу по окончании s2.sql - он выдал итоговое значение show sequ.

Так ли всё задумывалось, когда вводился set bail on ? (я про вариант-2)
...
Рейтинг: 0 / 0
set bail on: разное поведение при вызове: isql -i X.SQL =vs= SQL> in X.SQL
    #38715409
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидДробление скрипта на пачки insert'ов, и заключением в execute block'и уже
этих пачек - из области садомазо.
А скормить этот скрипт head/tail-у, а уже его результат - isql-ю - rocket science?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
set bail on: разное поведение при вызове: isql -i X.SQL =vs= SQL> in X.SQL
    #38715423
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТаблоидДробление скрипта на пачки insert'ов, и заключением в execute block'и уже
этих пачек - из области садомазо.
А скормить этот скрипт head/tail-у, а уже его результат - isql-ю - rocket science?..
Это на клиенте приходится делать (в IBE или в "просто" isql - неважно).
Но мну больше интересен вопрос сабжа.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / set bail on: разное поведение при вызове: isql -i X.SQL =vs= SQL> in X.SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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