CREATE OR REPLACE PROCEDURE A_MEAS_MIINSP_PLAN_CREATE
AS
vs_msg VARCHAR2(4000);
p_PERIODTYPE number; --周期类型
p_ISAUTOCRATEPLAN number; --是否自动创建
p_PERIODVALUE number; --周期值
p_LASTEXECURTDATE DATE; --上次执行日期
p_NEXTEXECURTDATE DATE; --下次执行日期
p_count number; --自动创建的器具数量
p_current_ym varchar2(50); --当前年月
p_maxnum number; --检定计划最新的编号
p_new_plancode number; --检定计划新编号
p_msg varchar2(1000); --日志信息
v_instrun SYS_REFCURSOR; --声明游标变量
v_group_org_id_cursor SYS_REFCURSOR;

v_group_org_id varchar2(100);
v_mi_id number;
v_MI_STATUS varchar2(100);
v_mi_org_id varchar2(100);
v_insdate DATE; --检定日期

p_updatemiids varchar2(1000);
p_insertplancode varchar2(1000);

config_count number; --配置表数量

current_dscr varchar2(200); --当前单位
new_plan_name varchar2(200); --当前新计划名称

begin
insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,'开始执行A_MEAS_MIINSP_PLAN_CREATE存储过程','execute','A_MEAS_MIINSP_PLAN_CREATE');

select count(*) into config_count from a_meas_miinsp_config;

--判断是否自动创建
if(config_count<1) then
begin

insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,'A_MEAS_MIINSP_CONFIG不存在记录','execute','A_MEAS_MIINSP_PLAN_CREATE');
insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,'结束执行A_MEAS_MIINSP_PLAN_CREATE存储过程','execute','A_MEAS_MIINSP_PLAN_CREATE');
commit;
return;
end;
end if;

--获取配置表中的数据
select PERIODTYPE,ISAUTOCRATEPLAN,PERIODVALUE,LASTEXECURTDATE into p_PERIODTYPE, p_ISAUTOCRATEPLAN,p_PERIODVALUE, p_LASTEXECURTDATE from a_meas_miinsp_config;

if( p_ISAUTOCRATEPLAN=0) then
Begin
insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,'A_MEAS_MIINSP_CONFIG表记录配置不需要自动创建记录','execute','A_MEAS_MIINSP_PLAN_CREATE');
insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,'结束执行A_MEAS_MIINSP_PLAN_CREATE存储过程','execute','A_MEAS_MIINSP_PLAN_CREATE');
commit;
return;
end;
end if;

if(p_PERIODTYPE=1)
then
begin
--获取下次执行日期
if(p_LASTEXECURTDATE is null)
then
--设置最后更新的日期为当前时间,和下次更新时间
p_LASTEXECURTDATE:=to_date(to_char(SYSDATE,'yyyy-mm-dd') ,'yyyy-mm-dd');
p_NEXTEXECURTDATE:=to_date(to_char(ADD_MONTHS(trunc(sysdate,'mm'), p_PERIODVALUE),'yyyy-mm-dd') ,'yyyy-mm-dd');
else
p_NEXTEXECURTDATE:=to_date( to_char(ADD_MONTHS(p_LASTEXECURTDATE, p_PERIODVALUE),'yyyy-MM-dd'),'yyyy-mm-dd');
--SELECT to_char(ADD_MONTHS(p_LASTEXECURTDATE, p_PERIODVALUE),'yyyy-MM-dd') INTO p_NEXTEXECURTDATE FROM DUAL;
end if;

end;
end if;
p_count:=0;
--判断当前时间是否大于最后执行的时间
if(p_LASTEXECURTDATE <=to_date(to_char(SYSDATE,'yyyy-mm-dd') ,'yyyy-mm-dd'))
then
begin
--定义游标
--declare v_instrun_1 cursor for select mi_id,MI_STATUS,mi_org_id from a_meas_instru_ccount where VERIFICTION_DATE BETWEEN p_LASTEXECURTDATE AND p_NEXTEXECURTDATE AND MI_STATUS IN ('1','4');
--定义游标

OPEN v_instrun FOR
select mi_id,MI_STATUS,mi_org_id,VERIFICTION_DATE from a_meas_instru_ccount where VERIFICTION_DATE BETWEEN p_LASTEXECURTDATE AND p_NEXTEXECURTDATE AND MI_STATUS IN ('1','4') AND VERIFICTION_PLANT=0;

--定义游标
--declare v_group_org_id_cursor_1 cursor for select mi_org_id from a_meas_instru_ccount where VERIFICTION_DATE BETWEEN p_LASTEXECURTDATE AND p_NEXTEXECURTDATE AND MI_STATUS IN ('1','4')
-- group by mi_org_id ;

