這個問題似乎是因爲你有一個過程對另一個過程中靜態引用的對象執行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
這看起來完全正確的。其他程序是否安裝並可執行(許可明智)? –
每個程序都在運行並可以執行。但是依賴於程序tack(400);只有大頭釘(400)被執行,其他三個纔可以執行 – Darla
大頭釘有什麼作用?它是否包含DDL查詢? – Aleksej