2016-11-10 33 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:对象academics_insert无效。 PL/SQL: 语句被忽略。

+0

这看起来完全正确的。其他程序是否安装并可执行(许可明智)? –

+0

每个程序都在运行并可以执行。但是依赖于程序tack(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

是的,我正在使用DDL的动态SQL。但是我怀疑它们是在并行执行的。后三个过程依赖于第一个过程,所以并行作业过程可能会影响执行。是吗? – Darla

相关问题