open v_group_org_id_cursor FOR
select mi_org_id from a_meas_instru_ccount where VERIFICTION_DATE BETWEEN p_LASTEXECURTDATE AND p_NEXTEXECURTDATE AND MI_STATUS IN ('1','4') AND VERIFICTION_PLANT=0
group by mi_org_id ;

--获取总记录数
select count(*) into p_count from a_meas_instru_ccount where VERIFICTION_DATE BETWEEN p_LASTEXECURTDATE AND p_NEXTEXECURTDATE AND MI_STATUS IN ('1','4') AND VERIFICTION_PLANT=0;
end;
else
begin
insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,'本次检定周期时间大于当前时间','execute','A_MEAS_MIINSP_PLAN_CREATE');
insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,'结束执行A_MEAS_MIINSP_PLAN_CREATE存储过程','execute','A_MEAS_MIINSP_PLAN_CREATE');
commit;
return;
end;
end if;

if(p_count>0)
then
p_updatemiids:='更新器具台帐表的状态:';
p_insertplancode:='新增检定计划明细表:';
loop
FETCH v_group_org_id_cursor into v_group_org_id;
EXIT WHEN v_group_org_id_cursor%NOTFOUND;

p_current_ym := TO_CHAR(SYSDATE,'yyyymm');
select max(substr(plan_code,length(plan_code)-3,4))+1 into p_maxnum
from A_MEAS_MIINSP_PLAN
where plan_code like '%'||p_current_ym||'%';

if(p_maxnum is null)
then
p_new_plancode:= p_current_ym||'0001';
elsif (length(p_maxnum)=1)
then
p_new_plancode:= p_current_ym||'000'||p_maxnum;
elsif (length(p_maxnum)=2)
then
p_new_plancode:= p_current_ym||'00'||p_maxnum;
elsif (length(p_maxnum)=3)
then
p_new_plancode:= p_current_ym||'0'||p_maxnum;
elsif (length(p_maxnum)=4)
then
p_new_plancode:= p_current_ym||p_maxnum;
end if;
--新增检定计划表
SELECT dscr into current_dscr FROM V_MEAS_DEPT where EQ_NAME = v_group_org_id;

new_plan_name:='自动创建计划:'||current_dscr;

INSERT INTO A_MEAS_MIINSP_PLAN (
PLAN_CODE, REPORT_STATE,CREATE_DATE,
PLAN_ORGID, PLAN_NAME, CREATE_TYPE,change_time,Change_Userid)
VALUES (
p_new_plancode, 2,sysdate,
v_group_org_id,new_plan_name,1 ,sysdate,'sysadmin');
p_msg:='新增检定计划表:'||p_new_plancode||',组织机构ID:'||v_group_org_id;
insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,p_msg,'insert','A_MEAS_MIINSP_PLAN_CREATE+A_MEAS_MIINSP_PLAN');
p_insertplancode:='';
p_updatemiids:='';

open v_instrun for
select mi_id,MI_STATUS,mi_org_id,VERIFICTION_DATE from a_meas_instru_ccount where VERIFICTION_DATE BETWEEN p_LASTEXECURTDATE AND p_NEXTEXECURTDATE AND MI_STATUS IN ('1','4') AND VERIFICTION_PLANT=0;

loop
FETCH v_instrun into v_mi_id,v_MI_STATUS,v_mi_org_id,v_insdate;
EXIT WHEN v_instrun%NOTFOUND;

if(v_group_org_id=v_mi_org_id)
then
--新增检定计划明细表
INSERT INTO A_MEAS_MIINSP_DETAIL (
PLAN_CODE, MI_ID, CREATE_DATE,
OLD_MI_STATUS,INS_DATE
) VALUES (
p_new_plancode,v_mi_id,sysdate,
v_MI_STATUS,v_insdate
);
p_insertplancode:= p_insertplancode||p_new_plancode||',组织机构ID:'||v_mi_org_id||',器具id:'||v_mi_id;

--更新器具台帐表的状态
UPDATE A_MEAS_INSTRU_CCOUNT SET MI_STATUS = 2,operatedate=sysdate,operateuser='sysadmin' WHERE MI_ID =v_mi_id;

p_updatemiids:=p_updatemiids||',组织机构ID:'||v_mi_org_id||',器具id:'||v_mi_id;

end if;
END LOOP;

insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,p_insertplancode,'insert','A_MEAS_MIINSP_PLAN_CREATE+A_MEAS_MIINSP_DETAIL');
insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,p_updatemiids,'update','A_MEAS_MIINSP_PLAN_CREATE+A_MEAS_INSTRU_CCOUNT');

END LOOP;

CLOSE v_instrun; --关闭游标变量
CLOSE v_group_org_id_cursor; --关闭游标变量

