公司用Oracle,····自己这块太差·····,特别是pl/sql,以后要好好学习pl/sql了。
要实现的一个小功能是如果本月没有添加记录,自动把上个月的纪录插入进去。
第一步:先创建存储过程:
create or replace procedure JOB_REP_TARGET as
cursor allTarget
IS
select * from rep_b_target --这里可以仿照job_card_today写一个function去获取数据源
where DEL_FLAG = 0 and begin_time = TRUNC(LAST_DAY(SYSDATE))+1 ; --获取所有的没有设置目标的数据源
BEGIN
for target in allTarget
LOOP
INSERT INTO rep_b_target
(
B_TARGET_ID,
B_TARGET_E_USER_ID,
B_TARGET_TYPE,
B_TARGET_DEPART_ID,
B_TARGET_GROUP_ID,
BEGIN_TIME,
END_TIME,
B_TARGET_VALUE,
DATA_STATE,
DATA_SORT,
CREATE_TIME,
CREATE_USER_ID,
DEL_FLAG,
B_TARGET_TEAM_ID
)
VALUES
(
SEQ_REP_B_TARGET.NEXTVAL,
target.B_TARGET_E_USER_ID,
target.B_TARGET_TYPE,
target.B_TARGET_DEPART_ID,
target.B_TARGET_GROUP_ID,
target.BEGIN_TIME,
target.END_TIME,
target.B_TARGET_VALUE,
target.DATA_STATE,
target.DATA_SORT,
target.CREATE_TIME,
target.CREATE_USER_ID,
target.DEL_FLAG,
target.B_TARGET_TEAM_ID
);
END LOOP;
END ;
第二步:创建job
主要有三个参数
what :JOB_REP_TARGET; (同志们啊,这个分号一定要加上,因为这个找了很久)
next date:2010-10-1 12:00:00
interval:TRUNC(LAST_DAY(SYSDATE))+1 (这个是每个月的第一天执行) 。
已完毕!
可以改进的地方:灰色部分
看见同事这个地方采用的是一个function,这个function也找了好久。
cursor allTarget
IS
SELECT * FROM TABLE(IMPORT_CARD_DATA(SYSDATE));
现在将同事的那个function贴出来看看
create or replace function IMPORT_CARD_DATA(CARD_DATE DATE)
return TT_HR_CARD_TODAY_TABLE
pipelined is
E_USER_ID pls_integer;
CARD_TIME DATE;
begin
return;
end IMPORT_CARD_DATA;
涉及到的
管道化数据函数
http://log-cd.javaeye.com/blog/411123