存储过程
存储过程是数据库提供的批量执行事务的功能,可以直接被应用程序调用,接受输入参数,返回输出参数或者查询结果集。支持变量定义和游标cursor。
创建存储过程
SQL> create or replace procedure procedure_name is
# 变量定义
v_temp varchar(50)
begin
# 给变量赋值
select xxx from table/object/function into v_temp ;
select/insert/update/delete...
commit;
end procedure_name;
/
存储过程中使用游标
SQL> create or replace procedure procedure_name is
# 变量定义
declare
v_id varchar(50)
v_name varchar(50)
# 游标的两种定义方法
# cursor v_cursor is select id, name from table
v_cursor cursor for select id, name from table
begin
# 打开游标
open v_cursor
# 循环处理结果集
loop
# 用游标读取一行赋值给变量v_temp ,
fetch v_cursor into v_id, v_name;
if xxx
end if;
# 处理数据
select/insert/update/delete...
end loop;
# 关闭游标
close v_cursor;
commit;
end procedure_name;
/
存储过程中使用循环
1分钟执行一次,执行30次
SQL> create or replace procedure procedure_name is
begin
for i in 1..30 loop
select/insert/update/delete...
commit;
sleep(60);
end loop;
end procedure_name;
/
存储过程中使用参数
SQL> create or replace procedure procedure_name(in s_var varchar(10) is
...
查询存储过程
SQL> select * from adm_procedures where object_name='procedure_name ';
手动调用存储过程
SQL> call procedure_name;
带参数的存储过程怎样调用?
存储过程中调用存储过程
procedure a
begin
...
insert #table exec b
end
procedure b
begin
...
insert #table exec c
select * from #table
end
procedure c
begin
...
select * from sometable
end
删除存储存储过程
SQL> drop procedure_name;
定时任务
和操作系统的定时任务cron类似,提供定时周期执行某项事务的功能。
创建定时任务
SQL> declare jobno number;
begin
# 定时任务中调用存储过程,每30分钟执行一次
dbe_task.submit(jobno, 'procedure_name()', sysdate, 'sysdate+1800/6400' );
# 每小时执行一次
# dbe_task.submit(jobno, 'procedure_name()', sysdate, 'sysdate+1/24' );
# 每天凌晨3点执行
# dbe_task.submit(jobno, 'procedure_name()', sysdate, 'trunc(sysdate+1) + (3*60)/(24*60)' );
commit;
end;
/
查询JOB
SQL> select * from my_jobs where job='job_id';
删除job
SQL> declare
begin
dbe_task.cancel(job_id);
commit;
end;
/