侧边栏壁纸
博主头像
王一川博主等级

努力成为一个不会前端的全栈工程师

  • 累计撰写 69 篇文章
  • 累计创建 20 个标签
  • 累计收到 38 条评论

目 录CONTENT

文章目录

IBM MQ/MB 第四幕:消息路由

王一川
2021-08-25 / 0 评论 / 0 点赞 / 1,324 阅读 / 14,436 字
温馨提示:
本文最后更新于 2021-08-25,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
  1. 本节涉及真实开发的接口协议、消息路由、数据入库等一系列 MB 操作
  2. 根据报文类型,解析指定报文格式的数据并插入指定的数据库表中

一、前期准备

1.1 配置 ODBC

MB 的数据连接使用的是 ODBC 模式,搜索 ODBC 数据源(64位),在 系统DNS 中添加驱动程序为 IBM Integration 10.0.0.3 - DataDriect Technologies 64-BIT Oracle Wire Protocol,配置如下:

Data Source Name 为之后 MB 中填写的数据源名称,Advanced 勾选和上图保持一致即可,配置完可以点击 Test Connect 测试连接是否成功。

为聚点配置ODBC

打开 IBM Integration Console 执行

# Q1 为自己的聚点名称,orcl 为数据源名称,-u数据库用户名,-p数据库密码
mqsisetdbparms Q1 -n orcl -u hcss_airport_ods -p hcss_airport_ods
mqsicvp Q1 -n orcl

至此 ODBC 配置完毕。

1.2 创建数据库表

根据数据接口协议,创建指定的数据库表(仅展示两个典型的协议,其他的都是一样),协议数据格式为

{
    "msgType":"ARRAwb",
    "data":"报文样例中的数据",
   	"createTime":"2021-8-13 20:32:22"
}

以下标题中括号内容对应消息中 msgType 的值,报文样例对应消息中 data 的值

报文1(ARRAwb)

参数名称类型描述是否必须
IdVARCHAR(36)唯一标识
AwbNoVARCHAR(12)主运单号
PrefixVARCHAR(3)运单前缀
NoVARCHAR(8)运单单号
AgentNameVARCHAR(100)代理中文名称
AgentCodeVARCHAR(30)代理人代码
AwbPcINTEGER单证件数
AwbWeightDECIMAL(,2)单证重量
PcINTEGER实际到达件数
WeightDECIMAL(,2)实际到达重量
ChargeWeightDECIMAL(,2)计费重量
DepVARCHAR(3)始发站
DestVARCHAR(3)目的站
FnoVARCHAR(8)航班号
FdateTIMESTAMP航班日期
GoodsVARCHAR(400)品名
AwbTypeVARCHAR(20)运单类型
IsDeletebool是否删除,true-删除,false-新增或修改

报文样例

[{
  "Id": "ad59e724-50ed-4382-a67e-1bc745f2de51",
  "AwbNo": "999-60070371",
  "Prefix": "999",
  "No": "60070371",
  "AgentName": "兆翔",
  "AgentCode": "ZX",
  "AwbPc": 12,
  "AwbWeight": 240,
  "Pc": 12,
  "Weight": 240,
  "ChargeWeight": 240,
  "Dep": "CAN",
  "Dest": "KHN",
  "Fno": "CA2001",
  "Fdate": "2021-08-10",
  "Goods": "普货",
  "AwbType": "国内进港",
  "IsDelete": false
}]

建表语句,下面的是 DataGrip 自动生成的 DDL,字段顺序不一致(原因未知),同时创建一个表结构一样的备份表 CGO_ARR_AWB_LOG

create table CGO_ARR_AWB
(
    INSERT_TIME  DATE default SYSDATE,
    FNO          VARCHAR2(8),
    DEP          VARCHAR2(3),
    ISDELETE     VARCHAR2(20),
    AWBTYPE      VARCHAR2(20),
    DEST         VARCHAR2(3),
    PC           NUMBER,
    AWBPC        NUMBER,
    PREFIX       VARCHAR2(3),
    GOODS        VARCHAR2(400),
    FDATE        VARCHAR2(255),
    CHARGEWEIGHT NUMBER,
    WEIGHT       NUMBER,
    AWBWEIGHT    NUMBER,
    AGENTCODE    VARCHAR2(30),
    AGENTNAME    VARCHAR2(100),
    NO           VARCHAR2(8),
    AWBNO        VARCHAR2(12),
    ID           VARCHAR2(36)
);

