Глобальные переменные хранимых процедур
Процедурный язык СУБД ЛИНТЕР поддерживает механизм глобальных переменных процедурного языка (см. документ «Архитектура СУБД», пункт «Глобальные переменные хранимых процедур»).
В процессе выполнения хранимых процедур значения глобальных переменных хранятся в локальной для каждой пользовательской сессии области глобальных переменных, т.е. одна и та же глобальная переменная в каждой пользовательской сессии будет иметь свою копию. Это означает, что значение одной и той же глобальной переменной индивидуальны в каждой пользовательской сессии и не доступны в других пользовательских сессиях. Для доступа к общим данным из разных пользовательских сессий необходимо использовать специальные пользовательские таблицы БД.
Для эффективного доступа к глобальным переменным в области глобальных переменных ведется хеш-таблица переменных, элементами которой является смещение начала цепочки переменных с данной хеш-суммой в области переменных. Хеш-сумма переменной вычисляется путем побайтной операции 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