可以,调用的时候采用动态SQL就行了。例如:
declare
proc_name varchar(100);
sql_str varchar(200):='begin ';
cursor name_cur is select procname from sometable;
begin
open name_cur;
loop
fetch name_cur into proc_name ;
exit when name_cur%NOTFOUND;
sql_str := sql_str||proc_name||'; '
end loop;
close name_cur;
sql_str := sql_str||' end; '
execute immediate sql_str;
end;
/
declare
proc_name varchar(100);
sql_str varchar(200):='begin ';
cursor name_cur is select procname from sometable;
begin
open name_cur;
loop
fetch name_cur into proc_name ;
exit when name_cur%NOTFOUND;
sql_str := sql_str||proc_name||'; '
end loop;
close name_cur;
sql_str := sql_str||' end; '
execute immediate sql_str;
end;
/
create or replace procedure name_pro
as
str varchar2(100):='begin';
cursor t_sor is
select object_name from user_objects where object_type='PROCEDURE';
begin
for v_sor in t_sor loop
str:=str||v_sor.object_name||';';
end loop;
str:=str||'end;';
execute immediate str;
end;
/
str varchar2(100):='begin ';
你这样可是把所有的存储过程都执行了一遍,太......如果有参数,也同样可以用我的方法,只要把参数也拼在动态SQL中,不就行了吗?
1. 从user_objects找出object_type为PROCEDURE的所有object_name;
2. 循环中根据object_name组合动态SQL语句;
3. 根据ORACLE服务器版本调用两种动态SQL语句方式(Native、DBMS_SQL)来执行该动态语句;
4. 循环完成,OK。