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

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


kak_da:spravki_scriptove

Разлики

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

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

Both sides previous revisionПредходна версия
Следваща версия
Предходна версия
kak_da:spravki_scriptove [2020/07/31 05:57] – [Ново] t.lalovakak_da:spravki_scriptove [2020/07/31 10:59] (текуща) – [Системна процедура SYS$SLEEP] t.lalova
Ред 1301: Ред 1301:
 </code> </code>
  
-===== Ново =====+===== Системна процедура SYS$SLEEP =====
  
-<code xml>+Функция **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
Ред 1418: Ред 1423:
         :NEW_DOC_NUMBER;         :NEW_DOC_NUMBER;
  
-</code xml>+</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.1596175031.txt.gz · Последна промяна: 2020/07/31 05:57 от t.lalova