comment on column CGO_ARR_AWB.FNO is '航班号';

comment on column CGO_ARR_AWB.DEP is '始发站';

comment on column CGO_ARR_AWB.ISDELETE is '是否删除,true-删除,false-新增或修改';

comment on column CGO_ARR_AWB.AWBTYPE is '运单类型';

comment on column CGO_ARR_AWB.DEST is '目的站';

comment on column CGO_ARR_AWB.PC is '实际到达件数';

comment on column CGO_ARR_AWB.AWBPC is '单证件数';

comment on column CGO_ARR_AWB.PREFIX is '运单前缀';

comment on column CGO_ARR_AWB.GOODS is '品名';

comment on column CGO_ARR_AWB.FDATE is '航班日期';

comment on column CGO_ARR_AWB.CHARGEWEIGHT is '计费重量';

comment on column CGO_ARR_AWB.WEIGHT is '实际到达重量';

comment on column CGO_ARR_AWB.AWBWEIGHT is '单证重量';

comment on column CGO_ARR_AWB.AGENTCODE is '代理人代码';

comment on column CGO_ARR_AWB.AGENTNAME is '代理中文名称';

comment on column CGO_ARR_AWB.NO is '运单单号';

comment on column CGO_ARR_AWB.AWBNO is '主运单号';

comment on column CGO_ARR_AWB.ID is '唯一标识';

报文2(ARRCharge)

参数名称类型描述是否必须
IdVARCHAR(36)唯一标识
AwbNoVARCHAR(12)主运单号
ChargeJsonText费用项收费详细
ChargingStateInt2收费状态 1-正常 2-作废
CreateTimeTIMESTAMP收费时间
PrefixVARCHAR(3)运单前缀
NoVARCHAR(8)运单单号
KeepingDateInt仓储时间
AgentCodeVARCHAR(30)缴费代理人代码
ChargeWeightDECIMAL(,2)计费重量
GoodsTypeVARCHAR(30)商品种类
TotalDECIMAL总收费
ChargeTypeInt2收费类型,文档底部有说明
AwbTypeVARCHAR(20)运单类型

报文样例

[{
   "Id": "a1823055-797c-4afb-bd1a-5c2e245b284d",
   "AwbNo": "999-60131503",
   "ChargeJson": "[{\"Name\":\"Storage\",\"Fee\":10,\"Rate\":0.31,\"Min\": 10,\"FreeTime\":3,\"Unit\":1,\"Count\":280},{\"Name\":\"Handling\",\"Fee\": 96,\"Rate\":0.34,\"MinPrice\":10,\"Count\":280}]",
   "ChargingState": 1,
   "CreateTime": "2021-07-30 10:43:29",
   "Prefix": "999",
   "No": "60131503",
   "KeepingDate": 1,
   "AgentCode": "ZX",
   "ChargeWeight": 280,
   "GoodsType": "普货",
   "Total": 96,
	 "AwbType":  "国际进港",
   "ChargeType": 3
}]

建表语句,主表不存储 ChargeJson 字段,通过 Id 和 AwbNo 关联子表,子表存储 ChargeJson 数据,同时为两张表都创建备份 LOG 表

create table CGO_ARR_CHARGE
(
    ID            VARCHAR2(36),
    AWBNO         VARCHAR2(12),
    CHARGEJSON    VARCHAR2(100),
    CHARGINGSTATE VARCHAR2(100),
    CREATETIME    VARCHAR2(255),
    PREFIX        VARCHAR2(3),
    NO            VARCHAR2(8),
    KEEPINGDATE   VARCHAR2(100),
    AGENTCODE     VARCHAR2(30),
    CHARGEWEIGHT  VARCHAR2(30),
    GOODSTYPE     VARCHAR2(30),
    TOTAL         NUMBER,
    CHARGETYPE    VARCHAR2(30),
    AWBTYPE       VARCHAR2(20),
    INSERT_TIME   DATE default SYSDATE
);
comment on column CGO_ARR_CHARGE.ID is '唯一标识';

