Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 организовать цивильно goto  [new]
_go_to_
Guest
некоторая процедура запускает 50 процедур подряд,
если в какой-то процедуре происходит ошибка,
правятся входные данные и надо перезапустить основную процедуру,
начиная с той, где произошла ошибка.
в голову приходит только параметр процедуры @proc_name с дефолтом NULL (выполнить целиком),
где в самом начале 50 -ов проверяют параметр
и посылают на метку перед запуском соответствующей процедуры:
if @proc_name = 'sp_1' goto ssp_1;


как-то некрасиво.
можно ли организовать цивильнее?
16 май 13, 11:44    [14304259]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
запускать основную процедуру в цикле пока она не исполниться или пока не истечет количество итераций заданных в цикле.
16 май 13, 11:47    [14304286]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
_go_to_,

Вам нужен не @proc_name, а @proc_number с дефолтом = 0. Тогда:
if @proc_number <= 1 EXEC sp_1;
if @proc_number <= 2 EXEC sp_2;
...
if @proc_number <= 50 EXEC sp_50;
16 май 13, 11:51    [14304322]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
_go_to_
Guest
Мистер Хенки,

не, ее не надо в цикле запускать, наверное плохо объясняю.
процедура это просто сборище 50 штук sp:
exec sp_1;
exec sp_2;
...
exec sp_50;

все в try catch и каждая процедура пишет в лог.
все это дело грузит данные, денормализует кучу всего и собирает одну большую таблицу-помойку.
если на каком-то шаге что-то не то (нарушение ПК или чека),
выполнение прерывается.
пусть это на 10ой продедуре ошибка.
анализируется лог, правятся данные и надо заново запустить.
но начиная с процедуры sp_10, т.к. ранее сделанное не надо на 2ой раз переделывать.
ничего автоматизировать не надо, просто в процедуре надо организовать возможность выполнения с такого-то шага(50 шагов)
16 май 13, 11:54    [14304362]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
_go_to_
Guest
Guf,

нехорошо, т.к. надо помнить, у какой процедуры какой номер,
а если между sp_25 и sp_26 появится еще одна?
а так, смотришь на лог и видишь имя процедуры, на к-ой спотыкалово,
ее и передаешь в качестве параметра.

еще момент, там не просто 1 оператор ,
там еще кучка set-ов перед каждым выполнением.
а Вашем варианте надо еще и 50 begin-ов с end-ами добавить,
а метки расставил и привет
16 май 13, 12:01    [14304429]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Мистер Хенки
запускать основную процедуру в цикле пока она не исполниться или пока не истечет количество итераций заданных в цикле.

ну и передавать в основную процедуру номер подпроцедуры с которой перезапустить
а далее как
Guf
_go_to_,

Вам нужен не @proc_name, а @proc_number с дефолтом = 0. Тогда:

if @proc_number <= 1 EXEC sp_1;
if @proc_number <= 2 EXEC sp_2;
...
if @proc_number <= 50 EXEC sp_50;

16 май 13, 12:05    [14304467]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
_go_to_
Guest
наверное, фигней маюсь, работает и ладно.
предрассудки это поди, про goto, что логику запутывает,
у меня случай - прямолинейнее не бывает.
просто никогда до этого не приходилось связываться с goto,
а "со школы" засело что "goto - зло"
16 май 13, 12:05    [14304473]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
declare @StartFromProc sysname = null, @ProcName sysname;

declare @p table (id int identity, ProcName sysname);
insert into @p
values
 (N'Proc1'), (N'Proc2'), ... (N'Proc50');
 
declare p cursor local fast_forward for
 select
  ProcName
 from
  @p
 where
  id >= isnull((select id from @p where ProcName = @StartFromProc), 0)
  
open p;
fetch next from p into @ProcName;
while @@fetch_status = 0
 begin
  exec @ProcName;
  fetch next from p into @ProcName;
 end;
close p;
deallocate p;
16 май 13, 12:09    [14304508]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
_go_to_
Guest
invm,

да, так компактно, попробую.
а в CATCH тогда что идет, 3акрытире курсора и deallocate?
(курсоры как-то везло обходить стороной, опыта написания не имею)
16 май 13, 12:18    [14304577]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
Гость333
Member

Откуда:
Сообщений: 3683
_go_to_
наверное, фигней маюсь, работает и ладно.
предрассудки это поди, про goto, что логику запутывает,
у меня случай - прямолинейнее не бывает.
просто никогда до этого не приходилось связываться с goto,
а "со школы" засело что "goto - зло"

На самом деле, зло — это "неструктурное" программирование. Исторически между "goto" и "неструктурным программированием" ставится знак равенства, что не совсем верно. Можно и при помощи goto написать полностью структурированную программу (конечно, при этом программист должен чётко понимать, какие структуры он реализует — поэтому для "школьников" проще сказать, что "goto — это зло").

В вашем случае вы просто реализуете аналог вполне "структурного" оператора switch из C/C++.
16 май 13, 12:21    [14304600]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
_go_to_
а в CATCH тогда что идет, 3акрытире курсора и deallocate?
Курсор объявлен как local и будет неявно освобожден по завершению пакета.
16 май 13, 12:29    [14304676]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
_go_to_
Guest
invm,

но Вы-то же его зачем-то освобождаете?
или это как уничтожать созданную в процедуре локальную темповую таблицу?
ок, почитаю про курсоры.
всем спасибо!
16 май 13, 12:42    [14304788]     Ответить | Цитировать Сообщить модератору
 Re: организовать цивильно goto  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
_go_to_
но Вы-то же его зачем-то освобождаете?
Привычка - вторая натура :)
16 май 13, 12:56    [14304885]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить