在z/OS上的VSAM的复制 – (4) 添加VSAM文件(与Kafka协同工作)/ 复制的测试
首先
在这里,我们已经讨论了将z/OS上的VSAM文件复制到Db2和Kafka的配置流程。由于我们同时进行了基础设施设置和每个VSAM文件的复制设置,操作可能有些难以理解。
在这里,我们将先完成一系列配置后,在VSAM文件增加复制时,追加相应的步骤。我们将使用Kafka作为目标。
此外,我们还将通过CICS应用程序更新VSAM文件,并确认更新信息如何作为何种消息传播到Kafka主题上。
相关文章
VSAM on z/OS的复制 – (1) 环境设置(至Db2)
VSAM on z/OS的复制 – (2) 复制配置(至Db2)
VSAM on z/OS的复制 – (3) 与Kafka协作
VSAM on z/OS的复制 – (4) 添加VSAM文件(Kafka协作)/复制测试
整个图像

源代码设置
VSAM和LOGSTREAM的准备
参考:在z/OS上定制VSAM
选择复制对象为VSAM(需要保存在SMS目标卷中)。如果存在现有对象,则检查LOGREPLICATE和LOGSTREAMID是否已指定。如果未指定,则按照前面的示例设置参数以获取日志。
本次假设我们要新建VSAM文件,并使用以下JCL来新建VSAM文件。
//DEFFILET JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*********************************************************************
/*
//DELETE EXEC PGM=IDCAMS,REGION=0M
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
/* DELETE A FILET DATASET */
DELETE DB2P.CT56B4A1.FILET
/*
//DEFINE EXEC PGM=IDCAMS,REGION=0M
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
/* DEFINE A FILET DATASET */
DEFINE CLUSTER(NAME(DB2P.CT56B4A1.FILET)-
REC(200)-
LOG(ALL) -
LOGREPLICATE -
LOGSTREAMID(CEC.RMTLRS.CECREPL) -
STORAGECLASS(SCDB2K) INDEXED) -
DATA(NAME(DB2P.CT56B4A1.FILET.DATA)-
RECSZ(200 200)-
UNIQUE -
KEYS(6 0)) -
INDEX(NAME(DB2P.CT56B4A1.FILET.INDEX)-
UNIQUE -
SHR(2 3))
//*
每条记录是200字节,键的长度是6字节。并且假设我们将使用先前创建的LOGSTREAM。如果要使用其他LOGSTREAM,请适当地创建LOGSTREAM。
VSAM的定义注册
参考:1.1 VSAM定义注册
在Linux上运行的容器中,将要复制的VSAM文件的信息在VSAM Remote Source上进行注册。
连接到容器并执行ClassicInstallAndMaintenanceMenu.sh脚本。
[root@test12 ~]# podman exec -it --workdir /classic/usr/scripts ClassicCDCVSAM2 bash
[cecuser@ff6dc51e9523 scripts]$ ./ClassicInstallAndMaintenanceMenu.sh
*---------------------------------------------------------------------*
*
* IBM Data Replication VSAM for z/OS Remote Source, V11.4
* PID: 5737-C30
*
* Menu options:
* 1. Set the job card
* 2. Set the z/OS High Level Qualifier (HLQ)
* 3. Set the z/OS Unix System Services (USS) path
* 4. Install or replace z/OS libraries with this container's maintenance level
* 5. Start a new z/OS log reader
* 6. Stop the existing z/OS log reader
* 7. Get diagnostic log for the existing z/OS log reader
* 8. Configure a z/OS VSAM cluster for the container environment
* 9. Configure VSAM IVP file
* 10. Update container scripts from the current image
* 11. Generate diagnostics tar
* 99. Exit this script
*
*---------------------------------------------------------------------*
Select an option: 8
*---------------------------------------------------------------------*
*
* Classic CDC for VSAM
* Define a VSAM cluster to Linux components for refresh/replication
*
*---------------------------------------------------------------------*
Enter a VSAM base cluster data set name:DB2P.CT56B4A1.FILET
Enter the replication log to use for this VSAM DSN: CEC.RMTLRS.CECREPL
You provided DSN: <DB2P.CT56B4A1.FILET> with replication log: <CEC.RMTLRS.CECREPL>
Is this correct? (Y or N)y
DSN: <DB2P.CT56B4A1.FILET> added to <../../shell/vsamcat/vsamcat.txt>
Do you want to generate JCL to ALTER DSN: <DB2P.CT56B4A1.FILET> for change capture? (Y or N)n
Is CICS VR installed for VSAM batch logging? (Y or N)n
Do you want to generate JCL to DEFINE LOGSTREAM for replication log: <CEC.RMTLRS.CECREPL>? (Y or N)n
Should the IDCAMS ALTER JCL be submitted to your z/OS system? (Y or N)n
...
在中国本地化中,只需要一种选项:
将要注册的VSAM文件(DB2P.CT56B4A1.FILET)和要使用的LOGSTREAM(CEC.RMTLRS.CECREPL)的信息进行注册。不生成任何种类的JCL。指定的信息将保存在vsamcat.txt文件中。
...
VSAMDD,DB2P.CT56B4A1.FILET,32760,0,20,C,K,Y,0,32764,Y,CEC.RMTLRS.CECREPL
创建VSAM表
参考: 创建1.5个VSAM表
使用经典数据架构,连接到VSAM远程源,并创建VSAM表。
COPYBOOK的导入
假设文件中保留的记录布局将使用以下COPYBOOK,因此请将其导入。导入的项目将直接使用上次创建的项目。(如果希望创建为不同的项目,请从项目中创建。)
01 RT-SEG.
02 RT-KEY PIC X(06) VALUE '000001'.
02 RT-ALPHA PIC X(10) VALUE 'ThisIsROOT'.
02 RT-ALPHAKANA PIC X(10) VALUE 'アイウエオカキクケコ'.
02 RT-MIXDBCS PIC X(32)
VALUE 'あいうえおアイウエオ全角漢文'.
02 RT-MIXALL PIC X(40)
VALUE 'ABCDEFGHあいうabcdefgh全角漢アイウエオカキク'.
02 RT-GRAPHIC PIC G(15) USAGE DISPLAY-1
VALUE G'全角漢文字あいうえおアイウエオ'.
02 RT-DECIMAL PIC 9(10) VALUE 1234567890.
02 RT-PACKED PIC S9(05) COMP-3 VALUE 12345.
02 RT-BINHALF PIC S9(04) COMP VALUE 1234.
02 RT-BINFULL PIC S9(08) COMP VALUE 12345678.
02 RT-BINDBLE PIC S9(12) COMP VALUE 123456789012.
02 RT-GROUP.
03 RT-GRP01 PIC X(10) VALUE 'ThisIs1st!'.
03 RT-GRP02 PIC X(10) VALUE 'ThisIs2nd!'.
03 RT-GRP03 PIC X(10) VALUE 'ThisIs3rd!'.
02 FILLER PIC X(15) VALUE SPACE.




创建VSAM表








生成/应用数据库定义语言 (DDL)
需要将在CDA上创建的VSAM表在VSAM Remote Source上进行同步,因为只是将其作为Windows CDA上的项目创建,所以需要生成DDL(SQL)并执行以在VSAM Remote Source上实现同步。




–创建表”TEST01″.”FILET” DBTYPE VSAM
DS “DB2P.CT56B4A1.FILET”
(
“RT_KEY” SOURCE DEFINITION
DATAMAP OFFSET 0 LENGTH 6
DATATYPE C
USE AS CHAR(6),
“RT_ALPHA” SOURCE DEFINITION
DATAMAP OFFSET 6 LENGTH 10
DATATYPE C
USE AS CHAR(10),
“RT_ALPHAKANA” SOURCE DEFINITION
DATAMAP OFFSET 16 LENGTH 10
DATATYPE C
USE AS CHAR(10),
“RT_MIXDBCS” SOURCE DEFINITION
DATAMAP OFFSET 26 LENGTH 32
DATATYPE C
USE AS CHAR(32),
“RT_MIXALL” SOURCE DEFINITION
DATAMAP OFFSET 58 LENGTH 40
DATATYPE C
USE AS CHAR(40),
“RT_GRAPHIC” SOURCE DEFINITION
DATAMAP OFFSET 98 LENGTH 15
DATATYPE C
USE AS GRAPHIC(15),
“RT_DECIMAL” SOURCE DEFINITION
DATAMAP OFFSET 128 LENGTH 10
DATATYPE UC
USE AS CHAR(10),
“RT_PACKED” SOURCE DEFINITION
DATAMAP OFFSET 138 LENGTH 3
DATATYPE P
USE AS DECIMAL(5, 0),
“RT_BINHALF” SOURCE DEFINITION
DATAMAP OFFSET 141 LENGTH 2
DATATYPE H
USE AS SMALLINT,
“RT_BINFULL” SOURCE DEFINITION
DATAMAP OFFSET 143 LENGTH 4
DATATYPE F
USE AS INTEGER,
“RT_BINDBLE” SOURCE DEFINITION
DATAMAP OFFSET 147 LENGTH 8
DATATYPE D
USE AS DECIMAL(12, 0),
“RT_GRP01” SOURCE DEFINITION
DATAMAP OFFSET 155 LENGTH 10
DATATYPE C
USE AS CHAR(10),
“RT_GRP02” SOURCE DEFINITION
DATAMAP OFFSET 165 LENGTH 10
DATATYPE C
USE AS CHAR(10),
“RT_GRP03″ SOURCE DEFINITION
DATAMAP OFFSET 175 LENGTH 10
DATATYPE C
USE AS CHAR(10));
修改表”TEST01”.”FILET”以捕获数据更改。




目标方的设置
参考资料: 构建目标环境(Kafka)
目标方案假设将使用先前创建的Kafka Broker,因此无需特别指定。
复制配置
参考:复制配置
复制设置(订阅)
请使用管理控制台连接到访问服务器并配置复制。源数据存储和目标数据存储应假设已经创建,因此需要从订阅设置中逐一添加。









Kafka属性的设置


执行复制
刷新
首先,我们将当前的VSAM数据同步到Kafka中。
在这个过程中,我们将保持CICS中的VSAM处于关闭状态。


我来查看一下Kafka上的Topic列表。
[root@test12 ~/Kafka]# /opt/confluent-6.2.0/bin/kafka-topics --list --bootstrap-server localhost:9092 | grep -i filet
cdc_kafka_test01-FILET01-commitstream
cdc_kafka_test01.filet01.sourcedb.vsam.test01.filet
使用kafka-avro-console-consumer命令来查看主题cdc_kafka_test01.filet01.sourcedb.vsam.test01.filet的消息。
[root@test12 ~/Kafka]# /opt/confluent-6.2.0/bin/kafka-avro-console-consumer --from-beginning --topic cdc_kafka_test01.filet01.sourcedb.vsam.test01.filet --bootstrap-server localhost:9092 --property print.key=true --property print.schema.ids=true
{"RT_KEY":{"string":"000001"}} 3 {"RT_KEY":{"string":"000001"},"RT_ALPHA":{"string":"ThisIsROOT"},"RT_ALPHAKANA":{"string":"アイウエオカキクケコ"},"RT_MIXDBCS":{"string":"あいうえおアイウエオ全角漢文 "},"RT_MIXALL":{"string":"ABCDEFGHあいうabcdefgh全角漢アイウエオカキク"},"RT_GRAPHIC":{"string":"全角漢文字あいうえおアイウエオ"},"RT_DECIMAL":{"string":"1234567890"},"RT_PACKED":{"int":12345},"RT_BINHALF":{"int":1234},"RT_BINFULL":{"int":12345678},"RT_BINDBLE":{"long":123456789012},"RT_GRP01":{"string":"ThisIs1st!"},"RT_GRP02":{"string":"ThisIs2nd!"},"RT_GRP03":{"string":"ThisIs3rd!"}} 4
{"RT_KEY":{"string":"000002"}} 3 {"RT_KEY":{"string":"000002"},"RT_ALPHA":{"string":"11:11:54.3"},"RT_ALPHAKANA":{"string":"アイウエオカキクケコ"},"RT_MIXDBCS":{"string":"あいうえおアイウエオ全角漢文 "},"RT_MIXALL":{"string":"ABCDEFGHあいうabcdefgh全角漢アイウエオカキク"},"RT_GRAPHIC":{"string":"全角漢文字あいうえおアイウエオ"},"RT_DECIMAL":{"string":"1234567890"},"RT_PACKED":{"int":12345},"RT_BINHALF":{"int":1234},"RT_BINFULL":{"int":12345678},"RT_BINDBLE":{"long":123456789012},"RT_GRP01":{"string":"ThisIs1st!"},"RT_GRP02":{"string":"ThisIs2nd!"},"RT_GRP03":{"string":"ThisIs3rd!"}} 4
{"RT_KEY":{"string":"000003"}} 3 {"RT_KEY":{"string":"000003"},"RT_ALPHA":{"string":"ThisIsROOT"},"RT_ALPHAKANA":{"string":"アイウエオカキクケコ"},"RT_MIXDBCS":{"string":"あいうえおアイウエオ全角漢文 "},"RT_MIXALL":{"string":"ABCDEFGHあいうabcdefgh全角漢アイウエオカキク"},"RT_GRAPHIC":{"string":"全角漢文字あいうえおアイウエオ"},"RT_DECIMAL":{"string":"1234567890"},"RT_PACKED":{"int":12345},"RT_BINHALF":{"int":1234},"RT_BINFULL":{"int":12345678},"RT_BINDBLE":{"long":123456789012},"RT_GRP01":{"string":"ThisIs1st!"},"RT_GRP02":{"string":"ThisIs2nd!"},"RT_GRP03":{"string":"ThisIs3rd!"}} 4
{"RT_KEY":{"string":"000004"}} 3 {"RT_KEY":{"string":"000004"},"RT_ALPHA":{"string":"ThisIsROOT"},"RT_ALPHAKANA":{"string":"アイウエオカキクケコ"},"RT_MIXDBCS":{"string":"あいうえおアイウエオ全角漢文 "},"RT_MIXALL":{"string":"ABCDEFGHあいうabcdefgh全角漢アイウエオカキク"},"RT_GRAPHIC":{"string":"全角漢文字あいうえおアイウエオ"},"RT_DECIMAL":{"string":"1234567890"},"RT_PACKED":{"int":12345},"RT_BINHALF":{"int":1234},"RT_BINFULL":{"int":12345678},"RT_BINDBLE":{"long":123456789012},"RT_GRP01":{"string":"ThisIs1st!"},"RT_GRP02":{"string":"ThisIs2nd!"},"RT_GRP03":{"string":"ThisIs3rd!"}} 4
“type”: “record”,
“name”: “FILET”,
“namespace”: “value.SOURCEDB.VSAM.TEST01”,
“fields”: [
{
“name”: “RT_KEY”,
“type”: [
{
“type”: “string”,
“logicalType”: “CHARACTER”,
“dbColumnName”: “RT_KEY”,
“length”: 6
},
“null”
],
“doc”: “”,
“default”: “”
},
{
“name”: “RT_ALPHA”,
“type”: [
{
“type”: “string”,
“logicalType”: “CHARACTER”,
“dbColumnName”: “RT_ALPHA”,
“length”: 10
},
“null”
],
“doc”: “”,
“default”: “”
},
{
“name”: “RT_ALPHAKANA”,
“type”: [
{
“type”: “string”,
“logicalType”: “CHARACTER”,
“dbColumnName”: “RT_ALPHAKANA”,
“length”: 10
},
“null”
],
“doc”: “”,
“default”: “”
},
{
“name”: “RT_MIXDBCS”,
“type”: [
{
“type”: “string”,
“logicalType”: “CHARACTER”,
“dbColumnName”: “RT_MIXDBCS”,
“length”: 32
},
“null”
],
“doc”: “”,
“default”: “”
},
{
“name”: “RT_MIXALL”,
“type”: [
{
“type”: “string”,
“logicalType”: “CHARACTER”,
“dbColumnName”: “RT_MIXALL”,
“length”: 40
},
“null”
],
“doc”: “”,
“default”: “”
},
{
“name”: “RT_GRAPHIC”,
“type”: [
{
“type”: “string”,
“logicalType”: “VARCHAR”,
“dbColumnName”: “RT_GRAPHIC”,
“length”: 15
},
“null”
],
“doc”: “”,
“default”: “”
},
{
“name”: “RT_DECIMAL”,
“type”: [
{
“type”: “string”,
“logicalType”: “CHARACTER”,
“dbColumnName”: “RT_DECIMAL”,
“length”: 10
},
“null”
],
“doc”: “”,
“default”: “”
},
{
“name”: “RT_PACKED”,
“type”: [
{
“type”: “int”,
“logicalType”: “DECIMAL”,
“dbColumnName”: “RT_PACKED”,
“precision”: 5,
“scale”: 0
},
“null”
],
“doc”: “”,
“default”: 0
},
{
“name”: “RT_BINHALF”,
“type”: [
{
“type”: “int”,
“logicalType”: “SMALLINT”,
“dbColumnName”: “RT_BINHALF”
},
“null”
],
“doc”: “”,
“default”: 0
},
{
“name”: “RT_BINFULL”,
“type”: [
{
“type”: “int”,
“logicalType”: “INTEGER”,
“dbColumnName”: “RT_BINFULL”
},
“null”
],
“doc”: “”,
“default”: 0
},
{
“name”: “RT_BINDBLE”,
“type”: [
{
“type”: “long”,
“logicalType”: “DECIMAL”,
“dbColumnName”: “RT_BINDBLE”,
“precision”: 12,
“scale”: 0
},
“null”
],
“doc”: “”,
“default”: 0
},
{
“name”: “RT_GRP01”,
“type”: [
{
“type”: “string”,
“logicalType”: “CHARACTER”,
“dbColumnName”: “RT_GRP01”,
“length”: 10
},
“null”
],
“doc”: “”,
“default”: “”
},
{
“name”: “RT_GRP02”,
“type”: [
{
“type”: “string”,
“logicalType”: “CHARACTER”,
“dbColumnName”: “RT_GRP02”,
“length”: 10
},
“null”
],
“doc”: “”,
“default”: “”
},
{
“name”: “RT_GRP03”,
“type”: [
{
“type”: “string”,
“logicalType”: “CHARACTER”,
“dbColumnName”: “RT_GRP03”,
“length”: 10
},
“null”
],
“doc”: “”,
“default”: “”
}
]
}
开始镜像