comment on column CGO_ARR_CHARGE.AWBNO is '主运单号';

comment on column CGO_ARR_CHARGE.CHARGEJSON is '费用项收费详细';

comment on column CGO_ARR_CHARGE.CHARGINGSTATE is '收费状态 1-正常 2-作废';

comment on column CGO_ARR_CHARGE.CREATETIME is '收费时间';

comment on column CGO_ARR_CHARGE.PREFIX is '运单前缀';

comment on column CGO_ARR_CHARGE.NO is '运单单号';

comment on column CGO_ARR_CHARGE.KEEPINGDATE is '仓储时间';

comment on column CGO_ARR_CHARGE.AGENTCODE is '缴费代理人代码';

comment on column CGO_ARR_CHARGE.CHARGEWEIGHT is '计费重量';

comment on column CGO_ARR_CHARGE.GOODSTYPE is '商品种类';

comment on column CGO_ARR_CHARGE.TOTAL is '总收费';

comment on column CGO_ARR_CHARGE.CHARGETYPE is '收费类型,文档底部有说明';

comment on column CGO_ARR_CHARGE.AWBTYPE is '运单类型';

create table CGO_ARR_CHARGEJSON
(
    ID          VARCHAR2(255),
    AWBNO       VARCHAR2(255),
    NAME        VARCHAR2(255),
    FEE         VARCHAR2(255),
    RATE        VARCHAR2(255),
    MIN         VARCHAR2(255),
    FREETIME    VARCHAR2(255),
    UNIT        VARCHAR2(255),
    COUNT       VARCHAR2(255),
    INSERT_TIME DATE default SYSDATE,
    CN          VARCHAR2(255),
    MINPRICE    VARCHAR2(255)
);

1.3 创建队列

MQ 中创建队列管理器 KHN,其中创建队列 KHN_IN、KHN_BK、KHN_ERR

二、解析报文

真实数据协议的数据是读取 RabbitMQ,使用本地队列的 MQ 模拟,数据协议有涉及 IsDelete、ChargingState,其处理方式为,若报文为删除(作废)则将这条报文解析进对应的 *_LOG 表中,同时根据报文的 Id 删除业务表中对应的数据;若报文为修改或新增(正常)同样先将报文解析到对应的 *_LOG 表中,同时先尝试删除对应的 Id 数据,再将其插入业务表中。

2.1 解析 ARRAwb

从上一篇使用的过滤节点有明显的缺陷,那就是只能路由两个结果,因为 Filter 只能返回 true 和 false,显然是不能满足这次的需求(虽然我只给了两个,但只是数据协议需要路由 7 个),这里使用路由标签的方式,这个方式原理是指定一个标签作为路由的标记,下游通过标签组件(Lable)接收,根据不同的标签值执行不同的逻辑,基本拓扑结果为:

其中,数据输入接 KHN 的 KHN_IN,用于模拟报文的发送,每条报文被成功解析入库后,MQ 备份一份报文原文即 数据输入 节点的 out 额外走一条到备份队列接 KHN 的 KHN_BK,中间有解析出错的报文如错误队列接 KHN 的 KHN_ERR 方便后续调整。

注:MQ Input 节点需要将 Input Message Parsing 的 Message domain 修改为 JSON

2.2 设置路由标签

这里通过 Computer 节点来设置路由的标签,即 Computer 的输出接 RouteToLabel 节点输入即可完成标签的分发;我们处理的逻辑就是写在其中的 esql,通过解析报文的 msgType 来设置标签

