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

Выполнение процедуры

Синтаксис

                         
<выполнение хранимой процедуры>::=
  {EXECUTE | CALL} [<имя схемы>.]<имя процедуры>
  (<список параметров>) [AS OWNER] [INTO <имя переменной>]

<выполнение временной процедуры>::=
  EXECUTE BLOCK
  [AUTHID {CURRENT_USER | DEFINER}]
  [RESULT <тип данных>]
  <процедурный блок> END

Описание

Конструкция <выполнение хранимой процедуры> исполняет предварительно оттранслированную и хранящуюся в БД процедуру. Любые виды рекурсивных вызовов разрешаются.

<Список параметров> – это список выражений, имен переменных или SQL-параметров, разделенных запятыми (может быть и пустым). Фактические параметры ставятся в соответствие формальным по порядку следования.

Примечание

SQL-параметр нельзя устанавливать в соответствие параметру хранимой процедуры с типом данных CURSOR.

Количество параметров процедуры в вызове не должно превышать количество параметров в описании процедуры

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

Если формальные параметры вызываемой процедуры имеют модификатор IN, то в качестве фактических параметров можно использовать любые выражения (совместимость типов выражений с типами параметров проверяется на этапе выполнения процедуры).

Если формальные параметры вызываемой процедуры имеют модификатор OUT или INOUT, в качестве фактических параметров указывать выражения недопустимо. Здесь используются только имена переменных, в которые будут записаны выходные параметры. Если имя переменной опущено, выходное значение никуда записано не будет.

При указании опции AS OWNER и наличии прав на выполнение процедуры с правами владельца, процедура будет исполняться с правами владельца, все выполняемые запросы и вызовы процедур внутри процедуры при отсутствии указания схемы будут выполняться в схеме владельца. Для получения имени и идентификатора пользователя, запустившего её на выполнение, необходимо использовать функции username() и userid() соответственно, а для получения имени и идентификатора пользователя, от имени которого выполняется процедура, необходимо использовать функции effective_username() и effective_userid() соответственно.

Если в операторе CALL задана фраза INTO, возвращаемое значение процедуры присвоится указанной переменной (такое использование недопустимо для процедур, возвращающих курсор; для передачи курсора в вызывающую процедуру существует специальная конструкция – см. пункт Открытие курсора).

Разрешение ссылки на вызываемую процедуру происходит на этапе выполнения данной процедуры – процедура ищется по имени. Если такой процедуры нет, происходит исключение UNDEFPROC. Соответственно, на этапе выполнения так же проверяются типы, количество параметров и тип возвращаемого значения. В случае ошибок происходят исключения BADPARAM или BADRETVAL.

Примеры оператора выполнения процедуры

  1.  

    call myproc("auto",,1,aa) into bb;
  2.  

    create or replace procedure tst_param (in id int; in ch char(10); out answ
      char(20)) result int for debug
    code
      answ:= tochar(id) +"  " + ch; //
      return 0; //
    end; //
    
    call tst_param(?,:arg2);
    235
    abcd
    
    output parameters ( 235  abcd )
  3.  

    create or replace table T1 (id int primary key, s int);
    insert into T1 values (2, 300);
    insert into T1 values (7, 200);
    insert into T1 values (4, 600);
    
    create or replace procedure procedure1() result int for debug
    declare
      var a int;//
    code
      execute "select max(s) from SYSTEM.T1;" into a;//
      return a;//
    end;
    
    create or replace procedure procedure0() result int for debug
    declare
      var a int;//
    code
      call SYSTEM.procedure1() as owner into a;//
      return a;//
      exceptions
        when all then resignal;//
    end;
    
    create or replace user U1 identified by '12345';
    grant resource to U1;
    grant execute as owner on procedure1 to U1;
    grant execute as owner on procedure0 to U1;
    
    username U1/12345
    
    execute SYSTEM.procedure0() as owner;
    |600|
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter