我正在尝试执行一个程序,而这个程序又应该一个接一个地执行其他四个程序。我如何实现这一目标?
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 :(得分: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