mysql存储过程 动态sql 查询效率优化

DELIMITER $$
DROP PROCEDURE IF EXISTS P_C_FD_INSPECTRPT_QRY $$

CREATE
PROCEDURE P_C_FD_INSPECTRPT_QRY(
i_pageno integer -- 页号
,i_pagesize integer -- 每页记录数
,i_op_id char(32) -- 操作员标识
,i_is_inspect_task char(1) -- 是否有检验任务
,i_chktask_name varchar(200) -- 任务名称
,i_file_no varchar(200) -- 文件号
,i_perform_year char(4) -- 执行年份
,i_sample_name varchar(200) -- 样品名称
,i_inspectrpt_no varchar(50) -- 报告编号
,i_inspect_status varchar(50) -- 检验状态
,i_sign_date_start char(8) -- 签发日期起
,i_sign_date_end char(8) -- 签发日期止
,i_audit_status varchar(50) -- 审核状态
,i_beinspected_org_name varchar(100) -- 受检单位名称
,i_inspect_result varchar(50) -- 检验结论
,i_entrust_dept_name varchar(100) -- 委托单位名称
,i_dect_org_id char(32) -- 检测机构标识
,out o_count_num numeric(8,0) -- 总记录数
,out o_outcode integer -- 输出代码
,out o_outmsg varchar(500) -- 输出信息
)
COMMENT '查询新食品检验报告单'
label_pro:
BEGIN
/*======================================================================
* 交 易 名 称 : 查询新食品检验报告单
* 功 能 概 述 :
* 输 入 表 :
* 输 出 表 :
*
* 文 件 名 称 : P_C_FD_INSPECTRPT_QRY.sql
* 设 计 : 设计时间:
* 开 发 : 开发时间: 2019-01-08 11:07:33
*
* 修 改1:
* 修 改 人 员 : 修改时间:
* 修 改 标 识 :
* 修 改 描 述 :
*
* 修 改2:
* 修 改 人 员 : 修改时间:
* 修 改 标 识 :
* 修 改 描 述 :

* 测 试 代 码 : calll P_C_FD_INSPECTRPT_QRY()
======================================================================*/

-- =========================== 声明变量 ===========================
-- 固定变量
declare v_uuid varchar(64); -- 生成日志唯一标识
declare v_trade_log_switch varchar(1); -- 交易日志开关:0-关;1-开
declare v_debug_switch varchar(1); -- 调试开关:0-关;1-开
declare v_debug_id int; -- 调试id
declare v_retcode1 integer; -- 返回代码1
declare v_retmsg1 varchar(2000); -- 返回信息1

-- 分页变量
declare v_pagerow_b integer; -- 分页起始行
declare v_psize integer; -- 页面容量


-- 表变量定义:交易日志【s_pb_tradelog】(tlog)
declare v_tlog_log_id varchar(32); -- 日志标志
declare v_tlog_trade_name varchar(50); -- 交易名称
declare v_tlog_trad_paras varchar(2000); -- 参数
declare v_tlog_begintime varchar(30); -- 开始时间
declare v_tlog_endtime varchar(30); -- 结束时间
declare v_tlog_runtime numeric(20,6); -- 运行时间
declare v_tlog_is_success varchar(1); -- 是否成功
declare v_tlog_errorcode varchar(50); -- 失败代码
declare v_tlog_errormsg varchar(2000); -- 失败信息
declare v_tlog_runscript varchar(2000); -- 执行脚本

DECLARE v_sql varchar(3000);
-- =========================== 声明游标 ===========================

 

-- =========================== 声明异常 ===========================
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
set o_outcode =-1;
set o_outmsg ='处理失败。';

