求助:为Spring Boot JDBC插入SQL添加指定业务条件
带业务校验条件的KICK_OUT_STATUS插入SQL实现
业务校验条件
- 待插入包裹的指定键(假设为
TRAK_ID+PCKUP_SQ_ID)不存在于FXG_VCAPI_SCHEMA.KICK_OUT_STATUS表中 - 包裹对应字段不得为'D'(此处假设为
KICKOUT_ST字段,需根据实际业务确认) - 包裹的踢出状态(
KICKOUT_STAT)必须是AK、BK、GK、CK、QK中的一个 ACT001F表中对应记录的RESOLVE_MATCH_FLAG字段值不能为'Y'且不能为空- 站点ID/类型在
Kickout_Resolve表中无已解决记录:即该站点未出现在表的原始站段字段中,或虽存在但无对应已解决站点 - 站点ID/类型不得存在于
KICKOUT_CORRECTIONS_DETAIL表中:配送站点ID和类型与原始站点ID和类型匹配,且表中的Estimated Facility Date等于待插入记录的配送日期(EFD),同时存在追踪ID(TRAK_ID)
改造后的插入SQL
INSERT INTO FXG_VCAPI_SCHEMA.KICK_OUT_STATUS (TRAK_ID, PCKUP_SQ_ID,VINTAGE,EFD,STOP_ID,STOP_ID_TP,KICKOUT_STAT,KICKOUT_ST,BEGIN_PCKUP_TM, END_PCKUP_TM, CNFRM_NBR, PCKUP_TP, CO_NM, CONT_NM, PRIM_ADR, SCNDY_ADR, CITY, STATE, PSTL_CD, HOUSE_NM, STR_NM, CNTRY_CD, HIGH_RISE_IND, GEOCODE_VNDR, GEOCODE_LAT, GEOCODE_LON, GEOCODE_SCR, VALID_GEOCODE_IND, ZIP_CONF_SCR, VALID_ADDR_IND, FAC_NM, NTWK_CD, KICKOUT_TP, CREATED_DT, UPDATED_DT) SELECT '2070881', '119052302274900001', '201306', SYSDATE, '500000001444168', 'I', 'AK', 'A', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', SYSDATE, SYSDATE FROM DUAL WHERE -- 条件1:指定键不存在于目标表 NOT EXISTS ( SELECT 1 FROM FXG_VCAPI_SCHEMA.KICK_OUT_STATUS WHERE TRAK_ID = '2070881' AND PCKUP_SQ_ID = '119052302274900001' ) -- 条件2:包裹对应字段不为'D'(假设为KICKOUT_ST,需根据实际调整) AND 'A' != 'D' -- 条件3:踢出状态在指定范围内 AND 'AK' IN ('AK', 'BK', 'GK', 'CK', 'QK') -- 条件4:ACT001F表中RESOLVE_MATCH_FLAG不为Y且不为空 AND EXISTS ( SELECT 1 FROM ACT001F WHERE TRAK_ID = '2070881' -- 假设通过TRAK_ID关联,需根据实际调整 AND RESOLVE_MATCH_FLAG != 'Y' AND RESOLVE_MATCH_FLAG IS NOT NULL ) -- 条件5:站点ID/类型在Kickout_Resolve无已解决记录 AND NOT EXISTS ( SELECT 1 FROM Kickout_Resolve WHERE ORIG_STOP_ID = '500000001444168' AND ORIG_STOP_ID_TP = 'I' -- 原始站段字段需替换为实际字段名 AND RESOLVED_STOP_ID IS NOT NULL -- 存在已解决站点则排除 ) -- 条件6:站点ID/类型不存在于KICKOUT_CORRECTIONS_DETAIL的匹配记录中 AND NOT EXISTS ( SELECT 1 FROM KICKOUT_CORRECTIONS_DETAIL WHERE ORIG_STOP_ID = '500000001444168' AND ORIG_STOP_ID_TP = 'I' AND ESTIMATED_FACILITY_DATE = SYSDATE -- 匹配配送日期 AND TRAK_ID = '2070881' -- 存在追踪ID );
注意事项
- SQL里的部分关联字段(比如
ACT001F和主数据的关联键、Kickout_Resolve的原始站段字段名)是按业务逻辑假设的,你得对照实际表结构改成真实的字段名。 - 在Spring Boot中使用时,别用硬编码参数,换成占位符(
?或命名占位符),通过JdbcTemplate或NamedParameterJdbcTemplate传参,避免SQL注入。比如用NamedParameterJdbcTemplate的话,把'2070881'换成:trakId,再用Map传递参数值即可。
内容的提问来源于stack exchange,提问作者Newb_969
相关产品推荐
相关产品推荐

