create or replace procedure EK_GET_EMPLOYEE_NUM is
s_lastDate DATE; --最后更新时间 // 定义变量
s_currDate DATE; --当前更新时间
begin
s_currDate := sysdate;
select s.f_last_date into s_lastDate from EK_LOG_SYNC s where s.f_tbale_name = 'T_Ent_User_Dir';
update siebel.S_ORG_EXT_X t set (attrib_16)=( //这里面及易报错,例如单行子查询返回多行
select m."F_FactCount" from siebel.S_ORG_EXT o
left join T_Ent_User_Dir@EK107_EK00 m on o.loc = m."F_Code"
where m."F_FactCount" is not null and o.row_id = t.row_id
)where exists
(
select 1 from siebel.S_ORG_EXT o
left join T_Ent_User_Dir@EK107_EK00 m on o.loc = m."F_Code"
where m."F_FactCount" is not null and o.row_id = t.row_id
);
update EK_LOG_SYNC s set s.f_last_date = s_currDate where s.f_tbale_name = 'T_Ent_User_Dir';
INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步成功');
commit; //注意提交事物
exception //出现异常时执行
when others then
DBMS_OUTPUT.put_line('sqlcode : ' ||sqlcode); //输出出错日志信息
DBMS_OUTPUT.put_line('sqlerrm : ' ||sqlerrm);
rollback;
INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步失败');
commit;
end EK_GET_EMPLOYEE_NUM;
昨天肚子太饿了,写到这里没有力气写下去,今天继续哈!
接下来说说存储过程的调用和跟踪, 写了存储过程编译通过后,它并不会执行,而是要放在Job 中去执行,而且还可以设置其执行的时间和频率,截图来看看:
jobs的新建和配置的话,请参考另一篇日志,我已经在网上找到了,这里先不具体说,这里只要知道jobs是用来执行存储过程的就OK!
接下来说说存储过程的跟踪,如果只是可以执行显然不完善,因为如果这样执行出错了你也不知道,所以存储过程中有对成功或者失败的跟踪代码:
INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步成功'); //这是成功的代码
如果执行出现异常,在异常中处理跟踪信息:
exception //出现异常时执行
when others then
DBMS_OUTPUT.put_line('sqlcode : ' ||sqlcode); //输出出错日志信息
DBMS_OUTPUT.put_line('sqlerrm : ' ||sqlerrm);
rollback;
INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步失败');
commit;
这里的在ORACLE中新建了一张test 表用来记录成功或者失败信息, 失败的时间,和同步失败的信息在出错的情况下会被写到这张表中!
这样,只要打开这张表,就可以查看各个存储过程是否正常运行,如果出错就要去排查错误了! 但是这个还需要改进,因为记录的信息太少 了,根本无法知道是因为什么原因出错!所以,接下来要进行这个跟踪信息的改善工作!
s_lastDate DATE; --最后更新时间 // 定义变量
s_currDate DATE; --当前更新时间
begin
s_currDate := sysdate;
select s.f_last_date into s_lastDate from EK_LOG_SYNC s where s.f_tbale_name = 'T_Ent_User_Dir';
update siebel.S_ORG_EXT_X t set (attrib_16)=( //这里面及易报错,例如单行子查询返回多行
select m."F_FactCount" from siebel.S_ORG_EXT o
left join T_Ent_User_Dir@EK107_EK00 m on o.loc = m."F_Code"
where m."F_FactCount" is not null and o.row_id = t.row_id
)where exists
(
select 1 from siebel.S_ORG_EXT o
left join T_Ent_User_Dir@EK107_EK00 m on o.loc = m."F_Code"
where m."F_FactCount" is not null and o.row_id = t.row_id
);
update EK_LOG_SYNC s set s.f_last_date = s_currDate where s.f_tbale_name = 'T_Ent_User_Dir';
INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步成功');
commit; //注意提交事物
exception //出现异常时执行
when others then
DBMS_OUTPUT.put_line('sqlcode : ' ||sqlcode); //输出出错日志信息
DBMS_OUTPUT.put_line('sqlerrm : ' ||sqlerrm);
rollback;
INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步失败');
commit;
end EK_GET_EMPLOYEE_NUM;
昨天肚子太饿了,写到这里没有力气写下去,今天继续哈!
接下来说说存储过程的调用和跟踪, 写了存储过程编译通过后,它并不会执行,而是要放在Job 中去执行,而且还可以设置其执行的时间和频率,截图来看看:
jobs的新建和配置的话,请参考另一篇日志,我已经在网上找到了,这里先不具体说,这里只要知道jobs是用来执行存储过程的就OK!
接下来说说存储过程的跟踪,如果只是可以执行显然不完善,因为如果这样执行出错了你也不知道,所以存储过程中有对成功或者失败的跟踪代码:
INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步成功'); //这是成功的代码
如果执行出现异常,在异常中处理跟踪信息:
exception //出现异常时执行
when others then
DBMS_OUTPUT.put_line('sqlcode : ' ||sqlcode); //输出出错日志信息
DBMS_OUTPUT.put_line('sqlerrm : ' ||sqlerrm);
rollback;
INSERT INTO TEST VALUES (sysdate, 'T_Ent_User_Dir同步失败');
commit;
这里的在ORACLE中新建了一张test 表用来记录成功或者失败信息, 失败的时间,和同步失败的信息在出错的情况下会被写到这张表中!
这样,只要打开这张表,就可以查看各个存储过程是否正常运行,如果出错就要去排查错误了! 但是这个还需要改进,因为记录的信息太少 了,根本无法知道是因为什么原因出错!所以,接下来要进行这个跟踪信息的改善工作!