set v_tlog_endtime = DATE_FORMAT(NOW(),'%Y%m%d%H%i%s');
set v_tlog_runtime = timestampdiff(second,v_tlog_begintime,v_tlog_endtime);#取时间差
set v_tlog_is_success ='1';
set v_tlog_errormsg = '处理失败';
set v_tlog_errorcode = '';
set v_tlog_runscript = '';
call p_s_sys_tradelog_upd1(
v_tlog_log_id -- 日志标志
, v_tlog_trade_name -- 交易名称
, v_tlog_trad_paras -- 参数
, v_tlog_begintime -- 开始时间
, v_tlog_endtime -- 结束时间
, v_tlog_runtime -- 运行时间
, v_tlog_is_success -- 是否成功
, v_tlog_errorcode -- 失败代码
, v_tlog_errormsg -- 失败信息
, v_tlog_runscript -- 执行脚本
, v_retcode1
, v_retmsg1
);

end ;

-- =========================== 声明临时表==========================
-- 调试临时表
drop table if exists tmp_debug;
create temporary table tmp_debug (
debug_id int
, debug_time varchar(50) -- 调试时间
, debug_info varchar(2000) -- 调试信息
);


-- =========================== 输入检查 ===========================
set o_outcode=0;
set o_outmsg='查询成功';


-- 校验 页号 是否为空
if I_PAGENO is null then
set o_outcode = -1;
set o_outmsg =CONCAT(o_outmsg,'【页号】不能为空');
end if;

-- 校验 每页记录数 是否为空
if I_PAGESIZE is null then
set o_outcode = -1;
set o_outmsg =CONCAT(o_outmsg,'【每页记录数】不能为空');
end if;

-- 校验 操作员标识 是否为空
if I_OP_ID is null or I_OP_ID='' then
set o_outcode = -1;
set o_outmsg =CONCAT(o_outmsg,'【操作员标识】不能为空');
end if;

-- -- 校验 是否有检验任务 是否为空
-- if I_IS_INSPECT_TASK is null or I_IS_INSPECT_TASK='' then
-- set o_outcode = -1;
-- set o_outmsg =CONCAT(o_outmsg,'【是否有检验任务】不能为空');
-- end if;


-- 检查不通过 返回错误信息
if o_outcode <>0 then
leave label_pro;
end if ;


-- =========================== 变量初始化 ===========================
-- 临时变量
set v_trade_log_switch ='0'; -- 交易日志开关:0-关;1-set v_uuid = replace(uuid(), '-', ''); -- 生成日志id

-- 日志变量初始化
set v_tlog_log_id = v_uuid;
set v_tlog_trade_name = 'P_C_FD_INSPECTRPT_QRY';
set v_tlog_trad_paras = '';
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_pageno is null then ''else concat('i_pageno','=',i_pageno) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_pagesize is null then ''else concat('i_pagesize','=',i_pagesize) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_op_id is null then ''else concat('i_op_id','=',i_op_id) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_is_inspect_task is null then ''else concat('i_is_inspect_task','=',i_is_inspect_task) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_chktask_name is null then ''else concat('i_chktask_name','=',i_chktask_name) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_file_no is null then ''else concat('i_file_no','=',i_file_no) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_perform_year is null then ''else concat('i_perform_year','=',i_perform_year) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_sample_name is null then ''else concat('i_sample_name','=',i_sample_name) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_inspectrpt_no is null then ''else concat('i_inspectrpt_no','=',i_inspectrpt_no) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_inspect_status is null then ''else concat('i_inspect_status','=',i_inspect_status) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_sign_date_start is null then ''else concat('i_sign_date_start','=',i_sign_date_start) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_sign_date_end is null then ''else concat('i_sign_date_end','=',i_sign_date_end) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_audit_status is null then ''else concat('i_audit_status','=',i_audit_status) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_beinspected_org_name is null then ''else concat('i_beinspected_org_name','=',i_beinspected_org_name) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_inspect_result is null then ''else concat('i_inspect_result','=',i_inspect_result) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_entrust_dept_name is null then ''else concat('i_entrust_dept_name','=',i_entrust_dept_name) end,',');
set v_tlog_trad_paras = concat(v_tlog_trad_paras,case when i_dect_org_id is null then ''else concat('i_dect_org_id','=',i_dect_org_id) end,',');
set v_tlog_begintime = DATE_FORMAT(NOW(),'%Y%m%d%H%i%s');
set v_tlog_endtime = '';
set v_tlog_runtime = NULL;
set v_tlog_is_success = '0'; -- 0-成功;1-失败
set v_tlog_errorcode = '';
set v_tlog_errormsg = '';
set v_tlog_runscript = '';
set v_retcode1= 0;
set v_retmsg1 = '';