--更新配置表中最后的更新日期
update a_meas_miinsp_config set LASTEXECURTDATE=p_NEXTEXECURTDATE;
insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,'更新计量模块检定计划配置表的下次检定时间:'||p_NEXTEXECURTDATE,'execute','A_MEAS_MIINSP_PLAN_CREATE+A_MEAS_MIINSP_CONFIG');
end if;
--添加日志
insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,'结束执行A_MEAS_MIINSP_PLAN_CREATE存储过程','execute','A_MEAS_MIINSP_PLAN_CREATE');
COMMIT;

EXCEPTION
WHEN OTHERS THEN
vs_msg := 'ERROR IN A_MEAS_MIINSP_PLAN_CREATE '||SUBSTR(SQLERRM,1,500);
ROLLBACK;
--添加日志
insert into a_meas_miinsp_log(CREATE_DATE,BODY,EXECUTE,LOGTYPE) values(sysdate,vs_msg,'execute','A_MEAS_MIINSP_PLAN_CREATE');
COMMIT;
RETURN;
end;

oracle_存储过程_没有参数_根据配置自动创建申请单以及写日志事务回滚的更多相关文章

  1. oracle_存储过程_没有参数_更新过期申请单以及写日志事务回滚

    CREATE OR REPLACE PROCEDURE A_MEAS_MIINSP_PLAN_UPDATEASvs_msg VARCHAR2(4000);log_body VARCHAR2(400); ...

  2. Oracle并行事务回滚相关参数及视图

    /******相关参数****/fast_start_parallel_rollback1.取值有3种:false,low,high2.各值含义:false  ---禁用并行回滚功能          ...

  3. JPA事务回滚配置

    <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.or ...

  4. ssm 配置事务回滚

    参考:https://blog.csdn.net/Mint6/article/details/78363761 在 applicationContext.xml 中配置好了事务和数据源等必须要用到的配 ...

  5. oracle_存储过程_有参数_获取部门装置层级树

    create or replace procedure P_UTIL_TREE(P_APPL_NAME in VARCHAR2, P_HIERARCHY_TYP in VARCHAR2, TREETY ...

  6. (四)log4j同配置下多个进程写日志

    原文链接:https://blog.csdn.net/voiceofwind/article/details/51966361 由于起了两个不同的任务,log4j中用的是一套配置,写入的是同一个路径, ...

  7. EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...

  8. SQL 存储过程中事务回滚

    在事务语句最前面加上 set xact_abort on GO SET QUOTED_IDENTIFIER OFF GO ALTER PROCEDURE [dbo].[test] @a int, @b ...

  9. spring boot rabbitmq 多MQ配置 自动 创建 队列 RPC

      源码地址:https://github.com/hutuchong518/RabbitmqStudy 需求:   spring boot 整合 rabbitmq rpc功能, 需要将 请求和响应 ...

随机推荐

  1. hdoj1251 统计难题 字典树

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  2. 深入理解php 匿名函数和 Closure

    而在PHP 5.3发布的时候, 其中有一条new feature就是支持闭包/Lambda Function, 我第一反应是以为zval新增了一个IS_FUNCTION, 但实际上是构造了一个PHP ...

  3. 【快速查阅】Linux下启动和关闭Weblogic(管理服务器+被管服务器)

    Weblogic的管理服务器和被管服务器的启动.关闭,偶尔会用到,却又不常用,导致需用时却忘记了,而又重新查阅HELP. 故,以此记录,方便查阅.执行. 首先,weblogic的启动脚本和关闭脚本都在 ...

  4. python2 除法保留两位小数

  5. JAVA-JSP表达式

    相关资料: <21天学通Java Web开发> 结果总结: 1.<%= %>JSP表达式中的代码会首先执行,然后转换成字符串显示到网页上.2.JSP表达式标签不必也不能使用分号 ...

  6. SpringMVC之学习(0)

    Spring MVC 是一个模型 - 视图 - 控制器(MVC)的Web框架建立在中央前端控制器servlet(DispatcherServlet),它负责发送每个请求到合适的处理程序,使用视图来最终 ...

  7. sparkStreaming 练习

    val updateFunc2 = (iter:Iterator[(String,Seq[Int],Option[Int])])=>{ iter.map{case (x,y,z) => / ...

  8. 【C#/WPF】如何查看System.Windows.Interactivity.dll中EventTrigger的EventNames属性有哪些

    WPF项目中,从Nuget搜索并下载System.Windows.Interactivity.dll,安装到项目中,并在XAML界面引入. <UserControl xmlns:i=" ...

  9. PHP 之前后端交互

    今天想实现一个很简单的功能,前端上面一个按键去控制 板子里面的一个LED灯,就这么一个简单的问题,困扰了一天. 以前搞底层的时候,没有服务端和客户端的深刻概念,网页不同,分在客户端运行的 html 代 ...

  10. DRAM 各项基本参数记录

    记录一下DRAM的各项基本参数 tCL CAS Latency CAS 潜伏期, 列地址寻找/读写命令执行完毕,准备要读出来,需要一个延时缓一缓 tRAS: RAS Active Timeing 行有 ...