Проблема заключается в том, что у вас есть процедура, выполняющая DDL над объектом, который статически ссылается на другую процедуру; например, если я определяю:
create table runtimeTable as select 1 as one from dual;
create or replace procedure createTable is
begin
execute immediate 'drop table runtimeTable';
execute immediate 'create table runtimeTable as select 1 as one from dual';
end;
create or replace procedure useTable is
vVar number;
begin
select one
into vVar
from runtimeTable;
--
dbms_output.put_line(vVar);
end;
create or replace procedure createAndUseTable is
begin
createTable;
useTable;
end;
/
, когда я пытаюсь выполнить createAndUseTable
я получаю:
ORA-04068: существующее состояние пакетов было сброшено ORA-04065: не выполняется, изменены или отложенная хранимая процедура «ALEK.USETABLE» ORA-06508: PL/SQL: не удалось найти вызываемый программный модуль: «ALEK.USETABLE» ORA-06512: на «ALEK.CREATEANDUSETABLE», строка 4 ORA-06512: at строка 1
Если вам строго нужно выполнить время выполнения DDL, вам необходимо использовать динамический SQL для ссылки на измененный объект; например, если я определить процедуру useTable
таким образом
create or replace procedure useTable is
vVar number;
begin
execute immediate
'select one
from runtimeTable'
into vVar;
--
dbms_output.put_line(vVar);
end;
вызов createAndUseTable
будет работать:
SQL> exec createAndUseTable
1
Это выглядит абсолютно правильно. Установлены ли и другие процедуры (разрешено?)? –
Каждая процедура работает и может быть выполнена. Но существует зависимость от процедуры (400); Только если выполняется действие (400), остальные три могут выполнить – Darla
Что делает галс? Имеет ли он запрос DDL? – Aleksej