标签:var 开头 mod 参数 current 表数据 varchar2 存在 put
表结构:
1、deal_countdeal_ip默认为0,取消非空限制
2、表中新增delive_code字段;
代码
3、conf中新增trmsCarTaskSwitch开关
#4、conf中新增kafka开关
5、新增mapp.xml配置;
select * from a;
-- 分中心数据下发接收表
drop table tt_trms_car_task;
CREATE TABLE tt_trms_car_task(
id NUMBER(18) PRIMARY KEY ,
original_id NUMBER(18) not null, -- 版本号id
send_car_tm DATE ,
require_id VARCHAR(50),
task_id VARCHAR(100) , -- 任务id
position_no VARCHAR(10) ,
line_code VARCHAR(200) ,
batch_code VARCHAR(50) , -- 卡口编码
plan_start_tm DATE ,
zone_code VARCHAR(50) , -- 中转场代码(网点)
plate_num VARCHAR(50) ,
del_flag VARCHAR(1) ,
send_tm DATE,
deal_tm DATE , -- 处理时间
deal_flg number(2) default 0, -- 处理标记
deal_ip varchar2(30) ,
deal_count number(2) ,
insert_tm timestamp(6) default SYSDATE, --入库时间
delive_code VARCHAR2(50) -- 分中心代码
);
-- 序列
CREATE SEQUENCE SEQ_TT_TRMS_CAR_TASK
START WITH 1
INCREMENT BY 1
NOMAXVALUE
MINVALUE 1
NOCYCLE
NOCACHE
-- 中间表
drop table tt_trms_car_task_mid;
CREATE TABLE tt_trms_car_task_mid(
id NUMBER(18) PRIMARY KEY ,
original_id NUMBER(18) not null, -- 版本号id
send_car_tm DATE ,
require_id VARCHAR(50),
task_id VARCHAR(100) , -- 任务id
position_no VARCHAR(10) ,
line_code VARCHAR(200) ,
batch_code VARCHAR(50) , -- 卡口编码
plan_start_tm DATE ,
zone_code VARCHAR(50) , -- 中转场代码(网点)
plate_num VARCHAR(50) ,
del_flag VARCHAR(1) ,
send_tm DATE,
deal_tm DATE , -- 处理时间
deal_flg number(2) default 0, -- 处理标记
deal_ip varchar2(30) ,
deal_count number(2) ,
insert_tm timestamp(6) default SYSDATE, --入库时间
delive_code VARCHAR2(50) -- 分中心代码
);
CREATE SEQUENCE SEQ_TT_TRMS_CAR_TASK_MID
START WITH 1
INCREMENT BY 1
NOMAXVALUE
MINVALUE 1
NOCYCLE
NOCACHE
-- 下发表
drop table tt_trms_car_task_dist;
CREATE TABLE tt_trms_car_task_dist(
id NUMBER(18) PRIMARY KEY ,
original_id NUMBER(18) not null, -- 版本号id
send_car_tm DATE ,
require_id VARCHAR(50),
task_id VARCHAR(100) , -- 任务id
position_no VARCHAR(10) ,
line_code VARCHAR(200) ,
batch_code VARCHAR(50) , -- 卡口编码
plan_start_tm DATE ,
zone_code VARCHAR(50) , -- 中转场代码(网点)
plate_num VARCHAR(50) ,
del_flag VARCHAR(1) ,
send_tm DATE,
deal_tm DATE , -- 处理时间
deal_flg number(2) default 0, -- 处理标记
deal_ip varchar2(30) ,
deal_count number(2) ,
insert_tm timestamp(6) default SYSDATE, --入库时间
delive_code VARCHAR2(50) -- 分中心代码
);
CREATE SEQUENCE SEQ_TT_TRMS_CAR_TASK_DIST
START WITH 1
INCREMENT BY 1
NOMAXVALUE
MINVALUE 1
NOCYCLE
NOCACHE
INSERT INTO tt_trms_car_task_mid SELECT * FROM tt_trms_car_task;
SELECT M.* ,ROWID AS rid FROM tt_trms_car_task_mid M WHERE ROWNUM=1
SELECT t.*,ROWID FROM tt_trms_car_task t
逻辑:
根据“任务ID+网点+卡口编码”为主键判断,如果该记录不存在,则新增该记录;
根据“任务ID+网点+卡口编码”为主键判断,如果该记录存在,则判断“版本号ID”是否比现有的版本号
ID大,如果大则根据“任务ID+网点+卡口编码”覆盖,否则该数据抛弃。
CREATE OR REPLACE PROCEDURE PROC_TT_AS_OUT_IDENT_MID
(
P_HASH_NUM IN NUMBER, --hash并发数量
P_HASH_VALUE IN NUMBER, --hash并发值
P_BATCH_NUM IN NUMBER DEFAULT 5000, --处理数据量
P_COMMIT_NUM IN NUMBER DEFAULT 500 --批次提交数据量
) AS
V_COUNT INT DEFAULT 0; --定义参数以"V_"开头定义
V_BATCH INT DEFAULT 0; --是否需要跟新:0->新增,1->跟新BA,生产出港,99->抛弃
V_BA_RID VARCHAR2(500);
V_S_ID NUMBER;
V_BATCH_OUT INT DEFAULT -1; --99->抛弃,0—>新增
V_AS_OUT_ID NUMBER;
V_SQL_NUM NUMBER;
/*
CREATE DATE:2016-10-20
CREATE BY:674051
DESC :TT_AS_OUT_IDENT_MID中间表数据关联tm_zno_transit表数据生产出港数据
业务逻辑:首先同TT_AS_OUT_IDENT_BA表进行比较,
i :MID中数据比ba表中数据级别高,生产新下发数据
II:MID和BA中级别一致,但是mid中数据较新且weight+des_zno+product不一致,生产新下发数据
III:其他状态数据:抛弃
REMARK:记录修改日志(修改人 修改版本号 修改时间,修改内容)
*/
BEGIN
FOR RX IN (
SELECT
T.*,ROWID as rid
FROM
TT_AS_OUT_IDENT_MID T
WHERE
T.DEAL_FLG = 0
AND DBMS_UTILITY.GET_HASH_VALUE(T.WAYBILL_NO,0,P_HASH_NUM)=P_HASH_VALUE
AND ROWNUM <= P_BATCH_NUM
) LOOP
V_BATCH:=0 ; --默认新增ba数据
V_BATCH_OUT :=0; --默认新生成出港数据
--从BA表中抓取基准数据
FOR R0 IN (
SELECT
T.ROWID AS RID ,T.*
FROM
TT_AS_OUT_IDENT_BA T
WHERE
T.WAYBILL_NO = RX.WAYBILL_NO
) LOOP
V_BA_RID:=R0.RID;
IF(RX.SRC=R0.SRC AND RX.INPUT_TM> R0.INPUT_TM
AND (RX.DES_ZNO||RX.PRODUCT_TYPE<>R0.DES_ZNO||R0.PRODUCT_TYPE
OR RX.WEIGHT<>R0.WEIGHT)
) THEN
--BA与MID均且清单数据,且mid数据有变更且比ba中数据要新,更新BA数据,需生成出港数据
V_BATCH:=1;
V_BATCH_OUT:=0;
ELSIF(RX.SRC<>R0.SRC AND RX.SRC=‘D-‘
AND (RX.DES_ZNO||RX.PRODUCT_TYPE<>R0.DES_ZNO||R0.PRODUCT_TYPE
OR RX.WEIGHT<>R0.WEIGHT)
) THEN
--BA为hht,MID为清单,且MID与BA表数据不一致,更新BA数据,需生成出港数据
V_BATCH:=1;
V_BATCH_OUT:=0;
ELSIF(RX.SRC<>R0.SRC AND RX.SRC=‘D-‘
AND (RX.DES_ZNO||RX.PRODUCT_TYPE=R0.DES_ZNO||R0.PRODUCT_TYPE
OR RX.WEIGHT=R0.WEIGHT)
) THEN
--BA为hht,MID为清单,但是MID与BA表数据不一致,更新BA数据,不生成出港数据
V_BATCH:=1;
V_BATCH_OUT:=99;
ELSE
V_BATCH:=99;
V_BATCH_OUT:=99;
END IF;
END LOOP;
--生产BA数据数据
IF(V_BATCH=0) THEN
INSERT INTO TT_AS_OUT_IDENT_BA(
ID ,
S_ID ,
WAYBILL_NO ,
SRC_ZNO ,
DES_ZNO ,
INSERT_TM ,
OTHER_NODE_FLG ,
SRC ,
INPUT_TM ,
PRODUCT_TYPE ,
WEIGHT ,
SRC_CITY ,
DES_CITY ,
BATCH_TM
)VALUES(
SEQ_TT_AS_OUT_IDENT_BA.NEXTVAL,
RX.ID ,
RX.WAYBILL_NO ,
RX.SRC_ZNO ,
RX.DES_ZNO ,
CURRENT_TIMESTAMP ,
RX.OTHER_NODE_FLG ,
RX.SRC ,
RX.INPUT_TM ,
RX.PRODUCT_TYPE ,
RX.WEIGHT ,
RX.SRC_CITY ,
RX.DES_CITY ,
CURRENT_TIMESTAMP
);
ELSIF(V_BATCH=1)THEN
UPDATE
TT_AS_OUT_IDENT_BA T
SET
T.S_ID = RX.ID
,T.WAYBILL_NO = RX.WAYBILL_NO
,T.SRC_ZNO = RX.SRC_ZNO
,T.DES_ZNO = RX.DES_ZNO
,T.BATCH_TM = CURRENT_TIMESTAMP
,T.OTHER_NODE_FLG = RX.OTHER_NODE_FLG
,T.SRC = RX.SRC
,T.INPUT_TM = RX.INPUT_TM
,T.PRODUCT_TYPE = RX.PRODUCT_TYPE
,T.WEIGHT = RX.WEIGHT
,T.SRC_CITY = RX.SRC_CITY
,T.DES_CITY = RX.DES_CITY
WHERE
T.ROWID = V_BA_RID;
END IF;
V_AS_OUT_ID:=seq_tt_as_out_ident.nextval;
--生产出港数据
IF(V_BATCH_OUT=0) THEN
V_AS_OUT_ID:=seq_tt_as_out_ident.nextval;
insert into tt_as_out_ident(
id,
waybill_no,
src_zno,
des_zno,
insert_tm,
deal_flg,
transit_zno,
other_node_flg,
src,
scan_tm,
PRODUCT_TYPE,
weight,
SRC_CITY,
DES_CITY,
THREAD_ID
)select
seq_tt_as_out_ident.nextval,
rx.waybill_no,
rx.src_zno,
rx.des_zno,
current_timestamp,
0,
t.transit_code,
rx.other_node_flg,
rx.src,
rx.input_tm ,
rx.PRODUCT_TYPE,
rx.weight,
rx.SRC_CITY,
rx.DES_CITY,
V_AS_OUT_ID
from
tm_zno_transit t
WHERE
instr(‘,‘||t.out_znos||‘,‘,‘,‘||rx.SRC_CITY||‘,‘)>0
and instr(‘,‘||t.in_znos||‘,‘,‘,‘||rx.DES_CITY||‘,‘)=0;
V_SQL_NUM :=sql%rowcount ;
END IF;
--UPDATE 状态
UPDATE
TT_AS_OUT_IDENT_MID T
SET
T.DEAL_FLG = 2
,T.REMARK= DECODE(
V_BATCH_OUT,
0,
DECODE(V_SQL_NUM,0,‘NO TRANSIT CONFIG OUTS_ZNOS‘,‘INSERT INTO TT_AS_OUT_IDENT SUCCESCCD ,ID=‘||V_AS_OUT_ID),
‘discard‘)
,T.DEAL_TM = CURRENT_TIMESTAMP
WHERE
T.ROWID = RX.RID;
--批次提交控制
V_COUNT:=V_COUNT+1 ;
IF(MOD(V_COUNT,P_COMMIT_NUM)=0)THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
PKG_SYS_LOG.ERROR_LOG(NULL,
‘PROC_TT_AS_OUT_IDENT_MID‘,
SYSDATE,
SQLCODE,
SQLERRM,
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE,NULL
);
END PROC_TT_AS_OUT_IDENT_MID;
-- 建序列
SEQ_TT_TRMS_CAR_TASK
标签:var 开头 mod 参数 current 表数据 varchar2 存在 put
原文地址:http://www.cnblogs.com/fubinhnust/p/7045604.html