-- =========================== 数据预处理 ===========================

-- 写入日志表信息
IF (v_trade_log_switch='1') THEN
call p_s_sys_tradelog_ins1(
v_tlog_log_id #日志标志
, v_tlog_trade_name #交易名称
, v_tlog_trad_paras #参数
, v_tlog_begintime #开始时间
, v_tlog_endtime #结束时间
, v_tlog_runtime #运行时间
, v_tlog_is_success #是否成功
, v_tlog_errorcode #失败代码
, v_tlog_errormsg #失败信息
, v_tlog_runscript #执行脚本
, v_retcode1
, v_retmsg1
);
END IF;

-- 分页处理
call p_pub_paging(i_pageno,i_pagesize,v_pagerow_b,v_psize);


-- =========================== 业务处理 ===========================
-- START TRANSACTION;
/*
5@@规则说明:只显示“是否有检验任务”为是且“检测机构名称”为当前用户所在的检测机构的报告单数据 IS_ACTIVE = "1"

查询条件:(签发日期 执行年份 检验状态 审核状态 检验结论)精确查询 其他的都是模糊查询

排序说明:按照SIGN_DATE+INSPECTRPT_NO 降序排列
*/
-- todo begin

 

-- COMMIT;

-- todo end

-- 更新交易日志
IF (v_trade_log_switch='1') THEN
set v_tlog_endtime = DATE_FORMAT(NOW(),'%Y%m%d%H%i%s');
set v_tlog_runtime = timestampdiff(second,v_tlog_begintime,v_tlog_endtime);#取时间差
set v_tlog_is_success ='0'; -- 0-成功;1-失败
set v_tlog_errormsg = '';
set v_tlog_errorcode = '';
set v_tlog_runscript = '';
call p_s_sys_tradelog_upd1(
v_tlog_log_id -- 日志标志
, v_tlog_trade_name -- 交易名称
, v_tlog_trad_paras -- 参数
, v_tlog_begintime -- 开始时间
, v_tlog_endtime -- 结束时间
, v_tlog_runtime -- 运行时间
, v_tlog_is_success -- 是否成功
, v_tlog_errorcode -- 失败代码
, v_tlog_errormsg -- 失败信息
, v_tlog_runscript -- 执行脚本
, v_retcode1
, v_retmsg1
);
END IF;


-- =========================== 结果集返回 ===========================
/* select
count(1)
into
o_count_num
from C_FD_INSPECTRPT fd04
where 1=1
and fd04.is_active = '1'
and (i_is_inspect_task is null or i_is_inspect_task = '' or fd04.is_inspect_task = i_is_inspect_task ) -- 是否有检验任务
and (i_chktask_name is null or i_chktask_name = '' or fd04.chktask_name LIKE CONCAT('%',i_chktask_name,'%') ) -- 任务名称
and (i_file_no is null or i_file_no = '' or fd04.file_no = i_file_no ) -- 文件号
and (i_perform_year is null or i_perform_year = '' or fd04.perform_year = i_perform_year ) -- 执行年份
and (i_sample_name is null or i_sample_name = '' or fd04.sample_name LIKE CONCAT('%',i_sample_name,'%') ) -- 样品名称
and (i_inspectrpt_no is null or i_inspectrpt_no = '' or fd04.inspectrpt_no LIKE CONCAT('%',i_inspectrpt_no,'%') ) -- 报告编号
and (i_inspect_status is null or i_inspect_status = '' or fd04.inspect_status = i_inspect_status ) -- 检验状态
and (i_sign_date_start is null or i_sign_date_start = '' or fd04.sign_date >= i_sign_date_start ) -- 签发日期起
and (i_sign_date_end is null or i_sign_date_end = '' or fd04.sign_date <= i_sign_date_end ) -- 签发日期止
and (i_audit_status is null or i_audit_status = '' or fd04.audit_status = i_audit_status ) -- 审核状态
and (i_beinspected_org_name is null or i_beinspected_org_name = '' or fd04.beinspected_org_name LIKE CONCAT('%',i_beinspected_org_name,'%') ) -- 受检单位名称
and (i_inspect_result is null or i_inspect_result = '' or fd04.inspect_result = i_inspect_result ) -- 检验结论
and (i_entrust_dept_name is null or i_entrust_dept_name = '' or fd04.entrust_dept_name LIKE CONCAT('%',i_entrust_dept_name,'%') ) -- 委托单位名称
and (i_dect_org_id is null or i_dect_org_id = '' or fd04.DECT_ORG_ID = i_dect_org_id) -- 检测机构标识
; */


