Тук са показани разликите между избраната и текущата версия на страницата.
Both sides previous revisionПредходна версияСледваща версия | Предходна версия | ||
kak_da:spravki_scriptove [2020/07/31 05:58] – [Ново] t.lalova | kak_da:spravki_scriptove [2020/07/31 10:59] (текуща) – [Системна процедура SYS$SLEEP] t.lalova | ||
---|---|---|---|
Ред 1301: | Ред 1301: | ||
</ | </ | ||
- | ===== Ново ===== | + | ===== Системна процедура SYS$SLEEP |
+ | |||
+ | Функция **SYS$SLEEP** служи за прекъсване на изпълнението на процедура, | ||
+ | Може да се използва в случай на заключване на записи и изчакване за последващото освобождаване. | ||
+ | |||
+ | Пример 1: Използване на процедурата в стейтмънт за извличане на номер от автоматична номерация (кочан). | ||
<code pascal> | <code pascal> | ||
Ред 1419: | Ред 1424: | ||
</ | </ | ||
+ | |||
+ | Пример 2: Показва изпълнението само в случая за изтегляне на номер и изчакването за следващ опит. Този пример е част от горната процедура. | ||
+ | |||
+ | При изтегляне на номер на фактура от кочан се извършва ъпдейт и изтегляне на номера в една транзакция. Ако транзакцията продължи около 1 секунда, | ||
+ | |||
+ | В този случай при грешка можем да изчакаме определено време (колкото преценим, | ||
+ | Пример за точно такова изчакване е в следващия пример: | ||
+ | |||
+ | <code pascal> | ||
+ | | ||
+ | | ||
+ | while ((repeat_count < 5) and (NEW_DOC_NUMBER is null)) do | ||
+ | begin | ||
+ | repeat_count = repeat_count + 1; | ||
+ | NEW_DOC_NUMBER = null; | ||
+ | update | ||
+ | NOM$DOC_NUM_GENERATORS G | ||
+ | set | ||
+ | G.CURRENT_VALUE = G.CURRENT_VALUE + 1 | ||
+ | where | ||
+ | G.ID = : | ||
+ | returning | ||
+ | G.CURRENT_VALUE - 1 | ||
+ | into | ||
+ | : | ||
+ | when any do | ||
+ | begin | ||
+ | execute procedure SYS$SLEEP(200); | ||
+ | NEW_DOC_NUMBER = null; | ||
+ | end | ||
+ | end | ||
+ | if (NEW_DOC_NUMBER is null) then | ||
+ | exception CLEAN_TEXT_ERROR '' | ||
+ | |||
+ | </ |