一个接一个地执行多个程序不起作用

时间:2016-11-10 13:12:44

标签: oracle plsql

我正在尝试执行一个程序,而这个程序又应该一个接一个地执行其他四个程序。我如何实现这一目标?

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:   声明被忽略了。

1 个答案:

答案 0 :(得分: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:第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