2016-11-10 3 views
0

Я пытаюсь выполнить процедуру, которая в свою очередь должна выполнять четыре другие процедуры один за другим. Как это сделать?Выполнение нескольких процедур один за другим не работает

Create or replace procedure mainproc 
as 
begin 
tack(400); 
phno_insert; 
address_insert; 
academics_insert; 
commit; 
end; 

Сообщение об ошибке:

PLS-00905: phno_insert объект является недействительным. PL/SQL: заявление игнорируется. PLS-00905: Объект address_insert недействителен. PL/SQL: заявление игнорируется. PLS-00905: Object academics_insert недействителен. PL/SQL: Заявление игнорируется.

+0

Это выглядит абсолютно правильно. Установлены ли и другие процедуры (разрешено?)? –

+0

Каждая процедура работает и может быть выполнена. Но существует зависимость от процедуры (400); Только если выполняется действие (400), остальные три могут выполнить – Darla

+0

Что делает галс? Имеет ли он запрос DDL? – Aleksej

ответ

1

Проблема заключается в том, что у вас есть процедура, выполняющая 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 
+0

Да, я использую динамический SQL для DDL.Но я сомневаюсь, что они выполняются параллельно. Последние три процедуры зависят от первой процедуры, поэтому параллельные процессы работы могут влиять на выполнение. Это так? – Darla