复制测试1
在上述设置完成后,我们将通过CICS应用程序更新VSAM文件并确认此时的情况。
主要关注包含DBCS、数字等多种类型记录的复制状态,以及插入、更新、删除操作如何传播到Kafka。
准备CICS应用程序
我会准备几个用于简单VSAM文件访问的程序。基本上是基于COMMAREA的应用程序,只需指定关键值即可单个访问VSAM文件。由于是测试用途,所以进行了相当简化。
※只有更新操作会反映在Kafka上,所以查询操作并没有太多意义,但我还是创建了它们。
新增记录
当您在调用时指定6字节的关键字(Key)值给COMMAREA,除了关键字(Key)值外,将会在VSAM(KSDS)中添加一条记录,该记录将设置为固定的字符串(嵌入在源代码中的字符串)。
示例执行:CECI LINK PROGRAM(TGFADD) COMMAREA(000005)。
标识部分。
程序标识。TGFADD。
数据部分。
工作区存储部分。
01 RESP1 PIC S9(08) COMP VALUE 0。
01 Z-EIBFN PIC X(15) VALUE ‘ ‘。
01 Z-EIBRESP PIC 9(4) VALUE ZERO。
01 Z-EIBRESP2 PIC 9(4) VALUE ZERO。
01 CURRENT-DATE。
03 CURRENT-YEAR PIC 9(2)。
03 CURRENT-MONTH PIC 9(2)。
03 CURRENT-DAY PIC 9(2)。
01 CURRENT-TIME。
03 CURRENT-HOUR PIC 9(2)。
03 CURRENT-MINUTE PIC 9(2)。
03 CURRENT-SECOND PIC 9(2)。
03 CURRENT-HNDSEC PIC 9(2)。
01 WS-RAWTIME PIC S9(15) COMP-3。
01 CURRENT-DATE-CICS PIC X(8)。
01 CURRENT-TIME-CICS PIC X(8)。
01 TSQ-NAME PIC X(8) VALUE ‘TSQTESTQ’。
01 FILE-NAME PIC X(8) VALUE ‘FILET’。
01 RT-SEG。
02 RT-KEY PIC X(06) VALUE ‘000001’。
02 RT-ALPHA PIC X(10) VALUE ‘ThisIsROOT’。
02 RT-ALPHAKANA PIC X(10) VALUE ‘アイウエオカキクケコ’。
02 RT-MIXDBCS PIC X(32)
VALUE ‘あいうえおアイウエオ全角漢文’。
02 RT-MIXALL PIC X(40)
VALUE ‘ABCDEFGHあいうabcdefgh全角漢アイウエオカキク’。
02 RT-GRAPHIC PIC G(15) USAGE DISPLAY-1
VALUE G’全角漢文字あいうえおアイウエオ’。
02 RT-DECIMAL PIC 9(10) VALUE 1234567890。
02 RT-PACKED PIC S9(05) COMP-3 VALUE 12345。
02 RT-BINHALF PIC S9(04) COMP VALUE 1234。
02 RT-BINFULL PIC S9(08) COMP VALUE 12345678。
02 RT-BINDBLE PIC S9(12) COMP VALUE 123456789012。
02 RT-GROUP。
03 RT-GRP01 PIC X(10) VALUE ‘ThisIs1st!’。
03 RT-GRP02 PIC X(10) VALUE ‘ThisIs2nd!’。
03 RT-GRP03 PIC X(10) VALUE ‘ThisIs3rd!’。
02 FILLER PIC X(15) VALUE SPACE。
01 TEMP-RECORD PIC X(200)。
*—————————————————————
联机部分。
01 DFHCOMMAREA。
03 COMMAREA-DATA PIC X(6)。
*—————————————————————
过程部分。
DISPLAY ‘TGFADD开始————-‘
* 从ACCEPT中获取时间戳
ACCEPT CURRENT-DATE FROM DATE。
ACCEPT CURRENT-TIME FROM TIME。
DISPLAY ‘接收到的日期 = ‘ CURRENT-MONTH ‘/’
CURRENT-DAY ‘/’ CURRENT-YEAR ‘ (mm/dd/yy)’。
DISPLAY ‘ 时间 = ‘ CURRENT-HOUR ‘:’
CURRENT-MINUTE ‘:’ CURRENT-SECOND ‘.’ CURRENT-HNDSEC
* 显示COMMAREA
DISPLAY ‘ 收到的COMMAREA:’ COMMAREA-DATA。
* 将COMMAREA-DATA移动到Key
IF EIBCALEN > 0 AND EIBCALEN < 7 THEN
MOVE COMMAREA-DATA TO RT-KEY
END-IF。
* 写入TS
EXEC CICS WRITEQ TS 队列(TSQ-NAME)
来源(RT-SEG)
长度(RT-SEG的长度)
RESP(Z-EIBRESP)
RESP2(Z-EIBRESP2)
END-EXEC。
IF Z-EIBRESP NOT = DFHRESP(NORMAL) THEN
DISPLAY ‘***** WRITEQ TS错误!’
DISPLAY ‘RESP:’ Z-EIBRESP
DISPLAY ‘RESP2:’ Z-EIBRESP2
EXEC CICS ABEND ABCODE(‘TTTT’) END-EXEC
EXEC CICS RETURN END-EXEC
ELSE
DISPLAY ‘写入TS成功’
END-IF。
* 写入文件(添加记录)
EXEC CICS WRITE FILE(FILE-NAME)
来源(RT-SEG)
RIDFLD(RT-KEY)
长度(RT-SEG的长度)
RESP(Z-EIBRESP)
RESP2(Z-EIBRESP2)
END-EXEC。
IF Z-EIBRESP NOT = DFHRESP(NORMAL) THEN
DISPLAY ‘***** WRITE FILE错误!’
DISPLAY ‘RESP:’ Z-EIBRESP
DISPLAY ‘RESP2:’ Z-EIBRESP2
IF Z-EIBRESP = DFHRESP(DUPREC) THEN
DISPLAY ‘重复的键!’
END-IF
EXEC CICS ABEND ABCODE(‘TTTT’) END-EXEC
EXEC CICS RETURN END-EXEC
ELSE
DISPLAY ‘写入文件成功’
END-IF。
* 显示数据
DISPLAY ‘*****’。
* DISPLAY ‘长度总计:’ RT-SEG的长度。
* DISPLAY ‘长度RT-PACKED:’ RT-PACKED的长度。
* DISPLAY ‘长度RT-BINHALF:’ RT-BINHALF的长度。
* DISPLAY ‘长度RT-BINFULL:’ RT-BINFULL的长度。
* DISPLAY ‘长度RT-BINDBLE:’ RT-BINDBLE的长度。
DISPLAY RT-SEG。
DISPLAY ‘*****’。
* 延迟
EXEC CICS DELAY FOR SECONDS(1) END-EXEC。
* 结束
DISPLAY ‘TGFADD结束—————‘。
EXEC CICS RETURN END-EXEC。
唱片更新
当使用COMMAREA指定关键值(6字节)调用时,将覆盖具有指定关键值的记录的信息。
基本上,除了关键值之外,记录中设置了固定的字符串(在源代码中嵌入的字符串)将被添加到VSAM(KSDS)。
然而,RT-ALPHA字段将设置运行时的时间戳,而RT-MIXDBCS字段将设置包含环境相关字符的字符串。
执行示例:CECI LINK PROGRAM(TGFUPDT) COMMAREA(000005)
标识 部分。
程序编号 TGFUPDT。
数据 部分。
工作存储 部分。
01 RESP1 PIC S9(08) COMP VALUE 0。
01 Z-EIBFN PIC X(15) VALUE ‘ ‘。
01 Z-EIBRESP PIC 9(4) VALUE ZERO。
01 Z-EIBRESP2 PIC 9(4) VALUE ZERO。
01 CURRENT-DATE。
03 CURRENT-YEAR PIC 9(2)。
03 CURRENT-MONTH PIC 9(2)。
03 CURRENT-DAY PIC 9(2)。
01 CURRENT-TIME。
03 CURRENT-HOUR PIC 9(2)。
03 CURRENT-MINUTE PIC 9(2)。
03 CURRENT-SECOND PIC 9(2)。
03 CURRENT-HNDSEC PIC 9(2)。
01 WS-RAWTIME PIC S9(15) COMP-3。
01 CURRENT-DATE-CICS PIC X(8)。
01 CURRENT-TIME-CICS PIC X(8)。
01 TSQ-NAME PIC X(8) VALUE ‘TSQTESTQ’。
01 FILE-NAME PIC X(8) VALUE ‘FILET’。
01 RT-SEG。
02 RT-KEY PIC X(06) VALUE ‘000001’。
02 RT-ALPHA PIC X(10) VALUE ’00:00:00.0’。
02 RT-ALPHAKANA PIC X(10) VALUE ‘アイウエオカキクケコ’。
02 RT-MIXDBCS PIC X(32)
VALUE ‘あいうえおアイウエオ㈱①Ⅰ鯵鰺’。
02 RT-MIXALL PIC X(40)
VALUE ‘ABCDEFGHあいうabcdefgh全角漢アイウエオカキク’。
02 RT-GRAPHIC PIC G(15) USAGE DISPLAY-1
VALUE G’全角漢文字あいうえおアイウエオ’。
02 RT-DECIMAL PIC 9(10) VALUE 1234567890。
02 RT-PACKED PIC S9(05) COMP-3 VALUE 12345。
02 RT-BINHALF PIC S9(04) COMP VALUE 1234。
02 RT-BINFULL PIC S9(08) COMP VALUE 12345678。
02 RT-BINDBLE PIC S9(12) COMP VALUE 123456789012。
02 RT-GROUP。
03 RT-GRP01 PIC X(10) VALUE ‘ThisIs1st!’。
03 RT-GRP02 PIC X(10) VALUE ‘ThisIs2nd!’。
03 RT-GRP03 PIC X(10) VALUE ‘ThisIs3rd!’。
02 FILLER PIC X(15) VALUE 空格。
01 TEMP-SEG。
02 TEMP-KEY PIC X(06)。
02 TEMP-ALPHA PIC X(10)。
02 TEMP-ALPHAKANA PIC X(10)。
02 TEMP-MIXDBCS PIC X(32)。
02 TEMP-MIXALL PIC X(40)。
02 TEMP-GRAPHIC PIC G(15) USAGE DISPLAY-1。
02 TEMP-DECIMAL PIC 9(10)。
02 TEMP-PACKED PIC S9(05) COMP-3。
02 TEMP-BINHALF PIC S9(04) COMP。
02 TEMP-BINFULL PIC S9(08) COMP。
02 TEMP-BINDBLE PIC S9(12) COMP。
02 TEMP-GROUP。
03 TEMP-GRP01 PIC X(10)。
03 TEMP-GRP02 PIC X(10)。
03 TEMP-GRP03 PIC X(10)。
02 FILLER PIC X(15)。
01 CURRENT-TIME-STR PIC X(10) VALUE ’00:00:00.0’。
*—————————————————————
链接 部分。
01 DFHCOMMAREA。
03 COMMAREA-DATA PIC X(6)。
*—————————————————————
过程 部分。
显示 ‘TGFUPDT 开始————-‘
* 从ACCEPT获取时间戳
从日期接收 CURRENT-DATE。
从时间接收 CURRENT-TIME。
显示 ‘接收到的日期 = ‘ CURRENT-MONTH ‘/’
CURRENT-DAY ‘/’ CURRENT-YEAR ‘ (mm/dd/yy)’。
显示 ‘ 时间 = ‘ CURRENT-HOUR ‘:’
CURRENT-MINUTE ‘:’ CURRENT-SECOND ‘.’ CURRENT-HNDSEC。
* 显示COMMAREA
显示 ‘ 接收到的COMMAREA: ‘ COMMAREA-DATA。
* 将COMMAREA-DATA移动到键
如果 EIBCALEN > 0 并且 EIBCALEN < 7 则
将 COMMAREA-DATA 移动到 RT-KEY
将 COMMAREA-DATA 移动到 TEMP-KEY
结束如果。
* 使用更新读取文件(读取记录)
执行 CICS 读取文件(FILE-NAME)
到(TEMP-SEG)
RIDFLD(TEMP-KEY)
长度(TEMP-SEG的长度)
更新
RESP(Z-EIBRESP)
RESP2(Z-EIBRESP2)
结束执行。
如果 Z-EIBRESP 不等于 DFHRESP(NORMAL) 则
显示 ‘***** 读取文件错误!’
显示 ‘RESP: ‘ Z-EIBRESP
显示 ‘RESP2: ‘ Z-EIBRESP2
如果 Z-EIBRESP 等于 DFHRESP(NOTFND) 则
显示 ‘未找到!’
结束如果
执行 CICS 异常结束 ABCODE(‘TTTT’) 结束执行
执行 CICS 返回 结束执行
否则
显示 ‘读取文件成功’
结束如果。
* 显示数据
显示 ‘之前的数据*****’。
* 显示 ‘总长度: ‘ RT-SEG的长度。
* 显示 ‘RT-PACKED长度: ‘ RT-PACKED的长度。
* 显示 ‘RT-BINHALF长度: ‘ RT-BINHALF的长度。
* 显示 ‘RT-BINFULL长度: ‘ RT-BINFULL的长度。
* 显示 ‘RT-BINDBLE长度: ‘ RT-BINDBLE的长度。
显示 TEMP-SEG。
显示 ‘*****’。
* 将当前时间设置为新记录
串接 CURRENT-HOUR, ‘:’
CURRENT-MINUTE, ‘:’,
CURRENT-SECOND, ‘.’
CURRENT-HNDSEC(1:1)
以大小为分隔符存入 CURRENT-TIME-STR。
将 CURRENT-TIME-STR 移动到 RT-ALPHA。
* 重写文件(更新记录)
执行 CICS 重写文件(FILE-NAME)
从(RT-SEG)
长度(RT-SEG的长度)
RESP(Z-EIBRESP)
RESP2(Z-EIBRESP2)
结束执行。
如果 Z-EIBRESP 不等于 DFHRESP(NORMAL) 则
显示 ‘***** 重写文件错误!’
显示 ‘RESP: ‘ Z-EIBRESP
显示 ‘RESP2: ‘ Z-EIBRESP2
执行 CICS 异常结束 ABCODE(‘TTTT’) 结束执行
执行 CICS 返回 结束执行
否则
显示 ‘重写文件成功’
结束如果。
* 显示数据
显示 ‘之后的数据*****’。
* 显示 ‘总长度: ‘ RT-SEG的长度。
* 显示 ‘RT-PACKED长度: ‘ RT-PACKED的长度。
* 显示 ‘RT-BINHALF长度: ‘ RT-BINHALF的长度。
* 显示 ‘RT-BINFULL长度: ‘ RT-BINFULL的长度。
* 显示 ‘RT-BINDBLE长度: ‘ RT-BINDBLE的长度。
显示 RT-SEG。
显示 ‘*****’。
* 延迟
执行 CICS 延迟 秒数(1) 结束执行。
* 结束
显示 ‘TGFUPDT 结束—————‘。
执行 CICS 返回 结束执行。
删除记录用
当使用指定的键值(6字节)调用COMMAREA时,将删除具有指定键值的记录。
执行示例:CECI LINK PROGRAM(TGFDEL) COMMAREA(000005)
IDENTIFICATION DIVISION.
PROGRAM-ID. TGFDEL.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 RESP1 PIC S9(08) COMP VALUE 0.01 Z-EIBFN PIC X(15) VALUE ‘ ‘.
01 Z-EIBRESP PIC 9(4) VALUE ZERO.
01 Z-EIBRESP2 PIC 9(4) VALUE ZERO.
01 CURRENT-DATE.
03 CURRENT-YEAR PIC 9(2).
03 CURRENT-MONTH PIC 9(2).
03 CURRENT-DAY PIC 9(2).
01 CURRENT-TIME.
03 CURRENT-HOUR PIC 9(2).
03 CURRENT-MINUTE PIC 9(2).
03 CURRENT-SECOND PIC 9(2).
03 CURRENT-HNDSEC PIC 9(2).
01 WS-RAWTIME PIC S9(15) COMP-3.
01 CURRENT-DATE-CICS PIC X(8).
01 CURRENT-TIME-CICS PIC X(8).
01 TSQ-NAME PIC X(8) VALUE ‘TSQTESTQ’.
01 FILE-NAME PIC X(8) VALUE ‘FILET’.
01 RT-SEG.
02 RT-KEY PIC X(06) VALUE ‘000001’.
02 RT-ALPHA PIC X(10) VALUE ‘ThisIsROOT’.
02 RT-ALPHAKANA PIC X(10) VALUE ‘アイウエオカキクケコ’.
02 RT-MIXDBCS PIC X(32)
VALUE ‘あいうえおアイウエオ全角漢文’.
02 RT-MIXALL PIC X(40)
VALUE ‘ABCDEFGHあいうabcdefgh全角漢アイウエオカキク’.
02 RT-GRAPHIC PIC G(15) USAGE DISPLAY-1
VALUE G’全角漢文字あいうえおアイウエオ’.
02 RT-DECIMAL PIC 9(10) VALUE 1234567890.
02 RT-PACKED PIC S9(05) COMP-3 VALUE 12345.
02 RT-BINHALF PIC S9(04) COMP VALUE 1234.
02 RT-BINFULL PIC S9(08) COMP VALUE 12345678.
02 RT-BINDBLE PIC S9(12) COMP VALUE 123456789012.
02 RT-GROUP.
03 RT-GRP01 PIC X(10) VALUE ‘ThisIs1st!’.
03 RT-GRP02 PIC X(10) VALUE ‘ThisIs2nd!’.
03 RT-GRP03 PIC X(10) VALUE ‘ThisIs3rd!’.
02 FILLER PIC X(15) VALUE SPACE.
*—————————————————————
LINKAGE SECTION.
01 DFHCOMMAREA.
03 COMMAREA-DATA PIC X(6).
*—————————————————————
PROCEDURE DIVISION.
DISPLAY ‘TGFDEL Start————-‘
* Get Timestamp from ACCEPT
ACCEPT CURRENT-DATE FROM DATE.
ACCEPT CURRENT-TIME FROM TIME.
DISPLAY ‘ACCEPT DATE = ‘ CURRENT-MONTH ‘/’ CURRENT-DAY ‘/’ CURRENT-YEAR ‘ (mm/dd/yy)’.
DISPLAY ‘TIME = ‘ CURRENT-HOUR ‘:’ CURRENT-MINUTE ‘:’ CURRENT-SECOND ‘.’ CURRENT-HNDSEC
* Display COMMAREA
DISPLAY ‘Received COMMAREA: ‘ COMMAREA-DATA.
* Move COMMAREA-DATA to Key
IF EIBCALEN > 0 AND EIBCALEN < 7 THEN
MOVE COMMAREA-DATA TO RT-KEY
END-IF.
* DELETE FILE
EXEC CICS DELETE FILE(FILE-NAME)
RIDFLD(RT-KEY)
RESP(Z-EIBRESP)
RESP2(Z-EIBRESP2)
END-EXEC.
IF Z-EIBRESP NOT = DFHRESP(NORMAL) THEN
DISPLAY ‘DELETE FILE ERROR!’
DISPLAY ‘RESP: ‘ Z-EIBRESP
DISPLAY ‘RESP2: ‘ Z-EIBRESP2
IF Z-EIBRESP = DFHRESP(NOTFND) THEN
DISPLAY ‘NOT FOUND!’
END-IF
EXEC CICS ABEND ABCODE(‘TTTT’) END-EXEC
EXEC CICS RETURN END-EXEC
ELSE
DISPLAY ‘DELETE FILE OK’
END-IF.
* Display Data
* DISPLAY ‘*****’.
* DISPLAY ‘LENGTH Total: ‘ LENGTH OF RT-SEG.
* DISPLAY ‘LENGTH RT-PACKED: ‘ LENGTH OF RT-PACKED.
* DISPLAY ‘LENGTH RT-BINHALF: ‘ LENGTH OF RT-BINHALF.
* DISPLAY ‘LENGTH RT-BINFULL: ‘ LENGTH OF RT-BINFULL.
* DISPLAY ‘LENGTH RT-BINDBLE: ‘ LENGTH OF RT-BINDBLE.
* DISPLAY RT-SEG.
* DISPLAY ‘*****’.
* Delay
EXEC CICS DELAY FOR SECONDS(1) END-EXEC.
* End
DISPLAY ‘TGFDEL End—————‘.
EXEC CICS RETURN END-EXEC.
仅需一种选项,请将以下内容用中文进行本地化:
用于参考的记录(1个记录)
当使用指定的键值(6个字节)调用COMMAREA时,将读取具有指定键值的记录(1个记录),并在DISPLAY语句中输出内容(通过JOBLOG的CEEMSG确认)。
执行示例:CECI LINK PROGRAM(TGFREAD)COMMAREA(000001)
IDENTIFICATION DIVISION.
PROGRAM-ID. TGFREAD.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 RESP1 PIC S9(08) COMP VALUE 0.
01 Z-EIBFN PIC X(15) VALUE ‘ ‘.
01 Z-EIBRESP PIC 9(4) VALUE ZERO.
01 Z-EIBRESP2 PIC 9(4) VALUE ZERO.
01 CURRENT-DATE.
03 CURRENT-YEAR PIC 9(2).
03 CURRENT-MONTH PIC 9(2).
03 CURRENT-DAY PIC 9(2).
01 CURRENT-TIME.
03 CURRENT-HOUR PIC 9(2).
03 CURRENT-MINUTE PIC 9(2).
03 CURRENT-SECOND PIC 9(2).
03 CURRENT-HNDSEC PIC 9(2).
01 WS-RAWTIME PIC S9(15) COMP-3.
01 CURRENT-DATE-CICS PIC X(8).
01 CURRENT-TIME-CICS PIC X(8).
01 TSQ-NAME PIC X(8) VALUE ‘TSQTESTQ’.
01 FILE-NAME PIC X(8) VALUE ‘FILET’.
01 RT-SEG.
02 RT-KEY PIC X(06) VALUE ‘000001’.
02 RT-ALPHA PIC X(10) VALUE ‘ThisIsROOT’.
02 RT-ALPHAKANA PIC X(10) VALUE ‘アイウエオカキクケコ’.
02 RT-MIXDBCS PIC X(32) VALUE ‘あいうえおアイウエオ全角漢文’.
02 RT-MIXALL PIC X(40) VALUE ‘ABCDEFGHあいうabcdefgh全角漢アイウエオカキク’.
02 RT-GRAPHIC PIC G(15) USAGE DISPLAY-1 VALUE G’全角漢文字あいうえおアイウエオ’.
02 RT-DECIMAL PIC 9(10) VALUE 1234567890.
02 RT-PACKED PIC S9(05) COMP-3 VALUE 12345.
02 RT-BINHALF PIC S9(04) COMP VALUE 1234.
02 RT-BINFULL PIC S9(08) COMP VALUE 12345678.
02 RT-BINDBLE PIC S9(12) COMP VALUE 123456789012.
02 RT-GROUP.
03 RT-GRP01 PIC X(10) VALUE ‘ThisIs1st!’.
03 RT-GRP02 PIC X(10) VALUE ‘ThisIs2nd!’.
03 RT-GRP03 PIC X(10) VALUE ‘ThisIs3rd!’.
02 FILLER PIC X(15) VALUE SPACE.
01 TEMP-SEG.
02 TEMP-KEY PIC X(06).
02 TEMP-ALPHA PIC X(10).
02 TEMP-ALPHAKANA PIC X(10).
02 TEMP-MIXDBCS PIC X(32).
02 TEMP-MIXALL PIC X(40).
02 TEMP-GRAPHIC PIC G(15) USAGE DISPLAY-1.
02 TEMP-DECIMAL PIC 9(10).
02 TEMP-PACKED PIC S9(05) COMP-3.
02 TEMP-BINHALF PIC S9(04) COMP.
02 TEMP-BINFULL PIC S9(08) COMP.
02 TEMP-BINDBLE PIC S9(12) COMP.
02 TEMP-GROUP.
03 TEMP-GRP01 PIC X(10).
03 TEMP-GRP02 PIC X(10).
03 TEMP-GRP03 PIC X(10).
02 FILLER PIC X(15).
*—————————————————————
LINKAGE SECTION.
01 DFHCOMMAREA.
03 COMMAREA-DATA PIC X(6).
*—————————————————————
PROCEDURE DIVISION.
DISPLAY ‘TGFREAD Start————-‘
* Get Timestamp from ACCEPT
ACCEPT CURRENT-DATE FROM DATE.
ACCEPT CURRENT-TIME FROM TIME.
DISPLAY ‘ACCEPT DATE = ‘ CURRENT-MONTH ‘/’ CURRENT-DAY ‘/’ CURRENT-YEAR ‘ (mm/dd/yy)’.
DISPLAY ‘TIME = ‘ CURRENT-HOUR ‘:’ CURRENT-MINUTE ‘:’ CURRENT-SECOND ‘.’ CURRENT-HNDSEC
* Display COMMAREA
DISPLAY ‘Received COMMAREA: ‘ COMMAREA-DATA.
* Move COMMAREA-DATA to Key
IF EIBCALEN > 0 AND EIBCALEN < 7 THEN
MOVE COMMAREA-DATA TO TEMP-KEY
END-IF.
* READ FILE (Read Record)
EXEC CICS READ FILE(FILE-NAME)
INTO(TEMP-SEG)
RIDFLD(TEMP-KEY)
LENGTH(LENGTH OF TEMP-SEG)
RESP(Z-EIBRESP)
RESP2(Z-EIBRESP2)
END-EXEC.
IF Z-EIBRESP NOT = DFHRESP(NORMAL) THEN
DISPLAY ‘***** READ FILE ERROR!’
DISPLAY ‘RESP: ‘ Z-EIBRESP
DISPLAY ‘RESP2: ‘ Z-EIBRESP2
IF Z-EIBRESP = DFHRESP(NOTFND) THEN
DISPLAY ‘NOT FOUND!’
END-IF
EXEC CICS ABEND ABCODE(‘TTTT’) END-EXEC
EXEC CICS RETURN END-EXEC
ELSE
DISPLAY ‘READ FILE OK’
END-IF.
* Display Data
DISPLAY ‘*****’.
DISPLAY TEMP-SEG.
DISPLAY ‘*****’.
* Delay
EXEC CICS DELAY FOR SECONDS(1) END-EXEC.
* End
DISPLAY ‘TGFREAD End—————‘.
EXEC CICS RETURN END-EXEC.
用于参考的记录(多个记录)
在指定COMMAREA的键值(6字节)并调用时,将读取指定键值以后的记录,并使用DISPLAY语句输出内容(通过JOBLOG的CEEMSG进行确认)。
例子:CECI LINK PROGRAM(TGFREAD) COMMAREA(000001)。
ID部。
プログラム名:TGFLIST。
データ部。
ワーキングストレージ部。
01 RESP1 PIC S9(08) COMP VALUE 0。
01 Z-EIBFN PIC X(15) VALUE ‘ ‘。
01 Z-EIBRESP PIC 9(4) VALUE ZERO。
01 Z-EIBRESP2 PIC 9(4) VALUE ZERO。
01 CURRENT-DATE。
03 CURRENT-YEAR PIC 9(2)。
03 CURRENT-MONTH PIC 9(2)。
03 CURRENT-DAY PIC 9(2)。
01 CURRENT-TIME。
03 CURRENT-HOUR PIC 9(2)。
03 CURRENT-MINUTE PIC 9(2)。
03 CURRENT-SECOND PIC 9(2)。
03 CURRENT-HNDSEC PIC 9(2)。
01 WS-RAWTIME PIC S9(15) COMP-3。
01 CURRENT-DATE-CICS PIC X(8)。
01 CURRENT-TIME-CICS PIC X(8)。
01 TSQ-NAME PIC X(8) VALUE ‘TSQTESTQ’。
01 FILE-NAME PIC X(8) VALUE ‘FILET’。
01 RT-SEG。
02 RT-KEY PIC X(06) VALUE ‘000001’。
02 RT-ALPHA PIC X(10) VALUE ‘ThisIsROOT’。
02 RT-ALPHAKANA PIC X(10) VALUE ‘アイウエオカキクケコ’。
02 RT-MIXDBCS PIC X(32)
VALUE ‘あいうえおアイウエオ全角漢文’。
02 RT-MIXALL PIC X(40)
VALUE ‘ABCDEFGHあいうabcdefgh全角漢アイウエオカキク’。
02 RT-GRAPHIC PIC G(15) USAGE DISPLAY-1
VALUE G’全角漢文字あいうえおアイウエオ’。
02 RT-DECIMAL PIC 9(10) VALUE 1234567890。
02 RT-PACKED PIC S9(05) COMP-3 VALUE 12345。
02 RT-BINHALF PIC S9(04) COMP VALUE 1234。
02 RT-BINFULL PIC S9(08) COMP VALUE 12345678。
02 RT-BINDBLE PIC S9(12) COMP VALUE 123456789012。
02 RT-GROUP。
03 RT-GRP01 PIC X(10) VALUE ‘ThisIs1st!’。
03 RT-GRP02 PIC X(10) VALUE ‘ThisIs2nd!’。
03 RT-GRP03 PIC X(10) VALUE ‘ThisIs3rd!’。
02 FILLER PIC X(15) VALUE SPACE。
01 TEMP-SEG。
02 TEMP-KEY PIC X(06)。
02 TEMP-ALPHA PIC X(10)。
02 TEMP-ALPHAKANA PIC X(10)。
02 TEMP-MIXDBCS PIC X(32)。
02 TEMP-MIXALL PIC X(40)。
02 TEMP-GRAPHIC PIC G(15) USAGE DISPLAY-1。
02 TEMP-DECIMAL PIC 9(10)。
02 TEMP-PACKED PIC S9(05) COMP-3。
02 TEMP-BINHALF PIC S9(04) COMP。
02 TEMP-BINFULL PIC S9(08) COMP。
02 TEMP-BINDBLE PIC S9(12) COMP。
02 TEMP-GROUP。
03 TEMP-GRP01 PIC X(10)。
03 TEMP-GRP02 PIC X(10)。
03 TEMP-GRP03 PIC X(10)。
02 FILLER PIC X(15)。
01 SRCH-KEY PIC X(10)。
01 LINE-CNT PIC S9(4) COMP VALUE +0。
*—————————————————————
リンケージ部。
01 DFHCOMMAREA。
03 COMMAREA-DATA PIC X(6)。
*—————————————————————
手順部。
DISPLAY ‘TGFLIST 開始————-‘
* タイムスタンプをACCEPTで取得
ACCEPT CURRENT-DATE FROM DATE。
ACCEPT CURRENT-TIME FROM TIME。
DISPLAY ‘ACCEPT DATE = ‘ CURRENT-MONTH ‘/’
CURRENT-DAY ‘/’ CURRENT-YEAR ‘ (mm/dd/yy)’。
DISPLAY ‘ TIME = ‘ CURRENT-HOUR ‘:’
CURRENT-MINUTE ‘:’ CURRENT-SECOND ‘.’ CURRENT-HNDSEC
* COMMAREAを表示
DISPLAY ‘ 受信したCOMMAREA:’ COMMAREA-DATA。
* COMMAREA-DATAをキーに移動
IF EIBCALEN > 0 AND EIBCALEN < 7 THEN
MOVE COMMAREA-DATA TO SRCH-KEY
END-IF。
* すべてのレコードを読み取る
SRCH-RESUME。
EXEC CICS STARTBR FILE(FILE-NAME)
RIDFLD(SRCH-KEY) GTEQ
RESP(Z-EIBRESP)
RESP2(Z-EIBRESP2)
END-EXEC。
IF Z-EIBRESP NOT = DFHRESP(NORMAL) THEN
DISPLAY ‘***** STARTBR FILEエラー!’
DISPLAY ‘RESP: ‘ Z-EIBRESP
DISPLAY ‘RESP2: ‘ Z-EIBRESP2
IF Z-EIBRESP = DFHRESP(NOTFND) THEN
DISPLAY ‘見つかりませんでした!’
END-IF
EXEC CICS ABEND ABCODE(‘TTTT’) END-EXEC
EXEC CICS RETURN END-EXEC
ELSE
DISPLAY ‘STARTBR FILE OK’
END-IF。
SRCH-LOOP。
EXEC CICS READNEXT FILE(FILE-NAME)
INTO(TEMP-SEG)
RIDFLD(SRCH-KEY)
LENGTH(LENGTH OF TEMP-SEG)
RESP(Z-EIBRESP)
RESP2(Z-EIBRESP2)
END-EXEC。
IF Z-EIBRESP = DFHRESP(ENDFILE) THEN
DISPLAY ‘*****’
GO TO SRCH-DONE
END-IF。
IF Z-EIBRESP NOT = DFHRESP(NORMAL) THEN
DISPLAY ‘***** READNEXT FILEエラー!’
DISPLAY ‘RESP: ‘ Z-EIBRESP
DISPLAY ‘RESP2: ‘ Z-EIBRESP2
IF Z-EIBRESP = DFHRESP(NOTFND) THEN
DISPLAY ‘見つかりませんでした!’
END-IF
EXEC CICS ABEND ABCODE(‘TTTT’) END-EXEC
EXEC CICS RETURN END-EXEC
ELSE
ADD 1 TO LINE-CNT
DISPLAY LINE-CNT ‘ : *****’
DISPLAY TEMP-SEG
GO TO SRCH-LOOP
END-IF。
SRCH-DONE。
EXEC CICS ENDBR FILE(FILE-NAME) END-EXEC。
* 遅延
EXEC CICS DELAY FOR SECONDS(1) END-EXEC。
* 終了
DISPLAY ‘TGFLIST 終了—————‘。
EXEC CICS RETURN END-EXEC。
参考:用于编译的JCL示例
//DFHYITVL PROC SUFFIX=1$, 翻訳モジュールのサフィックス
// INDEX=’CICSTS56.CICS’, CICSライブラリの修飾子
// PROGLIB=’CICSTS56.CICS.SDFHLOAD’, 出力ライブラリの名前
// DSCTLIB=’CICSTS56.CICS.SDFHCOB’, プライベートマクロ/データセクト
// AD370HLQ=’LANG.IGY.V6R1M0′, AD/Cycleコンパイラの修飾子
// LE370HLQ=’CEE’, LE/370ライブラリの修飾子
// OUTC=*, 印刷出力のクラス
// REG=0M, すべてのステップの領域サイズ
// TRNPARM=’COBOL3,SP,DBCS’,
// COBPARM=’NODYNAM,OBJECT,RENT,APOST,MAP,XREF,TRUNC(BIN)’,
// LNKPARM=’LIST,XREF,REUS=RENT’, リンク編集のパラメーター
// STUB=’DFHEILID’, DFHELIIのINCのリンク
// LIB=’SDFHSAMP’, ライブラリ
// WORK=SYSDA ワークデータセットのユニット
//*
//* この手順はCOBOLモジュールを生成します。
//*
//* この手順には4つのステップが含まれています
//* 1. COBOL翻訳器を実行します
//* (指定されたサフィックス1$を使用)
//* 2. COBOLコンパイラを実行します
//* 3. リンク編集ステップで使用するために&LIB(&STUB)を再ブロックする
//* 4. 出力をデータセット&PROGLIBにリンク編集します
//*
//* この手順を実行するためには、以下のJCLを使用する必要があります
//*
//* //APPLPROG EXEC DFHYITVL
//* //TRN.SYSIN DD *
//* .
//* . アプリケーションプログラム
//* .
//* /*
//* //LKED.SYSIN DD *
//* NAME プログラム名(R)
//* /*
//*
//* ここで、プログラム名はあなたのアプリケーションプログラムの名前です。
//* (共通プログラミングインターフェースへの呼び出しを含む場合など、詳細についてはシステム定義ガイドを参照してください。)
//*
//TRN EXEC PGM=DFHECP&SUFFIX,
// PARM=’&TRNPARM’, @01C
// REGION=®
//STEPLIB DD DSN=&INDEX..SDFHLOAD,DISP=SHR
//SYSPRINT DD SYSOUT=&OUTC
//SYSPUNCH DD DSN=&&SYSCIN,
// DISP=(,PASS),UNIT=&WORK,
// DCB=BLKSIZE=400,
// SPACE=(400,(400,100))
//*
//COB EXEC PGM=IGYCRCTL,REGION=®,PARM=’&COBPARM’
//STEPLIB DD DSN=&AD370HLQ..SIGYCOMP,DISP=SHR
//SYSLIB DD DSN=&DSCTLIB,DISP=SHR
// DD DSN=&INDEX..SDFHCOB,DISP=SHR
// DD DSN=&INDEX..SDFHMAC,DISP=SHR
// DD DSN=&INDEX..SDFHSAMP,DISP=SHR
//* DD DSN=CICSTS56.@DBDC.DSCTLIB,DISP=SHR
//SYSPRINT DD SYSOUT=&OUTC
//SYSIN DD DSN=&&SYSCIN,DISP=(OLD,DELETE)
//SYSLIN DD DSN=&&LOADSET,DISP=(MOD,PASS),
// UNIT=&WORK,SPACE=(80,(250,100))
//SYSMDECK DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT1 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT2 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT3 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT4 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT5 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT6 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT7 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT8 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT9 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT10 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT11 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT12 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT13 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT14 DD UNIT=&WORK,SPACE=(460,(350,100))
//SYSUT15 DD UNIT=&WORK,SPACE=(460,(350,100))
//*
//COPYLINK EXEC PGM=IEBGENER,COND=(7,LT,COB)
//SYSUT1 DD DSN=&INDEX..&LIB(&STUB),DISP=SHR
//SYSUT2 DD DSN=&©LINK,DISP=(NEW,PASS),
// DCB=(LRECL=80,BLKSIZE=400,RECFM=FB),
// UNIT=&WORK,SPACE=(400,(20,20))
//SYSPRINT DD SYSOUT=&OUTC
//SYSIN DD DUMMY
//*
//LKED EXEC PGM=IEWL,REGION=®,
// PARM=’&LNKPARM’,COND=(5,LT,COB)
//SYSLIB DD DSN=&INDEX..SDFHLOAD,DISP=SHR
// DD DSN=&LE370HLQ..SCEELKED,DISP=SHR
//SYSLMOD DD DSN=&PROGLIB,DISP=SHR
//SYSUT1 DD UNIT=&WORK,DCB=BLKSIZE=1024,
// SPACE=(1024,(200,20))
//SYSPRINT DD SYSOUT=&OUTC
//SYSLIN DD DSN=&©LINK,DISP=(OLD,DELETE)
// DD DSN=&&LOADSET,DISP=(OLD,DELETE)
// DD DDNAME=SYSIN
//*
// PEND
//*********************************************************************
//* 実行インストリームプロシージャ *
//*********************************************************************
//@COBOL EXEC DFHYITVL
//TRN.SYSIN DD DISP=SHR,DSN=CICSTS56.@DBDC.PGMSOR(@ProgName@)
//LKED.SYSLMOD DD DISP=SHR,DSN=CICSTS56.@DBDC.USERLIB.PDSE
//LKED.SYSIN DD *
MODE AMODE(31),RMODE(ANY)
NAME @ProgName@(R)
/*
CICS资源定义
文件定義
CEDA View File( FILET )
File : FILET
Group : TAGGRP
DEScription :
VSAM PARAMETERS
DSNAme : DB2P.CT56B4A1.FILET
Password : PASSWORD NOT SPECIFIED
RLsaccess : No Yes | No
LSRPOOLId : 1 1-8 | None
LSRPOOLNum : 001 1-255 | None
READInteg : Uncommitted Uncommitted | Consistent | Repeatable
DSNSharing : Allreqs Allreqs | Modifyreqs
STRings : 003 1-255
Nsrgroup :
REMOTE ATTRIBUTES
REMOTESystem :
REMOTEName :
REMOTE AND CFDATATABLE PARAMETERS
...
PROGRAM的定义
CEDA View PROGram( TGFADD )
PROGram : TGFADD
Group : TAGGRP
DEScription :
Language : CObol | Assembler | Le370 | C | Pli
RELoad : No No | Yes
RESident : No No | Yes
USAge : Normal Normal | Transient
USElpacopy : No No | Yes
Status : Enabled Enabled | Disabled
RSl : 00 0-24 | Public
CEdf : Yes Yes | No
DAtalocation : Any Below | Any
EXECKey : User User | Cics
COncurrency : Quasirent Quasirent | Threadsafe | Required
Api : Cicsapi Cicsapi | Openapi
REMOTE ATTRIBUTES
DYnamic : No No | Yes
同样地,还需添加有关TAGFUPDT、TAGFDEL、TAGFREAD和TAGFLIST的程序定义。
进行测试
刷新后,确认一下最新话题的状态。
[root@test12 ~/Kafka]# /opt/confluent-6.2.0/bin/kafka-avro-console-consumer --from-beginning --topic cdc_kafka_test01.filet01.sourcedb.vsam.test01.filet --bootstrap-server localhost:9092 --property print.key=true
{"RT_KEY":{"string":"000001"}} {"RT_KEY":{"string":"000001"},"RT_ALPHA":{"string":"ThisIsROOT"},"RT_ALPHAKANA":{"string":"アイウエオカキクケコ"},"RT_MIXDBCS":{"string":"あいうえおアイウエオ全角漢文 "},"RT_MIXALL":{"string":"ABCDEFGHあいうabcdefgh全角漢アイウエオカキク"},"RT_GRAPHIC":{"string":"全角漢文字あいうえおアイウエオ"},"RT_DECIMAL":{"string":"1234567890"},"RT_PACKED":{"int":12345},"RT_BINHALF":{"int":1234},"RT_BINFULL":{"int":12345678},"RT_BINDBLE":{"long":123456789012},"RT_GRP01":{"string":"ThisIs1st!"},"RT_GRP02":{"string":"ThisIs2nd!"},"RT_GRP03":{"string":"ThisIs3rd!"}}
{"RT_KEY":{"string":"000002"}} {"RT_KEY":{"string":"000002"},"RT_ALPHA":{"string":"11:11:54.3"},"RT_ALPHAKANA":{"string":"アイウエオカキクケコ"},"RT_MIXDBCS":{"string":"あいうえおアイウエオ全角漢文 "},"RT_MIXALL":{"string":"ABCDEFGHあいうabcdefgh全角漢アイウエオカキク"},"RT_GRAPHIC":{"string":"全角漢文字あいうえおアイウエオ"},"RT_DECIMAL":{"string":"1234567890"},"RT_PACKED":{"int":12345},"RT_BINHALF":{"int":1234},"RT_BINFULL":{"int":12345678},"RT_BINDBLE":{"long":123456789012},"RT_GRP01":{"string":"ThisIs1st!"},"RT_GRP02":{"string":"ThisIs2nd!"},"RT_GRP03":{"string":"ThisIs3rd!"}}
{"RT_KEY":{"string":"000003"}} {"RT_KEY":{"string":"000003"},"RT_ALPHA":{"string":"ThisIsROOT"},"RT_ALPHAKANA":{"string":"アイウエオカキクケコ"},"RT_MIXDBCS":{"string":"あいうえおアイウエオ全角漢文 "},"RT_MIXALL":{"string":"ABCDEFGHあいうabcdefgh全角漢アイウエオカキク"},"RT_GRAPHIC":{"string":"全角漢文字あいうえおアイウエオ"},"RT_DECIMAL":{"string":"1234567890"},"RT_PACKED":{"int":12345},"RT_BINHALF":{"int":1234},"RT_BINFULL":{"int":12345678},"RT_BINDBLE":{"long":123456789012},"RT_GRP01":{"string":"ThisIs1st!"},"RT_GRP02":{"string":"ThisIs2nd!"},"RT_GRP03":{"string":"ThisIs3rd!"}}
{"RT_KEY":{"string":"000004"}} {"RT_KEY":{"string":"000004"},"RT_ALPHA":{"string":"ThisIsROOT"},"RT_ALPHAKANA":{"string":"アイウエオカキクケコ"},"RT_MIXDBCS":{"string":"あいうえおアイウエオ全角漢文 "},"RT_MIXALL":{"string":"ABCDEFGHあいうabcdefgh全角漢アイウエオカキク"},"RT_GRAPHIC":{"string":"全角漢文字あいうえおアイウエオ"},"RT_DECIMAL":{"string":"1234567890"},"RT_PACKED":{"int":12345},"RT_BINHALF":{"int":1234},"RT_BINFULL":{"int":12345678},"RT_BINDBLE":{"long":123456789012},"RT_GRP01":{"string":"ThisIs1st!"},"RT_GRP02":{"string":"ThisIs2nd!"},"RT_GRP03":{"string":"ThisIs3rd!"}}
在VSAM上有四个记录。从这里开始进行镜像处理。
新增记录
我将运行TGFADD程序,尝试添加Key:000005的记录。
主题中添加了以下消息。
{"RT_KEY":{"string":"000005"}} {"RT_KEY":{"string":"000005"},"RT_ALPHA":{"string":"ThisIsROOT"},"RT_ALPHAKANA":{"string":"アイウエオカキクケコ"},"RT_MIXDBCS":{"string":"あいうえおアイウエオ全角漢文 "},"RT_MIXALL":{"string":"ABCDEFGHあいうabcdefgh全角漢アイウエオカキク"},"RT_GRAPHIC":{"string":"全角漢文字あいうえおアイウエオ"},"RT_DECIMAL":{"string":"1234567890"},"RT_PACKED":{"int":12345},"RT_BINHALF":{"int":1234},"RT_BINFULL":{"int":12345678},"RT_BINDBLE":{"long":123456789012},"RT_GRP01":{"string":"ThisIs1st!"},"RT_GRP02":{"string":"ThisIs2nd!"},"RT_GRP03":{"string":"ThisIs3rd!"}}
刷新记录
我将运行TGFUPDT程序,尝试更新键为000005的记录。
主题中添加了以下讯息。
{"RT_KEY":{"string":"000005"}} {"RT_KEY":{"string":"000005"},"RT_ALPHA":{"string":"16:15:20.9"},"RT_ALPHAKANA":{"string":"アイウエオカキクケコ"},"RT_MIXDBCS":{"string":"あいうえおアイウエオ㈱①Ⅰ鯵鰺"},"RT_MIXALL":{"string":"ABCDEFGHあいうabcdefgh全角漢アイウエオカキク"},"RT_GRAPHIC":{"string":"全角漢文字あいうえおアイウエオ"},"RT_DECIMAL":{"string":"1234567890"},"RT_PACKED":{"int":12345},"RT_BINHALF":{"int":1234},"RT_BINFULL":{"int":12345678},"RT_BINDBLE":{"long":123456789012},"RT_GRP01":{"string":"ThisIs1st!"},"RT_GRP02":{"string":"ThisIs2nd!"},"RT_GRP03":{"string":"ThisIs3rd!"}}
删除记录
我将运行TGFDEL程序来删除Key:000005的记录。
主题上添加了以下消息。
{"RT_KEY":{"string":"000005"}} null
补充
我正在使用Kafka Consumer检查结果,而执行kafka-avro-console-consumer的区域设置为ja_JP.UTF-8。换句话说,原始数据是EBCDIC(1399),但已确认转换为UTF-8字符编码。
即使是Graphic类型(仅限DBCS)的字段也能正确进行编码转换,而环境依赖字符(㈱、①等)似乎也能转换成功。
另外,默认情况下,COBOL COPYBOOK的类型与Kafka上的类型被映射如下。
复制测试2
我将稍微修改第一个测试的情节然后再试一试。在这里,我将尝试自定义一部分由CopyBook生成的VSAM表格。
使用的复印本
01 RT-SEG.
02 RT-KEY PIC X(06) VALUE '000001'.
02 RT-ALPHA PIC X(10) VALUE 'ThisIsROOT'.
02 RT-ALPHAKANA PIC X(10) VALUE 'アイウエオカキクケコ'.
02 RT-MIXDBCS PIC X(32)
VALUE 'あいうえおアイウエオ全角漢文'.
02 RT-MIXALL PIC X(40)
VALUE 'ABCDEFGHあいうabcdefgh全角漢アイウエオカキク'.
02 RT-GRAPHIC PIC G(15) USAGE DISPLAY-1
VALUE G'全角漢文字あいうえおアイウエオ'.
02 RT-DECIMAL PIC 9(10) VALUE 1234567890.
02 RT-PACKED PIC S9(05) COMP-3 VALUE 12345.
02 RT-BINHALF PIC S9(04) COMP VALUE 1234.
02 RT-BINFULL PIC S9(08) COMP VALUE 12345678.
02 RT-BINDBLE PIC S9(12) COMP VALUE 123456789012.
02 RT-GROUP.
03 RT-GRP01 PIC X(10) VALUE 'ThisIs1st!'.
03 RT-GRP02 PIC X(10) VALUE 'ThisIs2nd!'.
03 RT-GRP03 PIC X(10) VALUE 'ThisIs3rd!'.
02 RT-BIT8 PIC X(01) VALUE X'F0'.
02 RT-BIT16 PIC X(02) VALUE X'FFF0'.
02 RT-BIT32 PIC X(04) VALUE X'FFFFFFF0'.
02 FILLER PIC X(08) VALUE SPACE.
我添加了一个字段,用于存储最后的二进制数据。字段的类型是PIC X,但这里假设包含的是二进制数据(不进行编码转换)的数据。
(这是将指定的固定值直接写入文件的概念。)
在先前的例子中,默认情况下,PIC X将被视为字符串(string)。通常这没有问题,但是也可能存在将二进制信息存储在PIC X字段中并进行处理的情况,因此我们将尝试明确将特定字段视为二进制进行处理。
另外,在先前的例子中,PIC 9 (使用十进制区域)字段也被转换为字符串。我们也将尝试明确将其视为数字进行处理。
在这里,我们将按照与测试1相同的步骤添加复制配置,但只记录与测试1不同的地方。其他步骤都相同。
VSAM表的定制化
以 COBOL 的 CopyBook 导入 VSAM 表,然后生成 DDL,并将其应用于 VSAM Remote Source 以反映 VSAM 表。但在应用之前,需要根据需要定制生成的 DDL。
DDL的定制将参考手册中以下部分的内容:
参考:VSAM的列。
以下是根据之前提供的CopyBook在Classic Data Architect上生成的DDL。
--<ScriptOptions statementTerminator=";"/>
CREATE TABLE "TEST01"."FILET2" DBTYPE VSAM
DS "DB2P.CT56B4A1.FILET2"
(
"RT_KEY" SOURCE DEFINITION
DATAMAP OFFSET 0 LENGTH 6
DATATYPE C
USE AS CHAR(6),
"RT_ALPHA" SOURCE DEFINITION
DATAMAP OFFSET 6 LENGTH 10
DATATYPE C
USE AS CHAR(10),
"RT_ALPHAKANA" SOURCE DEFINITION
DATAMAP OFFSET 16 LENGTH 10
DATATYPE C
USE AS CHAR(10),
"RT_MIXDBCS" SOURCE DEFINITION
DATAMAP OFFSET 26 LENGTH 32
DATATYPE C
USE AS CHAR(32),
"RT_MIXALL" SOURCE DEFINITION
DATAMAP OFFSET 58 LENGTH 40
DATATYPE C
USE AS CHAR(40),
"RT_GRAPHIC" SOURCE DEFINITION
DATAMAP OFFSET 98 LENGTH 15
DATATYPE C
USE AS GRAPHIC(15),
"RT_DECIMAL" SOURCE DEFINITION
DATAMAP OFFSET 128 LENGTH 10
DATATYPE UC
USE AS CHAR(10),
"RT_PACKED" SOURCE DEFINITION
DATAMAP OFFSET 138 LENGTH 3
DATATYPE P
USE AS DECIMAL(5 , 0),
"RT_BINHALF" SOURCE DEFINITION
DATAMAP OFFSET 141 LENGTH 2
DATATYPE H
USE AS SMALLINT,
"RT_BINFULL" SOURCE DEFINITION
DATAMAP OFFSET 143 LENGTH 4
DATATYPE F
USE AS INTEGER,
"RT_BINDBLE" SOURCE DEFINITION
DATAMAP OFFSET 147 LENGTH 8
DATATYPE D
USE AS DECIMAL(12 , 0),
"RT_GRP01" SOURCE DEFINITION
DATAMAP OFFSET 155 LENGTH 10
DATATYPE C
USE AS CHAR(10),
"RT_GRP02" SOURCE DEFINITION
DATAMAP OFFSET 165 LENGTH 10
DATATYPE C
USE AS CHAR(10),
"RT_GRP03" SOURCE DEFINITION
DATAMAP OFFSET 175 LENGTH 10
DATATYPE C
USE AS CHAR(10),
"RT_BIT8" SOURCE DEFINITION
DATAMAP OFFSET 185 LENGTH 1
DATATYPE C
USE AS CHAR(1),
"RT_BIT16" SOURCE DEFINITION
DATAMAP OFFSET 186 LENGTH 2
DATATYPE C
USE AS CHAR(2),
"RT_BIT32" SOURCE DEFINITION
DATAMAP OFFSET 188 LENGTH 4
DATATYPE C
USE AS CHAR(4));
ALTER TABLE "TEST01"."FILET2" DATA CAPTURE CHANGES;
将此更改如下(仅摘录更改部分)。
...
"RT_DECIMAL" SOURCE DEFINITION
DATAMAP OFFSET 128 LENGTH 10
DATATYPE UC
USE AS DECIMAL(10 , 0),
...
"RT_BIT8" SOURCE DEFINITION
DATAMAP OFFSET 185 LENGTH 1
DATATYPE B
USE AS BINARY(1),
"RT_BIT16" SOURCE DEFINITION
DATAMAP OFFSET 186 LENGTH 2
DATATYPE B
USE AS BINARY(2),
"RT_BIT32" SOURCE DEFINITION
DATAMAP OFFSET 188 LENGTH 4
DATATYPE B
USE AS BINARY(4));
...
应用上述DDL后,出现了以下警告,其与修改的区域无关。看起来可以先忽略,暂时不处理。
SQLState=S1000 列 RT_BINDBLE について LENGTH 8 は、DECIMAL の USE AS SQL データ・タイプに基づいて無視されます。 .

进行测试
让我们使用Avro Consumer将数据注入到VSAM中,并检查Kafka的Topic。
{"RT_KEY":{"string":"000001"}} {"RT_KEY":{"string":"000001"},"RT_ALPHA":{"string":"ThisIsROOT"},"RT_ALPHAKANA":{"string":"アイウエオカキクケコ"},"RT_MIXDBCS":{"string":"あいうえおアイウエオ全角漢文 "},"RT_MIXALL":{"string":"ABCDEFGHあいうabcdefgh全角漢アイウエオカキク"},"RT_GRAPHIC":{"string":"全角漢文字あいうえおアイウエオ"},"RT_DECIMAL":{"long":1234567890},"RT_PACKED":{"int":12345},"RT_BINHALF":{"int":1234},"RT_BINFULL":{"int":12345678},"RT_BINDBLE":{"long":123456789012},"RT_GRP01":{"string":"ThisIs1st!"},"RT_GRP02":{"string":"ThisIs2nd!"},"RT_GRP03":{"string":"ThisIs3rd!"},"RT_BIT8":{"bytes":"d"},"RT_BIT16":{"bytes":"yd"},"RT_BIT32":{"bytes":"yyyd"}}
RT_DECIMAL被正确地转换为数值型(long)。
而RT_BIT8、RT_BIT16和RT_BIT32被错误地显示为字符串。
我来确认一下架构。
{
"type": "record",
"name": "FILET2",
"namespace": "value.SOURCEDB.VSAM.TEST01",
"fields": [
...
{
"name": "RT_DECIMAL",
"type": [
{
"type": "long",
"logicalType": "DECIMAL",
"dbColumnName": "RT_DECIMAL",
"precision": 10,
"scale": 0
},
"null"
],
"doc": "",
"default": 0
},
...
{
"name": "RT_BIT8",
"type": [
{
"type": "bytes",
"logicalType": "BINARY",
"dbColumnName": "RT_BIT8",
"length": 1
},
"null"
],
"doc": "",
"default": ""
},
{
"name": "RT_BIT16",
"type": [
{
"type": "bytes",
"logicalType": "BINARY",
"dbColumnName": "RT_BIT16",
"length": 2
},
"null"
],
"doc": "",
"default": ""
},
{
"name": "RT_BIT32",
"type": [
{
"type": "bytes",
"logicalType": "BINARY",
"dbColumnName": "RT_BIT32",
"length": 4
},
"null"
],
"doc": "",
"default": ""
}
]
}
在模式上,RT_BITxx字段的”type”被设置为”bytes”,因此可能是由AvroComsumer的规范将其显示为字符串形式。
我們將使用kafka-console-consumer工具,只抽取首個訊息並輸出Hex碼。
[root@test12 ~/Kafka]# /opt/confluent-6.2.0/bin/kafka-console-consumer --from-beginning --topic cdc_kafka_test01.filet02.sourcedb.vsam.test01.filet2 --max-messages 1 --bootstrap-server localhost:9092 | xxd > temp.txt
Processed a total of 1 messages
[root@test12 ~/Kafka]# cat temp.txt
00000000: 0000 0000 0200 0c30 3030 3030 3100 1454 .......000001..T
00000010: 6869 7349 7352 4f4f 5400 3cef bdb1 efbd hisIsROOT.<.....
00000020: b2ef bdb3 efbd b4ef bdb5 efbd b6ef bdb7 ................
00000030: efbd b8ef bdb9 efbd ba00 58e3 8182 e381 ..........X.....
00000040: 84e3 8186 e381 88e3 818a e382 a2e3 82a4 ................
00000050: e382 a6e3 82a8 e382 aae5 85a8 e8a7 92e6 ................
00000060: bca2 e696 8720 2000 7441 4243 4445 4647 ..... .tABCDEFG
00000070: 48e3 8182 e381 84e3 8186 6162 6364 6566 H.........abcdef
00000080: 6768 e585 a8e8 a792 e6bc a2ef bdb1 efbd gh..............
00000090: b2ef bdb3 efbd b4ef bdb5 efbd b6ef bdb7 ................
000000a0: efbd b800 5ae5 85a8 e8a7 92e6 bca2 e696 ....Z...........
000000b0: 87e5 ad97 e381 82e3 8184 e381 86e3 8188 ................
000000c0: e381 8ae3 82a2 e382 a4e3 82a6 e382 a8e3 ................
000000d0: 82aa 00a4 8bb0 9909 00f2 c001 00a4 1300 ................
000000e0: 9c85 e30b 00a8 e8c8 e997 0700 1454 6869 .............Thi
000000f0: 7349 7331 7374 2100 1454 6869 7349 7332 sIs1st!..ThisIs2
00000100: 6e64 2100 1454 6869 7349 7333 7264 2100 nd!..ThisIs3rd!.
00000110: 02f0 0004 fff0 0008 ffff fff0 0a .............
我找到了末尾有f0 fff0 fffffff0的数据,在发送时它被确认为非二进制数据而不是代码转换。
总结
-
- Kafkaをターゲットとして連携する場合、更新情報が1メッセージとしてTopic上に送付されます。
-
- Kafka Topic上のメッセージはKey + Valueで構成されますが、Key部分には更新レコードのキーとなるフィールド、Value部分には更新レコード全体が含まれます。
-
- メッセージ単体からはInsert, Updateの区別はつきません。Updateの場合、更新後のレコード情報がValueに含まれるだけなのでどのフィールドに変更が入ったかの判別もできません。
-
- Deleteの場合、DeleteされたレコードのKey情報のみが転送され、Value部分はnullとなっています。
-
- MixedField, DBCSのみのフィールド、数値フィールドなど上のテストで挙げた型は意図した通りに変換できているようです(Mixed FieldとDBCS Fieldそれぞれに対してCCSIDを指定するパラメータがあるので注意!)。
-
- バイナリや一部の数値フィールドはCopyBookから生成されるDDLを手動でカスタマイズしてVSAM表を作成する必要があるので注意が必要です。
- 更新情報は、更新された各レコード単位で独立したメッセージとしてKafkaに送られます。ソース側で複数レコードの更新を1UOWで更新した場合などでも、Kafka側では別々のイベントとして捉えられてしまいます。そのため、Kafkaから先のターゲットへの反映タイミングによっては整合性の取れていない状態となり得ます(Partitionを1つにしても、同一表の異なるレコードを1UOWで更新した場合は反映タイミングによっては不整合状態が生じうる)。トランザクション性を保証する必要がある場合は、”Kafka transactionally consistent consumer”の機能を使用して、1UOWとして扱われるメッセージの塊をKafka Consumer側でハンドリングする必要があります。
参考:
Kafka事务性一致性消费者
利用Kafka提供端到端ACID事务的解决方案