set v_sql = 'select
count(1)
into
@rowcount
from C_FD_INSPECTRPT fd04
where fd04.IS_ACTIVE = ''1''
';

-- 是否有检验任务
IF COALESCE(i_is_inspect_task, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.is_inspect_task = ''',i_is_inspect_task,'''' );
end IF ;
-- 任务名称
IF COALESCE(i_chktask_name, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.chktask_name LIKE ''%',i_chktask_name,'%''' );
end IF ;
-- 文件号
IF COALESCE(i_file_no, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.file_no LIKE ''%',i_file_no,'%''' );
end IF ;
-- 执行年份
IF COALESCE(i_perform_year, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.perform_year = ''',i_perform_year,'''' );
end IF ;
-- 样品名称
IF COALESCE(i_sample_name, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.sample_name LIKE ''%',i_sample_name,'%''' );
end IF ;
-- 报告编号
IF COALESCE(i_inspectrpt_no, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.inspectrpt_no LIKE ''%',i_inspectrpt_no,'%''' );
end IF ;
-- 检验状态
IF COALESCE(i_inspect_status, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.inspect_status = ''',i_inspect_status,'''' );
end IF ;
-- 签发日期起
IF COALESCE(i_sign_date_start, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.sign_date >= ''',i_sign_date_start,'''' );
end IF ;
-- 签发日期止
IF COALESCE(i_sign_date_end, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.sign_date <= ''',i_sign_date_end,'''' );
end IF ;
-- 审核状态
IF COALESCE(i_audit_status, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.audit_status = ''',i_audit_status,'''' );
end IF ;
-- 受检单位名称
IF COALESCE(i_beinspected_org_name, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.beinspected_org_name LIKE ''%',i_beinspected_org_name,'%''' );
end IF ;
-- 检验结论
IF COALESCE(i_inspect_result, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.inspect_result = ''',i_inspect_result,'''' );
end IF ;
-- 委托单位名称
IF COALESCE(i_entrust_dept_name, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.entrust_dept_name LIKE ''%',i_entrust_dept_name,'%''' );
end IF ;
-- 检测机构标识
IF COALESCE(i_dect_org_id, '')!='' THEN
set v_sql = CONCAT(v_sql , ' AND fd04.DECT_ORG_ID = ''',i_dect_org_id,'''' );
end IF ;


-- 获取动态SQL语句
set @sql_str = v_sql;
prepare stmt from @sql_str;
execute stmt;
deallocate prepare stmt;
-- 获取记录总数
set o_count_num = @rowcount;

-- 返回结果集rs
select
fd04.inspectrpt_id as inspectrpt_id -- 食品检验报告单标识
,fd04.chktask_id as chktask_id -- 任务标识
,fd04.chktask_name as chktask_name -- 任务名称
,fd04.perform_year as perform_year -- 执行年份
,fd04.file_no as file_no -- 文件号
,fd04.inspectrpt_no as inspectrpt_no -- 报告编号
,fd04.sign_date as sign_date -- 签发日期
,fd04.sample_name as sample_name -- 样品名称
,fd04.beinspected_org_name as beinspected_org_name -- 受检单位名称
,fd04.inspect_status as inspect_status -- 检验状态
,sps.DIC_NAME as inspect_status_name -- 检验状态名称
,fd04.inspect_result as inspect_result -- 检验结论
,sps2.DIC_NAME as inspect_result_name -- 检验结论名称
,fd04.entrust_dept_id as entrust_dept_id -- 委托单位标识
,fd04.entrust_dept_name as entrust_dept_name -- 委托单位名称
,fd04.audit_status as audit_status -- 审核状态
,sps3.DIC_NAME as audit_status_name -- 审核状态名称
,fd04.AUDIT_NAME as audit_name -- 审核人
,fd04.audit_time as audit_time -- 审核时间
,fd04.is_ext_imp as is_ext_imp -- 是否外部导入
,fd04.return_cause as return_cause -- 退回原因
from C_FD_INSPECTRPT fd04
LEFT JOIN s_pb_sysdicinfo sps ON sps.DIC_CODE = fd04.inspect_status AND sps.IS_ACTIVE = '1'
LEFT JOIN s_pb_sysdicinfo sps2 ON sps2.DIC_CODE = fd04.inspect_result AND sps.IS_ACTIVE = '1'
LEFT JOIN s_pb_sysdicinfo sps3 ON sps3.DIC_CODE = fd04.audit_status AND sps.IS_ACTIVE = '1'
INNER JOIN (
SELECT fd04.INSPECTRPT_ID
from C_FD_INSPECTRPT fd04
where fd04.is_active = '1'
and (i_is_inspect_task is null or i_is_inspect_task = '' or fd04.is_inspect_task = i_is_inspect_task ) -- 是否有检验任务
and (i_chktask_name is null or i_chktask_name = '' or fd04.chktask_name LIKE CONCAT('%',i_chktask_name,'%') ) -- 任务名称
and (i_file_no is null or i_file_no = '' or fd04.file_no LIKE CONCAT('%',i_file_no,'%') ) -- 文件号
and (i_perform_year is null or i_perform_year = '' or fd04.perform_year = i_perform_year ) -- 执行年份
and (i_sample_name is null or i_sample_name = '' or fd04.sample_name LIKE CONCAT('%',i_sample_name,'%') ) -- 样品名称
and (i_inspectrpt_no is null or i_inspectrpt_no = '' or fd04.inspectrpt_no LIKE CONCAT('%',i_inspectrpt_no,'%') ) -- 报告编号
and (i_inspect_status is null or i_inspect_status = '' or fd04.inspect_status = i_inspect_status ) -- 检验状态
and (i_sign_date_start is null or i_sign_date_start = '' or fd04.sign_date >= i_sign_date_start ) -- 签发日期起
and (i_sign_date_end is null or i_sign_date_end = '' or fd04.sign_date <= i_sign_date_end ) -- 签发日期止
and (i_audit_status is null or i_audit_status = '' or fd04.audit_status = i_audit_status ) -- 审核状态
and (i_beinspected_org_name is null or i_beinspected_org_name = '' or fd04.beinspected_org_name LIKE CONCAT('%',i_beinspected_org_name,'%') ) -- 受检单位名称
and (i_inspect_result is null or i_inspect_result = '' or fd04.inspect_result = i_inspect_result ) -- 检验结论
and (i_entrust_dept_name is null or i_entrust_dept_name = '' or fd04.entrust_dept_name LIKE CONCAT('%',i_entrust_dept_name,'%') ) -- 委托单位名称
and (i_dect_org_id is null or i_dect_org_id = '' or fd04.DECT_ORG_ID = i_dect_org_id) -- 检测机构标识
ORDER BY fd04.sign_date DESC ,fd04.inspectrpt_no DESC
limit v_pagerow_b, v_psize
)t ON t.INSPECTRPT_ID = fd04.INSPECTRPT_ID
;

END
$$

 

posted @ 2022-03-23 16:11  甜8筒  阅读(280)  评论(0编辑  收藏  举报