Глобальные переменные хранимых процедур

Процедурный язык СУБД ЛИНТЕР поддерживает механизм глобальных переменных процедурного языка (см. документ «СУБД ЛИНТЕР. Архитектура СУБД», пункт «Глобальные переменные хранимых процедур»).

В процессе выполнения хранимых процедур значения глобальных переменных хранятся в локальной для каждой пользовательской сессии области глобальных переменных, т.е. одна и та же глобальная переменная в каждой пользовательской сессии будет иметь свою копию. Это означает, что значение одной и той же глобальной переменной индивидуальны в каждой пользовательской сессии и не доступны в других пользовательских сессиях. Для доступа к общим данным из разных пользовательских сессий необходимо использовать специальные пользовательские таблицы БД.

Для эффективного доступа к глобальным переменным в области глобальных переменных ведется хеш-таблица переменных, элементами которой является смещение начала цепочки переменных с данной хеш-суммой в области переменных. Хеш-сумма переменной вычисляется путем побайтной операции XOR идентификатора переменной (а не имени переменной).

Специальный оператор декларирования глобальных переменных в процедурном языке СУБД ЛИНТЕР не используется – глобальной переменной объявляется любое неопределенное имя (среди локальных переменных, функций и т.д.). Просмотр таких неопределенных имен выполняется с помощью SQL-запроса к системной таблице глобальных переменных и при удачном поиске найденная переменная включается в список переменных хранимой процедуры c значением по умолчанию (если оно было задано при создании/модификации глобальной переменной). Если значение по умолчанию отсутствует, то переменная перед использованием должна быть инициализирована.

Изменения глобальных переменных, производимые в одной пользовательской сессии, не видны в других пользовательских сессиях – в каждой пользовательской сессии используется свой локальный набор текущих значений одних и тех же глобальных переменных, поэтому для обмена информацией между одновременно работающими пользователями следует использовать не глобальные переменные, а специальные пользовательские таблицы.

Глобальные переменные нельзя использовать в качестве параметров любого типа хранимых процедур.

Создание/модификация/удаление глобальных переменных выполняется с помощью соответствующих SQL-конструкций (см. документ «СУБД ЛИНТЕР. Справочник по SQL», подраздел «Глобальные переменные процедурного языка»).

Примеры

1)
create if not exists variable abc int = 10;

create or replace procedure rabc() result int 
code 
  return abc; 
end;
execute rabc();

return value = 10

2)
create or replace variable Org varchar(256) ='АО НПП «РЕЛЭКС»';

create or replace procedure company() result varchar(20) 
code 
  return Org; 
end;
execute company();

return value = АО НПП «РЕЛЭКС»

3)
create or replace variable invoice varchar(20)='A/5211' ;
create or replace variable date_invoice date=to_date('23.04.2014', 'dd.mm.yyyy');

create or replace procedure pay() result varchar(50)
declare
  var ret varchar(50); //
code
  ret := "Номер счета: " + invoice +". Дата: "+ dtoa(date_invoice, "dd.mm.yyyy"); //
  return ret;  //
end;
execute pay();
return value = Номер счета: A/5211. Дата: 23.04.2014

4)
create variable abcd int = 1;
create or replace procedure ZZZ_1() result int
code
  return abcd;//
end;

select count(*) from $$$PRCD where PROCID IN (select $$$ID from $$$PROC where $$$NAME LIKE '%ZZZ_1%');

|          1|

5)
create or replace variable abcd int = 1;
create or replace procedure ZZZ_1() result int
code
  abcd:=abcd+1000; //
  return abcd;//
end;

execute ZZZ_1();
return value = 1001