CREATE COMPUTE MODULE routing
	CREATE FUNCTION Main() RETURNS BOOLEAN
	BEGIN
		-- CALL CopyMessageHeaders();
		-- CALL CopyEntireMessage();
		-- 设置标签
		SET OutputLocalEnvironment.Destination.RouterList.DestinationData[1].lableName = InputRoot.JSON.Data.msgType;
		-- 将输入的数据原封不动发送给输出
		SET OutputRoot.JSON.Data = InputRoot.JSON.Data;
		
		RETURN TRUE;
	END;

	CREATE PROCEDURE CopyMessageHeaders() BEGIN
		DECLARE I INTEGER 1;
		DECLARE J INTEGER;
		SET J = CARDINALITY(InputRoot.*[]);
		WHILE I < J DO
			SET OutputRoot.*[I] = InputRoot.*[I];
			SET I = I + 1;
		END WHILE;
	END;

	CREATE PROCEDURE CopyEntireMessage() BEGIN
		SET OutputRoot = InputRoot;
	END;
END MODULE;

其中 InputRoot 为系统分配的对象,InputRoot.JSON 为 MQ Input 节点选择 JSON 时才有,Data 则存储实际数据

注:当 Computer 节点作为路由使用时,需要将 Properties 的 Basic 中的 Computer Mode 改成 LocalEnvironment and Message 模式,否则会报 找不到OutputLocalEnvironment

到这里我们就成功的根据报文的 msgType 路由数据

2.3 解析 ARRAwb

拖取 Label 节点,将其 Label Name 修改为 ARRAwb(更实际数据保持一致,区分大小写),同时连接 Computer 节点,即:通过 Label 节点接收路由过来的数据,Computer 执行解析逻辑并入库,这里的 Computer 节点需要填写数据源,同时修改 ESQL module 为 {default}:arrawb,否则你将打开的是前面的设置标签节点的 esql。

