这个问题似乎是因为你有一个过程对另一个过程中静态引用的对象执行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