Компиляция хранимой процедуры

Определение оператора компиляции существующей хранимой процедуры.

Спецификация

   
<компиляция хранимой процедуры>::=

Синтаксические правила

  1. <Имя хранимой процедуры> должно ссылаться на существующую в БД хранимую процедуру.

Общие правила

  1. Необходимость в перекомпиляции хранимой процедуры возникает в случае, если процедура использует претранслированные запросы, а указанные в них таблицы были пересозданы или изменена их структура.

  2. Команда доступна только владельцу процедуры.

  3. Для выполнения команды надо иметь привилегию RESOURCE.

Пример

grant resource to U1;
grant resource to U2;
username U1/
create or replace table test (i int);
insert into test values (1);
insert into test values (2);

create or replace procedure cnt() result int
declare
  var a cursor(i int); //
code
  open a for "select count(*) from test;"; //
  return a.i; //
end;

! Должно быть  2
execute cnt();
grant execute on cnt to U2;
grant select on test to U2;
username U2/
create or replace table test (i int);
insert into test values (1);
! Тоже должно быть 2

execute u1.cnt();
username U1/
drop table test;
create table test(i int, k int);
insert into test values (1,1);
insert into test values (2,2);
insert into test values (3,3);
! Должно быть NULL –  таблица изменена
execute cnt();
grant select on test to U2;

username U2/
! Команда не доступна   (выполняет не владелец процедуры)
rebuild procedure u1.cnt;
! Должно быть  NULL –  таблица изменена
execute u1.cnt();
username U1/
rebuild procedure u1.cnt;
! Должно быть 3
execute cnt();
username U2/
! Должно быть 3
execute u1.cnt();
username SYSTEM/MANAGER
drop user u1 cascade;
drop user u2 cascade;