Доступные версии документации

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

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

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

Для эффективного доступа к глобальным переменным в области глобальных переменных ведется хеш-таблица переменных, элементами которой является смещение начала цепочки переменных с данной хеш-суммой в области переменных. Хеш-сумма переменной вычисляется путем побайтной операции 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
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter