本人小白,培训的时候因为欠缺数据库老师,想通过这里学习一下数据库的存储过程写法。
前些日子手写了一个触发器,表1的增删改会触发触发器使表2值+1.
同时有些了一个定时器,定时查询表2的值,但是发现定时器需要写一个存储过程的sql。特地来请教大神来教我一些存储过程。谢谢各位大神们
我这恰好有这个资料,希望对你有帮助;
http://blog.csdn.net/hackage4619/article/details/59075813
create or replace procedure collection_delAider is
/**
每天定时查看逾期客户表中辅助人的辅助结束日期是否等于今天,如果等于就清空
*/
loanNo cs_collection_list.loan_no%type;
--先查询出数据,并存放(可能有多个值),游标或集合都可以存
cursor cur is
select loan_no
from cs_collection_list
where to_char(aiderdate_end, 'yyyy/mm/dd') <=
to_char(sysdate, 'yyyy/mm/dd')
and final_status is null;
begin
for x in cur loop
loanNo :=x.loan_no;
--判断是否存在
IF (loanNo IS NOT NULL ) THEN
--修改数据
update cs_collection_list cl
set cl.aider_no = '', cl.aiderdate_begin = '', cl.aiderdate_end = ''
where cl.loan_no = loanNo;
ELSE
NULL;
END IF ;
end loop;
end collection_delAider;
Oracle存储过程简单实例
/*不带任何参数存储过程(输出系统日期)*/
create or replace procedure output_date is
begin
dbms_output.put_line(sysdate);
end output_date;
/*带参数in和out的存储过程*/
create or replace procedure get_username(v_id in number,v_username out varchar2)
as
begin
select username into v_username from tab_user where id = v_id; --变量赋值
exception
when no_data_found then
raise_application_error(-20001,'ID不存在!');
end get_username;
--查询值有多个时可用游标或集合存放
create or replace procedure HYDXWG is
v_kbp varchar2(20);
v_kpi_no number(20);
v_dctime number(20);
v_writetime number(20);
v_valrate number(20);
cursor cur is
select kbp, a, dctime, writetime, valrate
from ResGsmgAndNodeDown;
BEGIN
for x in cur loop
v_kbp :=x.kbp;
-- ....
--看你抓出這些值要做什麽
end loop;
end
--判断值是否为空
IF (BEGDATE IS NOT NULL AND ENDDATE IS NOT NULL) THEN
SQL := SQL || ' AND TO_CHAR(CZSJ,''YYYY-MM-DD'') >= TO_CHAR(BEGDATE,''YYYY-MM-DD'')
AND TO_CHAR(CZSJ,''YYYY-MM-DD'') <= TO_CHAR(ENDDATE,''YYYY-MM-DD'')
GROUP BY TO_CHAR(CZSJ,''YYYY-MM-DD'')';
ELSE
IF (BEGDATE IS NULL AND ENDDATE IS NOT NULL) THEN
SQL := SQL ||
' AND TO_CHAR(CZSJ,''YYYY-MM-DD'') <= TO_CHAR(ENDDATE,''YYYY-MM-DD'')
GROUP BY TO_CHAR(CZSJ,''YYYY-MM-DD'')';
ELSE IF (BEGDATE IS NOT NULL AND ENDDATE IS NULL) THEN
SQL:=SQL||' AND TO_CHAR(CZSJ,''YYYY-MM-DD'') >= TO_CHAR(BEGDATE,''YYYY-MM-DD'')
GROUP BY TO_CHAR(CZSJ,''YYYY-MM-DD'')';
ELSE
NULL;
END IF ;
--循环
while v_date<=sysdate loop
dbms_output.put_line(to_char(v_date,'yyyy-mm-dd'));
v_date:= v_date + 1;
end loop;
--判断值大小
IF FLAG>5 and FLAG<=10 THEN
V_VALUE :=1;
ELSIF FLAG>10 THEN
V_VALUE :=2;
ELSIF FLAG<20 THEN
V_VALUE :=3;
ELSIF FLAG<39 THEN
V_VALUE :=4;
ELSE V_VALUE :=5;
END IF;
个人学习存储过程的总结
希望对你有所帮助