存储过程调存储过程实例

来源:互联网 发布:阿里在线编程测验 编辑:程序博客网 时间:2024/06/04 19:57
-- 创建table
create table tab_time(
       current_time timestamp       
);
create table tab_time2(
       current_time timestamp       
);
 
-- 创建存储过程
create or replace procedure pro_job_print
as
   begin
       --dbms_output.put_line('系统时间:' || to_char(sysdate, 'dd-mm-yyyy hh24:mi:ss'));
       insert into tab_time values(sysdate);
   end;
   
create or replace procedure pro_job_print2
as
   begin
       --dbms_output.put_line('系统时间:' || to_char(sysdate, 'dd-mm-yyyy hh24:mi:ss'));
       insert into tab_time values(sysdate);
   end;
   
-- 调用过程测试   
call students.pro_job_print();
call students.pro_job_print2();


select a.*,a.rowid  from tab_time a;
select a.*,a.rowid  from tab_time2 a;




--方式1
create or replace procedure call_proc_all_test as
begin
  pro_job_print();
  pro_job_print2();


exception
  when others then
    dbms_output.put_line('SQL CODE:' || sqlcode || chr(10) || sqlerrm ||
                         chr(10) || dbms_utility.format_error_backtrace());
  
end;


call call_proc_all();




--存放存储过程信息的表  将需要调的存储过程名字及其他信息放到一张表里
create table students.proc_list(
ID Number(4) NOT NULL PRIMARY KEY,
proc_order number(4),
proc_name varchar2(200),
proc_desc varchar2(200),
proc_user varchar2(50)
)


--序列
CREATE SEQUENCE proc_list_sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
NOCACHE -- 不建缓冲区


select a.*,a.rowid from students.proc_list a;
insert into students.proc_list values (proc_list_sequence.nextval,1,'pro_job_print','打印表','students');
insert into students.proc_list values (proc_list_sequence.nextval,2,'pro_job_print2','打印表2','students');


--日志表的序列
CREATE SEQUENCE log_sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
NOCACHE -- 不建缓冲区






--调用存储过程 方式2
create or replace procedure call_proc as
v_name  varchar2(200);
v_sql varchar2(4000);
 cursor v_task is --声明游标
    select proc_name from students.proc_list a order by a.proc_order desc;


begin
  open v_task; --打开游标


  --循环游标
  loop
    fetch v_task
      into v_name; --取值
    exit when v_task%notfound; --当没有记录时退出循环
    dbms_output.put_line('proc_name=' || v_name);
    v_sql := 'call ' || v_name || '()';
    execute immediate v_sql;
  end loop;
  close v_task;
end;


select proc_name from students.proc_list a order by a.proc_order desc;
    
    
--创建日志表 
create table students.call_proc_log(
ID Number(9) NOT NULL PRIMARY KEY,
excu_sql varchar2(2000),
exec_result varchar2(200),
exec_time date
)


call students.call_proc();


select a.*,a.rowid  from tab_time a;
select * from tab_time2;
select * from students.call_proc_log;

0 0
原创粉丝点击