CREATE COMPUTE MODULE arrawb
	CREATE FUNCTION Main() RETURNS BOOLEAN
	BEGIN
		-- CALL CopyMessageHeaders();
		-- CALL CopyEntireMessage();
		-- 声明变量,存储解析数据
		declare I integer 1;
		declare ID character;
		declare AWBNO character;
		declare PREFIX character;
		declare NO character;
		declare AGENTNAME character;
		declare AGENTCODE character;
		declare AWBPC character;
		declare AWBWEIGHT character;
		declare PC character;
		declare WEIGHT character;
		declare CHARGEWEIGHT character;
		declare DEP character;
		declare DEST character;
		declare FNO character;
		declare FDATE character;
		declare GOODS character;
		declare AWBTYPE character;
		declare ISDELETE character; 
		
		-- 循环遍历 data
		while InputRoot.JSON.Data.data.Item[I].Id is not null
		do
		-- 解析 JSON 并赋值
			set ID = InputRoot.JSON.Data.data.Item[I].Id; -- 区分大小写,一定要和报文里的标签一模一样
			set AWBNO = InputRoot.JSON.Data.data.Item[I].AwbNo;
			set PREFIX = InputRoot.JSON.Data.data.Item[I].Prefix;
			set NO = InputRoot.JSON.Data.data.Item[I].No;
			set AGENTNAME = InputRoot.JSON.Data.data.Item[I].AgentName;
			set AGENTCODE = InputRoot.JSON.Data.data.Item[I].AgentCode;
			set AWBPC = InputRoot.JSON.Data.data.Item[I].AwbPc;
			set AWBWEIGHT = InputRoot.JSON.Data.data.Item[I].AwbWeight;
			set PC = InputRoot.JSON.Data.data.Item[I].Pc;
			set WEIGHT = InputRoot.JSON.Data.data.Item[I].Weight;
			set CHARGEWEIGHT = InputRoot.JSON.Data.data.Item[I].ChargeWeight;
			set DEP = InputRoot.JSON.Data.data.Item[I].Dep;
			set DEST = InputRoot.JSON.Data.data.Item[I].Dest;
			set FNO = InputRoot.JSON.Data.data.Item[I].Fno;
			set FDATE = InputRoot.JSON.Data.data.Item[I].Fdate;
			set GOODS = InputRoot.JSON.Data.data.Item[I].Goods;
			set AWBTYPE = InputRoot.JSON.Data.data.Item[I].AwbType;
			set ISDELETE = InputRoot.JSON.Data.data.Item[I].IsDelete;
			
			-- 插入 HCSS_KHN_ODS.CGO_ARR_AWB_LOG 备份
			insert into Database.orcl.HCSS_KHN_ODS.CGO_ARR_AWB_LOG(ID, AWBNO, PREFIX, NO, AGENTNAME, AGENTCODE, AWBPC, AWBWEIGHT, PC, WEIGHT,CHARGEWEIGHT, DEP, DEST, FNO, FDATE, GOODS, AWBTYPE, ISDELETE)
			values (ID, AWBNO, PREFIX, NO, AGENTNAME, AGENTCODE, AWBPC, AWBWEIGHT, PC, WEIGHT, CHARGEWEIGHT, DEP, DEST, FNO, FDATE,GOODS, AWBTYPE, ISDELETE);
			
			-- 首先删除   HCSS_KHN_ODS.CGO_ARR_AWB 表相同 id 的数据
			delete from Database.orcl.HCSS_KHN_ODS.CGO_ARR_AWB AS T where T.ID = ID;  
			
			-- 为什么大写?
			-- 因为报文里的数据没有加引号,因此 MB 会转义成布尔类型,而我们通过字符型解析接收会变成大写
			-- 为什么会知道这些?因为 debug
			if ISDELETE = 'FALSE' then
				-- 新增或者修改
				insert into Database.orcl.HCSS_KHN_ODS.CGO_ARR_AWB(ID, AWBNO, PREFIX, NO, AGENTNAME, AGENTCODE, AWBPC, AWBWEIGHT, PC, WEIGHT, CHARGEWEIGHT, DEP, DEST, FNO, FDATE, GOODS, AWBTYPE, ISDELETE)
				values (ID, AWBNO, PREFIX, NO, AGENTNAME, AGENTCODE, AWBPC, AWBWEIGHT, PC, WEIGHT, CHARGEWEIGHT, DEP, DEST, FNO, FDATE, GOODS, AWBTYPE, ISDELETE);
			end if;
			
			-- I 自增 1
			set I = I + 1;
		end while;
		
		RETURN TRUE;
	END;

	CREATE PROCEDURE CopyMessageHeaders() BEGIN
		DECLARE I INTEGER 1;
		DECLARE J INTEGER;
		SET J = CARDINALITY(InputRoot.*[]);
		WHILE I < J DO
			SET OutputRoot.*[I] = InputRoot.*[I];
			SET I = I + 1;
		END WHILE;
	END;

	CREATE PROCEDURE CopyEntireMessage() BEGIN
		SET OutputRoot = InputRoot;
	END;
END MODULE;

对上面 esql 的总结

问:为什么用 InputRoot.JSON.Data.data.Item[I].Id 解析数据

答:InputRoot.JSON.Data 是通过路由传过来的,后面的属性第一次可以通过 debug 来看出来,第三节会介绍 debug 的使用。

问:esql 里插入删除数据是怎么样的

答:和标准 sql 一样,只是需要在表名前指定 Database.数据源名称,原因当然是为了找到这样表啦!同时删除语句参考上面的 esql,这个是最标准的写法。

问:esql 区分大小写吗

答:理论上不区分,在解析数据时报文标签区分大小写(注意!注意!注意)

2.4 解析 ARRCharge

此报文和上面的报文唯一区别就是字段里还包含一个 JSON 对象,因此难点就是如何将 JSON 字符串转换成可以解析的 JSON 对象,直接上 esql 先看

