Инструменти за потребители

Инструменти за сайта


kak_da:spravki_scriptove

Разлики

Тук са показани разликите между избраната и текущата версия на страницата.

Препратка към сравнението на версиите

Both sides previous revisionПредходна версия
Следваща версия
Предходна версия
kak_da:spravki_scriptove [2020/07/31 05:56] – [Ново] t.lalovakak_da:spravki_scriptove [2020/07/31 10:59] (текуща) – [Системна процедура SYS$SLEEP] t.lalova
Ред 1301: Ред 1301:
 </code> </code>
  
-===== Ново =====+===== Системна процедура SYS$SLEEP =====
  
 +Функция **SYS$SLEEP** служи за прекъсване на изпълнението на процедура, блок или тригер за определен брой милисекунди.
 +Може да се използва в случай на заключване на записи и изчакване за последващото освобождаване.
 +
 +Пример 1: Използване на процедурата в стейтмънт за извличане на номер от автоматична номерация (кочан).
 +
 +<code pascal>
  NEW_DOC_NUMBER = null;  NEW_DOC_NUMBER = null;
     if (DOC_NUM_GENERATOR_REF is not null) then     if (DOC_NUM_GENERATOR_REF is not null) then
Ред 1417: Ред 1423:
         :NEW_DOC_NUMBER;         :NEW_DOC_NUMBER;
  
 +</code>
 +
 +Пример 2: Показва изпълнението само в случая за изтегляне на номер и изчакването за следващ опит. Този пример е част от горната процедура. 
 +
 +При изтегляне на номер на фактура от кочан се извършва ъпдейт и изтегляне на номера в една транзакция. Ако транзакцията продължи около 1 секунда, то през това време, никой друг не може да достъпи същия кочан и да изтегли пореден номер.
 +
 +В този случай при грешка можем да изчакаме определено време (колкото преценим, че е добре) и да опитаме отново.
 +Пример за точно такова изчакване е в следващия пример:
 +
 +<code pascal>
 +         repeat_count = 0;
 +         NEW_DOC_NUMBER = null;
 +         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 = :DOC_NUM_GENERATOR_REF
 +            returning
 +              G.CURRENT_VALUE - 1
 +            into
 +              :NEW_DOC_NUMBER;
 +            when any do
 +            begin
 +              execute procedure SYS$SLEEP(200); -- ако поискаме повече от 200 мс трябва да поставим съответното време за изчакване тук!
 +              NEW_DOC_NUMBER = null;
 +            end
 +          end
 +          if (NEW_DOC_NUMBER is null) then
 +              exception CLEAN_TEXT_ERROR ''There was a problem getting an invoice number for the warehouse document!'';  
  
 +</code>   
kak_da/spravki_scriptove.1596174996.txt.gz · Последна промяна: 2020/07/31 05:56 от t.lalova