CREATE COMPUTE MODULE arrcharge
	CREATE FUNCTION Main() RETURNS BOOLEAN
	BEGIN
		-- CALL CopyMessageHeaders();
		-- CALL CopyEntireMessage();
		-- 声明变量
		declare I integer 1;
		declare J integer 1;
		declare ID character;
		declare AWBNO character;
		declare CHARGEJSON character; -- JSON 字符串
		declare CHARGINGSTATE character;
		declare CREATETIME character;
		declare PREFIX character;
		declare NO character;
		declare KEEPINGDATE character;
		declare AGENTCODE character;
		declare CHARGEWEIGHT character;
		declare GOODSTYPE character;
		declare TOTAL integer;
		declare CHARGETYPE character;
		declare AWBTYPE character;
		-- 声明二进制
		declare JSONBIT bit;
		-- 声明 JSON 里面的字段
		declare NAME character;
		declare FEE character;
		declare RATE character;
		declare MIN character;
		declare FREETIME character;
		declare UNIT character;
		declare COUNT character;
		
		while InputRoot.JSON.Data.data.Item[I].Id is not null 
		do
			set ID = InputRoot.JSON.Data.data.Item[I].Id;
			set AWBNO = InputRoot.JSON.Data.data.Item[I].AwbNo;
			set CHARGEJSON = InputRoot.JSON.Data.data.Item[I].ChargeJson;
			set CHARGINGSTATE = InputRoot.JSON.Data.data.Item[I].ChargingState;
			set CREATETIME = InputRoot.JSON.Data.data.Item[I].CreateTime;
			set PREFIX = InputRoot.JSON.Data.data.Item[I].Prefix;
			set NO = InputRoot.JSON.Data.data.Item[I].No;
			set KEEPINGDATE = InputRoot.JSON.Data.data.Item[I].KeepingDate;
			set AGENTCODE = InputRoot.JSON.Data.data.Item[I].AgentCode;
			set CHARGEWEIGHT = InputRoot.JSON.Data.data.Item[I].ChargeWeight;
			set GOODSTYPE = InputRoot.JSON.Data.data.Item[I].GoodsType;
			set TOTAL = InputRoot.JSON.Data.data.Item[I].Total;
			set CHARGETYPE = InputRoot.JSON.Data.data.Item[I].ChargeType;
			set AWBTYPE = InputRoot.JSON.Data.data.Item[I].AwbType;
			
			-- 插入 HCSS_KHN_ODS.CGO_ARR_CHARGE_LOG 备份
			insert into Database.orcl.HCSS_KHN_ODS.CGO_ARR_CHARGE_LOG(ID, AWBNO, CHARGINGSTATE, CREATETIME, PREFIX, NO, KEEPINGDATE, AGENTCODE, CHARGEWEIGHT, GOODSTYPE, TOTAL, CHARGETYPE, AWBTYPE)
			values (ID, AWBNO, CHARGINGSTATE, CREATETIME, PREFIX, NO, KEEPINGDATE,
        			AGENTCODE, CHARGEWEIGHT, GOODSTYPE, TOTAL, CHARGETYPE, AWBTYPE);
        			
        	-- 解析 CHARGEJSON 到 HCSS_KHN_ODS.CGO_ARR_CHARGEJSON_LOG 表
        	-- 将 CHARGEJSON 转换成 二进制
        	set JSONBIT = CAST(CHARGEJSON AS BIT CCSID 1208);
        	-- 创建一个子节点接收二进制数据转换成的 JSON 数据
        	CREATE LASTCHILD OF OutputRoot.JSON.Data.dataItems DOMAIN 'JSON' PARSE(JSONBIT CCSID 1208);
			
			-- 循环插入 HCSS_KHN_ODS.CGO_ARR_CHARGEJSON_LOG
			set NAME = OutputRoot.Data.dataItems.JSON.Data.Item[J].Name;
			
			while OutputRoot.JSON.Data.dataItems.JSON.Data.Item[J].Name is not null
			do
				set NAME = OutputRoot.JSON.Data.dataItems.JSON.Data.Item[J].Name;
				set FEE = OutputRoot.JSON.Data.dataItems.JSON.Data.Item[J].Fee;
				set RATE = OutputRoot.JSON.Data.dataItems.JSON.Data.Item[J].Rate;
				set MIN = OutputRoot.JSON.Data.dataItems.JSON.Data.Item[J].Min;
				set FREETIME = OutputRoot.JSON.Data.dataItems.JSON.Data.Item[J].FreeTime;
				set UNIT = OutputRoot.JSON.Data.dataItems.JSON.Data.Item[J].Unit;
				set COUNT = OutputRoot.JSON.Data.dataItems.JSON.Data.Item[J].Count;
				
				insert into Database.orcl.HCSS_KHN_ODS.CGO_ARR_CHARGEJSON_LOG(ID,AWBNO,NAME,FEE,RATE,MIN,FREETIME,UNIT,COUNT) 
				values(ID,AWBNO,NAME,FEE,RATE,MIN,FREETIME,UNIT,COUNT);
				
				if CHARGINGSTATE = '1' then
					insert into Database.orcl.HCSS_KHN_ODS.CGO_ARR_CHARGEJSON(ID,AWBNO,NAME,FEE,RATE,MIN,FREETIME,UNIT,COUNT) 
					values(ID,AWBNO,NAME,FEE,RATE,MIN,FREETIME,UNIT,COUNT);
				elseif CHARGINGSTATE = '2' then
					delete from Database.orcl.HCSS_KHN_ODS.CGO_ARR_CHARGEJSON AS T where T.ID = ID;
				end if;
				
				set J = J + 1;
				
			end while;
			
			-- 重置 J
			set J = 1;
						
			-- 1-正常 2-作废 
			if CHARGINGSTATE = '1' then
				-- 插入
				insert into Database.orcl.HCSS_KHN_ODS.CGO_ARR_CHARGE(ID, AWBNO, CHARGINGSTATE, CREATETIME, PREFIX, NO, KEEPINGDATE, AGENTCODE, CHARGEWEIGHT, GOODSTYPE, TOTAL, CHARGETYPE, AWBTYPE)
				values (ID, AWBNO, CHARGINGSTATE, CREATETIME, PREFIX, NO, KEEPINGDATE,
        				AGENTCODE, CHARGEWEIGHT, GOODSTYPE, TOTAL, CHARGETYPE, AWBTYPE);
			elseif CHARGINGSTATE = '2' then
				-- 删除
				delete from Database.orcl.HCSS_KHN_ODS.CGO_ARR_CHARGE AS T where T.ID = ID;
			end if;
			-- I 自增
			set I = I + 1;
		end while;
		
		RETURN TRUE;
	END;

	CREATE PROCEDURE CopyMessageHeaders() BEGIN
		DECLARE I INTEGER 1;
		DECLARE J INTEGER;
		SET J = CARDINALITY(InputRoot.*[]);
		WHILE I < J DO
			SET OutputRoot.*[I] = InputRoot.*[I];
			SET I = I + 1;
		END WHILE;
	END;

	CREATE PROCEDURE CopyEntireMessage() BEGIN
		SET OutputRoot = InputRoot;
	END;
END MODULE;

对上面 esql 的总结

问:如何解析 JSON 字符串

答:首先将字符串通过 CAST(CHARGEJSON AS BIT CCSID 1208) 转换成二进制,最后创建一个子节点将二进制通过 CREATE LASTCHILD OF OutputRoot.JSON.Data.dataItems DOMAIN 'JSON' PARSE(JSONBIT CCSID 1208) 转换成 JSON 对象即可 dataItems 为自定义的节点名称,JSONBIT 为二进制变量

问:转换后的 JSON 如何解析

答:我们创建的子节点为 OutputRoot.JSON.Data.dataItems,可通过 debug 模式查看后续数据的结构为:OutputRoot.JSON.Data.dataItems.JSON.Data.Item[J].xxx

到这里就算结束啦,保存将其拖入聚点中,KHN_IN 放入测试数据即可

注:拖入的聚点一定要配置了 ODBC,不然无法入库的哟

三、DEBUG 调试

第一步:打断点,不知道怎么描述直接上图

第二步:debug 启动,不知道怎么描述,直接上图,第一次需要配置端口,随意

第三步:MQ 放入数据即可

图一

图二

图三

0

评论区