67
大大大大大大大大大大大 大大大大 大大大大大大大大大大大 大大大大 2011 2011 大大大大大 大大大大大 -IBM -IBM 大大大大 大大大大 大大大大大大大大 大大大 大大大大大大大大 大大大 [email protected] [email protected]

大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

  • Upload
    libby

  • View
    156

  • Download
    0

Embed Size (px)

DESCRIPTION

大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程. 同济大学软件学院 唐剑锋 [email protected]. 第 6 章 COBOL+CICS+VSAM 和 COBOL+CICS+DB2 程序开发. 6.1 COBOL+CICS 程序编写规范. 本章总结了一些 COBOL 内嵌 CICS 语言,也是我们编写 Online 程序的一些规范。 1. 程序开头说明: *************************************************** - PowerPoint PPT Presentation

Citation preview

Page 1: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

大型主机应用上的开放系统和中间件大型主机应用上的开放系统和中间件 20112011 年度教育部年度教育部 -IBM-IBM 精品课程精品课程

同济大学软件学院 唐剑锋同济大学软件学院 唐剑锋 [email protected]@gmail.com

Page 2: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

第第 66 章 章 COBOL+CICS+VSAMCOBOL+CICS+VSAM 和和 COBOL+CICS+DB2COBOL+CICS+DB2 程程序开发序开发

Page 3: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

6.1 COBOL+CICS6.1 COBOL+CICS 程序编写规范程序编写规范

本章总结了一些本章总结了一些 COBOLCOBOL 内嵌内嵌 CICSCICS 语言,也是我们编写语言,也是我们编写 OnlineOnline 程序程序的一些规范。的一些规范。

1. 1. 程序开头说明: 程序开头说明: ******************************************************************************************************* TONGJI MAINFRAME TESTING ** TONGJI MAINFRAME TESTING ** EMPLOYEE EXERCISE ** EMPLOYEE EXERCISE ** USAGE : BROWSE RECORDS IN EMPLOYEE FILE ** USAGE : BROWSE RECORDS IN EMPLOYEE FILE ** FILE USAGE : EMPLOYEE ** FILE USAGE : EMPLOYEE ** BMS USAGE : EMPMBR ** BMS USAGE : EMPMBR *******************************************************************************************************

首先我们必须在程序的起始部分注明一些必要的信息,要有程序所属首先我们必须在程序的起始部分注明一些必要的信息,要有程序所属的项目名、程序的解释、程序的用途、程序的使用说明(如果有的的项目名、程序的解释、程序的用途、程序的使用说明(如果有的话)、程序所需要的文件(一般是话)、程序所需要的文件(一般是 VSAMVSAM 文件)或数据库、程序所使文件)或数据库、程序所使用的用的 BMS MapBMS Map 名。名。

Page 4: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

2. 2. 前两个前两个 DIVISIONSDIVISIONSIDENTIFICATION DIVISION.IDENTIFICATION DIVISION. PROGRAM-ID. EMPOBR.PROGRAM-ID. EMPOBR.ENVIRONMENT DIVISION.ENVIRONMENT DIVISION.IDENTIFICATION DIVISIONIDENTIFICATION DIVISION 中至少要申明中至少要申明 PROGRAM-IDPROGRAM-ID ,它必须与,它必须与我们这个程序的文件名是一致的。我们这个程序的文件名是一致的。 ENVIRONMENT DIVISIONENVIRONMENT DIVISION 一般来一般来说我们是不用指定的,因为所有的环境都是由说我们是不用指定的,因为所有的环境都是由 CICSCICS 帮我们设定好的,帮我们设定好的,不需要我们来定义。不需要我们来定义。

3. DATA DIVISION3. DATA DIVISION 部分部分DATA DIVISIONDATA DIVISION 中主要包含三个部分:中主要包含三个部分:(( 11 )) WORKING-STORAGE SECTIONWORKING-STORAGE SECTION

在在 WORKING-STORAGE SECTIONWORKING-STORAGE SECTION 中设定所有要使用的变量。我们约中设定所有要使用的变量。我们约定在所有的变量名之前都加上“定在所有的变量名之前都加上“ WS-”(WSWS-”(WS 是是 WORKING-STORAGEWORKING-STORAGE的首字母的首字母 )) 。在第一层我们建议写“。在第一层我们建议写“ 01 WS-VARIABLE”01 WS-VARIABLE” ,以后各层,以后各层以以 0505 开始,每层加开始,每层加 55 。这样我们可以留出一定的层数以备不时之需,。这样我们可以留出一定的层数以备不时之需,同时也使层次显得更为清晰。同时也使层次显得更为清晰。

Page 5: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

WSWS 中的前面部分,建议使用如下写法:中的前面部分,建议使用如下写法:05 WS-INFO.05 WS-INFO. 10 WS-TSQ-NAME.10 WS-TSQ-NAME. 15 WS-APPLID PIC X(2) VALUE 'TJ'.15 WS-APPLID PIC X(2) VALUE 'TJ'. 15 WS-TRANID PIC X(4) VALUE 'FX01'.15 WS-TRANID PIC X(4) VALUE 'FX01'. 15 WS-PROGSUF PIC X(3) VALUE '001'.15 WS-PROGSUF PIC X(3) VALUE '001'. 15 WS-SEQ PIC X(3) VALUE '001'.15 WS-SEQ PIC X(3) VALUE '001'. 15 WS-TERMID PIC X(4) VALUE SPACES. 15 WS-TERMID PIC X(4) VALUE SPACES. 10 DSTX-ID PIC X(4) VALUE 'FX01'.10 DSTX-ID PIC X(4) VALUE 'FX01'. 88 DSTX-ID-VALID VALUE 'FX01'.88 DSTX-ID-VALID VALUE 'FX01'. 10 WS-TSQ-CONTENT.10 WS-TSQ-CONTENT. 15 WS-TSQ-LEVEL PIC 9(4).15 WS-TSQ-LEVEL PIC 9(4). 15 WS-TSQ-TRANID PIC X(4) VALUE SPACES.15 WS-TSQ-TRANID PIC X(4) VALUE SPACES. 10 WS-TSQ-CURR-ITEM PIC S9(4) COMP.10 WS-TSQ-CURR-ITEM PIC S9(4) COMP. 10 WS-LEVEL PIC 9(4) VALUE 0.10 WS-LEVEL PIC 9(4) VALUE 0.

Page 6: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

TSQ-NAMETSQ-NAME 分为项目名(分为项目名( APPLIDAPPLID )、交易名()、交易名( TRANIDTRANID )、程序后)、程序后缀(缀( PROGSUFPROGSUF )、序列号()、序列号( SEQSEQ )、终端号()、终端号( TERMIDTERMID )。这样可)。这样可以确保程序所使用的以确保程序所使用的 TSQTSQ 是唯一的,不会与其他人冲突。是唯一的,不会与其他人冲突。

DSTX-IDDSTX-ID 标示了该程序的标示了该程序的 TRANSIDTRANSID ,用于比较,用于比较 TSQTSQ 中的中的 TRANSIDTRANSID ,,抽出来便于修改。抽出来便于修改。

WS-TSQ-CONTENTWS-TSQ-CONTENT 表示了表示了 TSQTSQ 中所要保存的内容,在里面至少应包中所要保存的内容,在里面至少应包括两个部分:括两个部分: WS-TSQ-LEVELWS-TSQ-LEVEL 和和 WS-TSQ-TRANIDWS-TSQ-TRANID 。前者表示我们希。前者表示我们希望下次任务所处的层数或上次任务希望这次所在的层数。然后,希望望下次任务所处的层数或上次任务希望这次所在的层数。然后,希望在在 TSQTSQ 中存什么信息就加在该层后面,比如想要保存的中存什么信息就加在该层后面,比如想要保存的 MapMap 中域的中域的值。值。

WS-TSQ-CURR-ITEMWS-TSQ-CURR-ITEM 在在 TSQTSQ 中要用到,一般都会设定其为中要用到,一般都会设定其为 11 。。 WS-LEVELWS-LEVEL 指定现在这个任务所处的层。指定现在这个任务所处的层。

Page 7: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

(( 22 )) COPY COPY 部分部分 COPY EMPMBR.COPY EMPMBR. COPY EMPLOYEECOPY EMPLOYEE REPLACING ==EMPLOYEE:== BYREPLACING ==EMPLOYEE:== BY ==EMPLOYEE-==.==EMPLOYEE-==.

可以使用可以使用 COPYCOPY 命令将需要的其他文件中的命令将需要的其他文件中的 COPYBOOKCOPYBOOK 给拷给拷贝过来。一般来说,如果是贝过来。一般来说,如果是 BMS MapBMS Map 的的 COPYBOOKCOPYBOOK ,则直,则直接拷贝进来即可。如果是接拷贝进来即可。如果是 VSAMVSAM 文件的定义,拷贝进来之后,文件的定义,拷贝进来之后,一般都要用一般都要用 REPLACINGREPLACING 来将原本“:”改为“来将原本“:”改为“ -”-” 。这是一。这是一种规范,在我们写种规范,在我们写 VSAMVSAM 文件的定义时,一般要在变量名之前文件的定义时,一般要在变量名之前加上文件名和“:”,这样便于将文件前缀与变量名区别开来。加上文件名和“:”,这样便于将文件前缀与变量名区别开来。

Page 8: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

(( 33 )) LINKAGE SECTIONLINKAGE SECTION01 DFHCOMMAREA PIC X(200).01 DFHCOMMAREA PIC X(200).

如果这个程序是要被调用的,那么在如果这个程序是要被调用的,那么在 LINKAGE SECTIONLINKAGE SECTION 中是必须指中是必须指定的。这与定的。这与 LINKLINK 或或 XCTLXCTL 中中 COMMAREACOMMAREA 的参数相关。如果这个程序的参数相关。如果这个程序不需要被调用,则不需指定。不需要被调用,则不需指定。

Page 9: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

4. PROCEDURE DIVISION4. PROCEDURE DIVISION 部分部分 首先要先明确一些层的作用和规范。首先要先明确一些层的作用和规范。 我们约定我们约定 000-MAIN000-MAIN 作为程序的开始段,作为程序的开始段, Z000-RETURNZ000-RETURN 作为程序的作为程序的

结束段。除了结束段。除了 000-MAIN 000-MAIN 和 和 Z000-RETURNZ000-RETURN 之外,其他的代码段都要之外,其他的代码段都要有一个对应的有一个对应的 EXITEXIT 。。例如:例如: A100-GETLV.A100-GETLV.

…… …… A100-EXIT. EXIT.A100-EXIT. EXIT.

特别提示:程序是看特别提示:程序是看 XXXX-EXITXXXX-EXIT 来结束这个代码段的。来结束这个代码段的。 A100-GETLVA100-GETLV是一个标签(所有从是一个标签(所有从 AA 区开始的,我们叫做标签区开始的,我们叫做标签 LABELLABEL ),程序会从),程序会从一个标签执行到另一个标签。虽然我们可以不写一个标签执行到另一个标签。虽然我们可以不写 A100-EXITA100-EXIT而仅靠下而仅靠下一个标签结束,但是为了程序的规范性,建议以一个标签结束,但是为了程序的规范性,建议以 A100-EXITA100-EXIT 来与来与 A10A100-GETLV0-GETLV对应,同时加上对应,同时加上 EXITEXIT 作为作为 A100-EXITA100-EXIT 的的 DUMMYDUMMY 语句,这语句,这样可以把样可以把 A100-EXITA100-EXIT 这个标签与下一个标签区分开来(如果不写这个标签与下一个标签区分开来(如果不写 EXITEXIT ,,程序会报错)。程序会报错)。

Page 10: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

000-MAIN. 000-MAIN. 所有程序的开始。所有程序的开始。 第一句必须是第一句必须是 EXEC CICS HANDLE ABEND LABEL(Z000-RETURN) ENEXEC CICS HANDLE ABEND LABEL(Z000-RETURN) EN

D-EXEC.D-EXEC. 这将接受后面所有产生的无其他异常处理的错误。此后应尽量避免使这将接受后面所有产生的无其他异常处理的错误。此后应尽量避免使

用 用 HANDLE HANDLE 语句进行出错处理,而是根据可能出现的错误情况分别语句进行出错处理,而是根据可能出现的错误情况分别处理,例如使用处理,例如使用 DFHRESPDFHRESP判断判断 CICSCICS 语句执行的错误。语句执行的错误。

然后进行程序变量的初始化:然后进行程序变量的初始化: PERFORM 010-PROG-INIT THRU 010-PERFORM 010-PROG-INIT THRU 010-EXIT.EXIT.

得到该次的层数:得到该次的层数: PERFORM A100-GETLV THRU A100-EXIT.PERFORM A100-GETLV THRU A100-EXIT. 得到得到 LEVELLEVEL 之后我们就可以通过不同层次来处理具体的操作:之后我们就可以通过不同层次来处理具体的操作:

IF WS-LEVEL = 0IF WS-LEVEL = 0 …… ……

ELSE IF WS-LEVEL = 1ELSE IF WS-LEVEL = 1 …… ……

ELSE PERFORM Z000-RETURNELSE PERFORM Z000-RETURNEND-IF.END-IF.

Page 11: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

010-PROG-INIT. 010-PROG-INIT. MOVE EIBTRMID TO WS-TERMID.MOVE EIBTRMID TO WS-TERMID.

初始化初始化 TSQ-NAMETSQ-NAME ,补充完整,补充完整 TSQ-NAMETSQ-NAME ,正是这句能保证每个,正是这句能保证每个 TSTSQQ 的唯一性。的唯一性。 PERFORM B101-INIT-MAP THRU B101-EXIT.PERFORM B101-INIT-MAP THRU B101-EXIT.

初始化初始化 MapMap ,能够保证,能够保证 MapMap 的初始值是正确的。的初始值是正确的。 PERFORM B102-INIT-ATTR THRU B102-EXIT.PERFORM B102-INIT-ATTR THRU B102-EXIT.

初始化初始化 MapMap 域的属性,能够保证域的属性,能够保证 MapMap 的域的属性是正确的。的域的属性是正确的。

AA 层用于最基本的层用于最基本的 TSQTSQ 的处理代码段。的处理代码段。A100-GETLV. A100-GETLV.

从从 READQREADQ 开始开始 , , 从从 TSQTSQ 中得到中得到 WS-TSQ-LEVELWS-TSQ-LEVEL 的信息,然后通过的信息,然后通过 MMOVEOVE 语句送给语句送给 WS-LEVELWS-LEVEL ,从而得到当前层的信息,从而得到当前层的信息 . .

Page 12: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

A200-SETLV. A200-SETLV. 设置设置 LEVELLEVEL 。在伪对话程序中,为了在程序两次执行中保留必要的状。在伪对话程序中,为了在程序两次执行中保留必要的状态等数据信息,需要将态等数据信息,需要将 WS-TSQ-CONTENTWS-TSQ-CONTENT 中的内容,包括中的内容,包括 WS-TSQ-WS-TSQ-LEVELLEVEL 和和 WS-TSQ-TRANIDWS-TSQ-TRANID 写入写入 TSQTSQ ,使用,使用 WRITEQWRITEQ 或者加或者加 REWRITREWRITEE选项(这将根据所处的层数或一些特殊的条件来决定)。第一次必选项(这将根据所处的层数或一些特殊的条件来决定)。第一次必须是须是 WRITEQWRITEQ ,以后都将加,以后都将加 REWRITEREWRITE 属性。属性。A300-CLEARQ. A300-CLEARQ.

清除清除 TSQTSQ 。一般都是在程序都结束之前使用,使用。一般都是在程序都结束之前使用,使用 DELETEQDELETEQ 。同时。同时建议在建议在 DELETEQDELETEQ 之前先将之前先将 MapMap 的所有域清空一下,用的所有域清空一下,用 PERFORM B1PERFORM B101-INIT-MAP THRU B101-EXIT01-INIT-MAP THRU B101-EXIT 将该内存空间初始化。将该内存空间初始化。

Page 13: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

BB 层用于层用于 MAPMAP 的处理代码段。的处理代码段。B100-SEND-MAP.B100-SEND-MAP.

用于用于 SEND MAPSEND MAP 的代码段。由于的代码段。由于 SEND MAPSEND MAP 就表示这次任务结束了,所以,建就表示这次任务结束了,所以,建议在议在 SEND MAPSEND MAP 之前使用之前使用 SETLVSETLV ,也就是做,也就是做 WRITEQWRITEQ 的工作。的工作。B101-INIT-MAP.B101-INIT-MAP.

一般一张一般一张 MAPMAP 都要配备两个代码段,分别是初始化都要配备两个代码段,分别是初始化 MapMap 和初始化和初始化 MapMap 域的属域的属性。性。 B101-INIT-MAPB101-INIT-MAP代码段用于将所有字符型的域赋值代码段用于将所有字符型的域赋值 SPACESSPACES ,数字型的域,数字型的域赋值赋值 00 。。B102-INIT-ATTR. B102-INIT-ATTR.

该代码段将所有域的属性清空,将所有的域名以该代码段将所有域的属性清空,将所有的域名以 AA 结尾的变量都赋值为结尾的变量都赋值为 LOW-VLOW-VALUEALUE ,这样可以保证每次得到的,这样可以保证每次得到的 MapMap 域的属性都是正确的。域的属性都是正确的。B200-RECEIVE-MAP. B200-RECEIVE-MAP.

用于用于 RECEIVE MAP RECEIVE MAP 的代码段。在的代码段。在 RECEIVE MAPRECEIVE MAP 之前,一般会有如下代码:之前,一般会有如下代码:EXEC CICS HANDLE AID CLEAR (Z000-RETURN)EXEC CICS HANDLE AID CLEAR (Z000-RETURN) PF3 (Z000-RETURN)PF3 (Z000-RETURN) ENTER (C100-BROWSE)ENTER (C100-BROWSE) ANYKEY (C100-BROWSE)ANYKEY (C100-BROWSE)END-EXEC.END-EXEC.

Page 14: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

一般来讲按一般来讲按 F3F3键表示退出(有些是回到上一张键表示退出(有些是回到上一张 MAPMAP ,有些是直接回,有些是直接回到到 CICSCICS ),其他功能键都建议使用习惯用法。),其他功能键都建议使用习惯用法。

建议上述代码中包含建议上述代码中包含 ANYKEYANYKEY ,表示在键盘上按下除了清屏键、,表示在键盘上按下除了清屏键、 F3F3键键和回车键以外的其他键所执行的动作,否则如果使用没有设定过的键和回车键以外的其他键所执行的动作,否则如果使用没有设定过的键就会退出任务,这往往不是我们所希望的。就会退出任务,这往往不是我们所希望的。

Page 15: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

如果程序中有不止一张的如果程序中有不止一张的 MAPMAP ,分别需要处理程序段,其命名规则一般,分别需要处理程序段,其命名规则一般遵循以下原则:遵循以下原则:B1@0-SEND-MAPB1@0-SEND-MAP B1@1-INIT-MAPB1@1-INIT-MAP B1@2-INIT-ATTRB1@2-INIT-ATTRB2@0-RECEIVE-MAPB2@0-RECEIVE-MAP

其中其中 @@表示从表示从 11 到到 99 的数字或者从的数字或者从 AA 到到 ZZ 的字母,表示是第几张的字母,表示是第几张 MAPMAP(( 99 之后为之后为 AA ,本命名规则最多可以包含,本命名规则最多可以包含 3535张张 MAPMAP )。)。

比如,第一张比如,第一张 MAPMAP 的一些代码段就是:的一些代码段就是:B110-SEND-MAP.B110-SEND-MAP. B111-INIT-MAP.B111-INIT-MAP. B112-INIT-ATTR.B112-INIT-ATTR.B210-RECEIVE-MAP.B210-RECEIVE-MAP.

即即 BB 层的后层的后 33位分别表示:第一个,位分别表示:第一个, 11 为为 SENDSEND ,, 22 为为 RECEIVERECEIVE;第;第二个,表示为第几张二个,表示为第几张 MAPMAP;第三个;第三个 00 表示表示 SENDSEND 或或 RECEIVERECEIVE ,, 11 以后以后的表示辅助的代码段,如的表示辅助的代码段,如 SENDSEND 的的 11 为为 INIT-MAPINIT-MAP ,, 22 为为 INIT-ATTRINIT-ATTR 。。

Page 16: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

CC 层用于具体的代码段的处理。包括没有层用于具体的代码段的处理。包括没有 VSAMVSAM 和和 DB2DB2 参与的参与的 COBOL+CICSCOBOL+CICS 的代的代码段的处理,有码段的处理,有 VSAMVSAM 参与的参与的 COBOL+CICS+VSAMCOBOL+CICS+VSAM 的代码段的处理,有的代码段的处理,有 DB2DB2 参与参与的的 COBOL+CICS+DB2COBOL+CICS+DB2 的代码段的处理。的代码段的处理。

对于对于 COBOL+CICS+VSAMCOBOL+CICS+VSAM 的例子来说,读取的例子来说,读取 VSAMVSAM 数据及后续处理的核心样例代数据及后续处理的核心样例代码如下:码如下:MOVE MYNAMEI(1:6) TO WS-STDNUMMOVE MYNAMEI(1:6) TO WS-STDNUMEXEC CICS READ FILE('K211T01')EXEC CICS READ FILE('K211T01') RIDFLD(WS-STDNUM) RIDFLD(WS-STDNUM) INTO(C0S11T01-REC) INTO(C0S11T01-REC)

RESP(WS-FILE-RESP) RESP(WS-FILE-RESP) END-EXEC END-EXEC IF WS-FILE-RESP = DFHRESP(NORMAL) IF WS-FILE-RESP = DFHRESP(NORMAL) MOVE C0S11T01-NAME TO MYMSGOMOVE C0S11T01-NAME TO MYMSGOELSE ELSE

MOVE 'RECORD NOT FOUND' TO MYMSGO MOVE 'RECORD NOT FOUND' TO MYMSGO END-IFEND-IF

该代码片断实现的功能是:用该代码片断实现的功能是:用 EXEC CICS READ FILEEXEC CICS READ FILE 命令,按命令,按 VSAMVSAM 的关键字的关键字 WS-WS-STDNUMSTDNUM查询出非关键字查询出非关键字 C0S11T01-NAMEC0S11T01-NAME 的值,并将其传送给的值,并将其传送给 COPYBOOKCOPYBOOK 中的中的输出变量输出变量 MYMSGOMYMSGO ,以便通过,以便通过 SEND MAPSEND MAP送出到屏幕显示给用户。送出到屏幕显示给用户。

Page 17: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

对于对于 COBOL+CICS+DB2COBOL+CICS+DB2 的例子来说,读取的例子来说,读取 DB2DB2 数据及后续处理的核心样数据及后续处理的核心样例代码如下:例代码如下:MOVE MKEYI(1:6) TO BOOKNO MOVE MKEYI(1:6) TO BOOKNO EXEC SQL SELECT BOOKNAME EXEC SQL SELECT BOOKNAME INTO :BOOKNAME INTO :BOOKNAME FROM TJD0211.TT01C01 FROM TJD0211.TT01C01 WHERE BOOKNO = :BOOKNO WHERE BOOKNO = :BOOKNO END-EXEC END-EXEC IF SQLCODE = 0 IF SQLCODE = 0

MOVE BOOKNAME TO MCONTENO MOVE BOOKNAME TO MCONTENO ELSE ELSE

MOVE '**FETCH ERROR**' TO MCONTENO MOVE '**FETCH ERROR**' TO MCONTENO END-IF END-IF

该代码片断实现的功能跟上面 该代码片断实现的功能跟上面 COBOL+CICS+VSAMCOBOL+CICS+VSAM 的例子的功能差不多:的例子的功能差不多:用用 EXEC SQL SELECTEXEC SQL SELECT 语句,按语句,按 DB2DB2 的主键的主键 BOOKNOBOOKNO查询出非主键查询出非主键 BOOKBOOKNAMENAME 的值,并将其传送给的值,并将其传送给 COPYBOOKCOPYBOOK 中的输出变量中的输出变量 MCONTENOMCONTENO ,以便,以便通过通过 SEND MAPSEND MAP送出到屏幕显示给用户。送出到屏幕显示给用户。

Page 18: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

Z000-RETURN. Z000-RETURN. 表示所有程序的结束,样例代码如下:表示所有程序的结束,样例代码如下:

MOVE 0 TO WS-TSQ-LEVEL.MOVE 0 TO WS-TSQ-LEVEL. MOVE SPACES TO WS-TSQ-TRANID.MOVE SPACES TO WS-TSQ-TRANID. PERFORM A300-CLEARQ THRU A300-EXIT.PERFORM A300-CLEARQ THRU A300-EXIT. EXEC CICS SEND CONTROL ERASE END-EXECEXEC CICS SEND CONTROL ERASE END-EXEC EXEC CICS RETURN END-EXECEXEC CICS RETURN END-EXEC GOBACK.GOBACK. EXIT.EXIT.这个是比较定式,当然也可以根据需要来自行的加一些动作。这个是比较定式,当然也可以根据需要来自行的加一些动作。

5. 5. 其他其他 除了以上的部分外,还要注意一点:在所有代码段的第一层,必须加除了以上的部分外,还要注意一点:在所有代码段的第一层,必须加

““ ..”” ,在第一层以下的都不要加,否则会导致程序逻辑出错,或语,在第一层以下的都不要加,否则会导致程序逻辑出错,或语法错误。法错误。

Page 19: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

6.2 COBOL+CICS6.2 COBOL+CICS 样例程序开发样例程序开发

本节在本节在 6.16.1节的基础上,论述节的基础上,论述 COBOL+CICSCOBOL+CICS 样例程序的开发过程。样例程序的开发过程。 COBOL+CICSCOBOL+CICS 样例程序的样例程序的 MAPMAP源代码如下面三页所示: 源代码如下面三页所示:

Page 20: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 21: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 22: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

COBOL+CICSCOBOL+CICS 样例程序的样例程序的 COPY BOOKCOPY BOOK 如下面两页所示:如下面两页所示:

Page 23: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

注意注意 COBOL+CICSCOBOL+CICS 样例程序的样例程序的 MAPMAP源代码和源代码和 COPY BOOKCOPY BOOK 不需要用不需要用户手工编写,而是由主机端的户手工编写,而是由主机端的 SDFIISDFII工具自动生成。因生成过程比较工具自动生成。因生成过程比较繁杂,在此略。有兴趣的同学可参考相关文档。繁杂,在此略。有兴趣的同学可参考相关文档。

Page 24: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

编译、链接上述编译、链接上述 COBOL+CICSCOBOL+CICS 样例程序的样例程序的 MAPMAP源代码的源代码的 JCLJCL 如下:如下:

Page 25: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

上述上述 JCLJCL 要调用到的过程要调用到的过程 DFHASMV1DFHASMV1代码如下:代码如下:

Page 26: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

上述上述 JCLJCL 要调用到的过程要调用到的过程 DFHLNKV1DFHLNKV1代码如下:代码如下:

提交上述提交上述 JCLJCL并成功(并成功( MAXCC<=4MAXCC<=4 )后,便在)后,便在 STRB.CICS.LOADSTRB.CICS.LOAD 中中生成一个生成一个 MAPSET M211T01MAPSET M211T01 。。

自此,自此, COBOL+CICSCOBOL+CICS 样例程序的样例程序的 CICS MAPCICS MAP 代码生成并执行完毕。代码生成并执行完毕。

Page 27: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

COBOL+CICSCOBOL+CICS 程序样例源代码如下面八页所示,其中程序的基本逻辑程序样例源代码如下面八页所示,其中程序的基本逻辑在在 6.1 6.1 程序编写规范已经基本论述完毕。程序编写规范已经基本论述完毕。

Page 28: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 29: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 30: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 31: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 32: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 33: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 34: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 35: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

CICSCICS 翻译、翻译、 COBOLCOBOL 编译、链接上面的编译、链接上面的 COBOL+CICSCOBOL+CICS 源程序的源程序的 JCLJCL如下面三页所示:如下面三页所示:

Page 36: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 37: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

提交上述提交上述 JCLJCL并成功(并成功( MAXCC<=4MAXCC<=4 )后,便在)后,便在 STRB.CICS.LOADSTRB.CICS.LOAD 中中生成一个生成一个 PROGRAM C0O11T1PROGRAM C0O11T1 。。

自此,自此, COBOL+CICSCOBOL+CICS 样例程序的源代码编写并执行完毕。样例程序的源代码编写并执行完毕。

Page 38: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

下面在下面在 CICS RegionCICS Region 里创建各个资源,这些资源包括里创建各个资源,这些资源包括 MAPSETMAPSET ,,PROGRAMPROGRAM 和和 TRANSACTIONTRANSACTION 。。

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 MAPSETMAPSET ::CEDA DEF MAPSET(M211T01) G(TJD0211)CEDA DEF MAPSET(M211T01) G(TJD0211)

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 PROGRAMPROGRAM ::CEDA DEF PROG(C0O11T1) G(TJD0211)CEDA DEF PROG(C0O11T1) G(TJD0211)

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 TRANSACTIONTRANSACTION ::CEDA DEF TRANSACTION(A211) PROG(C0O11T1) CEDA DEF TRANSACTION(A211) PROG(C0O11T1) G(TJD0211)G(TJD0211)

在在 CICS RegionCICS Region 里输入如下命令安装定义的上述资源:里输入如下命令安装定义的上述资源:CEDA INS G(TJD0211)CEDA INS G(TJD0211)

自此,自此, COBOL+CICSCOBOL+CICS 样例程序的样例程序的 CICSCICS 资源都已经定义并安资源都已经定义并安装完毕。装完毕。

Page 39: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

下面执行刚刚创建并安装好的交易。在下面执行刚刚创建并安装好的交易。在 CICS RegionCICS Region 里输入里输入 A211A211 ,,回车,如果一切正常,将出现如下屏幕:回车,如果一切正常,将出现如下屏幕:

在在 ENTER YOUR ID HERE:ENTER YOUR ID HERE: 处随意输入一个用户名,如处随意输入一个用户名,如 TANGJFTANGJF ,按,按回车,回车, MESSAGE:MESSAGE: 处将显示:处将显示: HELLO,TANGJF!HELLO,TANGJF!。。

Page 40: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

6.3 COBOL+CICS+VSAM6.3 COBOL+CICS+VSAM 样例程序开发样例程序开发 本节在本节在 6.16.1节的基础上,论述节的基础上,论述 COBOL+CICS+VSAMCOBOL+CICS+VSAM 样例程序的开发过样例程序的开发过

程。程。 创建本节中用到的创建本节中用到的 VSAMVSAM 数据集的数据集的 JCLJCL 如下:如下:

Page 41: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

VSAMVSAM 数据集定义好以后,下一步是向数据集定义好以后,下一步是向 VSAMVSAM 数据集数据集 TJD0211.L11.C0TJD0211.L11.C0K11T01K11T01 中插入样本数据,我们用中插入样本数据,我们用 DITTODITTO工具来完成这一工作。方法工具来完成这一工作。方法如下:如下:

在在 ISPFISPF 主菜单中输入主菜单中输入 M.7M.7,进入,进入 DITTO DITTO 界面。按如下界面输入信息:界面。按如下界面输入信息:

按回车后得到如下界面,在按回车后得到如下界面,在 Data set nameData set name 处输入要插入数据的处输入要插入数据的 VSAVSAMM 数据集的名字,用单引号括起来,如下所示:数据集的名字,用单引号括起来,如下所示:

Page 42: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

按回车后,出现空的按回车后,出现空的 VSAMVSAM 数据集,向数据集,向 VSAMVSAM 数据集插入如下数据集插入如下内容(操作同在普通内容(操作同在普通 PDSPDS 数据集的数据集的 MemberMember 或或 PSPS 数据集中插数据集中插入数据的方法相同,此处略):入数据的方法相同,此处略):

自此,本节中要用到的自此,本节中要用到的 VSAMVSAM 数据集创建完毕并插入数据。数据集创建完毕并插入数据。

Page 43: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

COBOL+CICS+VSAMCOBOL+CICS+VSAM 样例程序的样例程序的 MAPMAP源代码和源代码和 COPY BOOKCOPY BOOK 与与 COBCOBOL+CICSOL+CICS 样例程序的样例程序的 MAPMAP源代码和源代码和 COPY BOOKCOPY BOOK 几乎相同,限于篇几乎相同,限于篇幅,此处略去。相应的编译、链接上述幅,此处略去。相应的编译、链接上述 COBOL+CICS+VSAMCOBOL+CICS+VSAM 样例程序样例程序的的 MAPMAP源代码的源代码的 JCLJCL 也略去。也略去。

提交上述提交上述 JCLJCL并成功(并成功( MAXCC<=4MAXCC<=4 )后,便在)后,便在 STRB.CICS.LOADSTRB.CICS.LOAD 中中生成一个生成一个 MAPSET M211T02MAPSET M211T02 。。

自此,自此, COBOL+CICS+VSAMCOBOL+CICS+VSAM 样例程序的样例程序的 CICS MAPCICS MAP 生成并执行完毕。生成并执行完毕。

Page 44: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

在编写在编写 COBOL+CICS+VSAMCOBOL+CICS+VSAM 样例程序源代码之前,应该首先编写好样例程序源代码之前,应该首先编写好 VVSAMSAM 数据集的数据集的 COPY BOOKCOPY BOOK ,如下所示:,如下所示:

Page 45: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

然后开始编写然后开始编写 COBOL+CICS+VSAMCOBOL+CICS+VSAM 样例程序的源代码。样例程序的源代码。 COBOL+CICCOBOL+CICS+VSAMS+VSAM 与与 COBOL+CICSCOBOL+CICS 源程序的主逻辑非常相似,受篇幅限制,此源程序的主逻辑非常相似,受篇幅限制,此处只介绍加入处只介绍加入 VSAMVSAM 的处理逻辑后与的处理逻辑后与 COBOL+CICSCOBOL+CICS 的程序不同之处的的程序不同之处的代码。代码。(( 11 )首先在程序一开始的注释中加入如下代码:)首先在程序一开始的注释中加入如下代码:

上述注释表示应用程序中将用到上述注释表示应用程序中将用到 VSAMVSAM 文件文件 C0K11T01C0K11T01 ,并且,并且VSAMVSAM对应的对应的 COPYBOOKCOPYBOOK 是是 C0S11T01C0S11T01 。 。 (( 22 )在第二个)在第二个 01 WS-VARIABLE.01 WS-VARIABLE. 中加入如下代码:中加入如下代码:

上述上述WS-STDNUMWS-STDNUM 作为作为 VSAMVSAM 的的 KeyKey送入送入 READ FILEREAD FILE 命令的命令的RIDFLDRIDFLD ,当,当 CICSCICS反馈信息为正常时,将得到反馈信息为正常时,将得到 VSAMVSAM 的其他的其他 Non Non KeyKey 的数据。的数据。

Page 46: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

(( 33 )在引入)在引入 COPYBOOKCOPYBOOK 的代码的代码 COPY C0M11T2. COPY C0M11T2. 后面加入如下代后面加入如下代码:码:

上述上述 COPYCOPY 语句在上文语句在上文 6.16.1 中的(中的( 22 )) COPY COPY 部分已经解释完毕,故部分已经解释完毕,故此处略。此处略。(( 44 )在)在 A300-PROCESSA300-PROCESS 程序段书写如下代码:程序段书写如下代码:

该代码片断实现的功能在上文 6.1 中的 4.PROCEDURE DIVISION 部分已经解释完毕,故此处略。

Page 47: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

CICSCICS 翻译、翻译、 COBOLCOBOL 编译、链接上面的编译、链接上面的 COBOL+CICS+VSAMCOBOL+CICS+VSAM 源程序源程序的的 JCLJCL 与与 CICSCICS 翻译、翻译、 COBOLCOBOL 编译、链接上面的编译、链接上面的 COBOL+CICSCOBOL+CICS 源程源程序的序的 JCLJCL非常类似,只需要将所有含非常类似,只需要将所有含 C0O11T1C0O11T1 的地方的地方 ((共计两处共计两处 ))替替换成换成 C0O11T2C0O11T2 ,提交即可,故在此省略,提交即可,故在此省略 JCLJCL代码。代码。

提交上述提交上述 JCLJCL并成功(并成功( MAXCC<=4MAXCC<=4 )后,便在)后,便在 STRB.CICS.LOADSTRB.CICS.LOAD 中中生成一个生成一个 PROGRAM C0O11T2PROGRAM C0O11T2 。。

自此,自此, COBOL+CICS+VSAMCOBOL+CICS+VSAM 样例程序的源代码编写并执行完毕。样例程序的源代码编写并执行完毕。

Page 48: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

下面在下面在 CICS RegionCICS Region 里创建各个资源,这些资源包括里创建各个资源,这些资源包括 FILEFILE ,, MAPSETMAPSET ,,PROGRAMPROGRAM 和和 TRANSACTIONTRANSACTION 。。

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 VSAM FILEVSAM FILE 的定义:的定义:CEDA DEF FILE(K211T01) G(TJD0211)CEDA DEF FILE(K211T01) G(TJD0211)

运行以上命令后,还需要进到运行以上命令后,还需要进到 K211T01K211T01 中进行如下设置中进行如下设置 (( 部分部分 )) 。其。其中粗体项表示必填参数。中粗体项表示必填参数。

Page 49: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

如果如果 VSAMVSAM 数据集没有打开,还需要在数据集没有打开,还需要在 CICS RegionCICS Region 里运行如下命令里运行如下命令将将 K211T01K211T01打开:打开:CEMT I FILE(K211T01)CEMT I FILE(K211T01)

结果如下:结果如下:

将将 CloClo 替换成替换成 OpeOpe ,回车,将,回车,将 VSAMVSAM 数据集数据集 K211T01K211T01打开。打开。

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 MAPSETMAPSET ::CEDA DEF MAPSET(M211T02) G(TJD0211)CEDA DEF MAPSET(M211T02) G(TJD0211)

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 PROGRAMPROGRAM ::CEDA DEF PROG(C0O11T2) G(TJD0211)CEDA DEF PROG(C0O11T2) G(TJD0211)

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 TRANSACTIONTRANSACTION ::CEDA DEF TRANSACTION(B211) PROG(C0O11T2) G(TJD0211)CEDA DEF TRANSACTION(B211) PROG(C0O11T2) G(TJD0211)

在在 CICS RegionCICS Region 里输入如下命令安装定义的上述资源:里输入如下命令安装定义的上述资源:CEDA INS G(TJD0211)CEDA INS G(TJD0211)

自此,自此, COBOL+CICS+VSAMCOBOL+CICS+VSAM 样例程序的样例程序的 CICSCICS 资源都已经定义并安装资源都已经定义并安装完毕。完毕。

Page 50: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

下面执行刚刚创建并安装好的交易。在下面执行刚刚创建并安装好的交易。在 CICS RegionCICS Region 里输入里输入 B211B211 ,,回车,如果一切正常,将出现如下屏幕:回车,如果一切正常,将出现如下屏幕:

在在 ENTER YOUR ID HERE:ENTER YOUR ID HERE: 处输入处输入 VSAMVSAM 数据集中具有的一个数据集中具有的一个 KEYKEY 值。值。如如 000001000001 ,按回车,,按回车, MESSAGE:MESSAGE: 处将显示:处将显示: HELLO, VSAMDATA1 HELLO, VSAMDATA1 ! !其中其中 VSAMDATA1VSAMDATA1 是是 KEY 000001KEY 000001对应的对应的 NON KEYNON KEY 的值。的值。

Page 51: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

6.4 COBOL+CICS+DB26.4 COBOL+CICS+DB2 样例程序开发样例程序开发

本节在本节在 6.16.1节的基础上,论述节的基础上,论述 COBOL+CICS+DB2COBOL+CICS+DB2 样例程序的开发过样例程序的开发过程。程。

在编写在编写 COBOL+CICS+DB2COBOL+CICS+DB2 样例程序的源代码之前,必须在样例程序的源代码之前,必须在 DB2DB2 中创中创建相应的数据库、表空间和表并插入样本数据。方法是:在建相应的数据库、表空间和表并插入样本数据。方法是:在 ISPFISPF菜单菜单中输入以下中输入以下 SQLSQL 命令或语句创建样例程序中需要的表和数据(假设用命令或语句创建样例程序中需要的表和数据(假设用户户 TJD0211TJD0211具有具有 SYSADMSYSADM 的权限):的权限):

Page 52: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

表创建好并插入数据后,可以生成表表创建好并插入数据后,可以生成表 TJD0211.TT01C01TJD0211.TT01C01对应的数据对应的数据结构,该数据结构在后续结构,该数据结构在后续 COBOL+CICS+DB2COBOL+CICS+DB2 样例程序的源代码中将样例程序的源代码中将用到。生成方法是:在用到。生成方法是:在 ISPFISPF 主菜单中输入:主菜单中输入: M.11.2M.11.2 ,按回车,然后,按回车,然后在如下界面输入相应的项,其中粗体为必填项:在如下界面输入相应的项,其中粗体为必填项:

Page 53: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

这样表这样表 TJD0211.TT01C01TJD0211.TT01C01对应的数据结构就存入对应的数据结构就存入 TJD0211.CICS.INCTJD0211.CICS.INCLUDE(TT01C01)LUDE(TT01C01) 中,如下所示:中,如下所示:

自此,自此, COBOL+CICS+DB2COBOL+CICS+DB2 样例程序中要用到的样例程序中要用到的 DB2DB2 表创建完毕并生表创建完毕并生成了对应数据结构。成了对应数据结构。

Page 54: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

COBOL+CICS+DB2COBOL+CICS+DB2 样例程序的样例程序的 MAPMAP源代码如下面两页所示:源代码如下面两页所示:

Page 55: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 56: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

COBOL+CICS+DB2COBOL+CICS+DB2 样例程序的样例程序的 COPY BOOKCOPY BOOK 如下面两页所示:如下面两页所示:

Page 57: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

编译、链接上述编译、链接上述 COBOL+CICS+DB2COBOL+CICS+DB2 样例程序的样例程序的 MAPMAP源代码的源代码的 JCLJCL 同同编译、链接编译、链接 COBOL+CICSCOBOL+CICS 样例程序的样例程序的 MAPMAP源代码的源代码的 JCLJCL基本相同,基本相同,故此处略。故此处略。

提交上述提交上述 JCLJCL并成功(并成功( MAXCC<=4MAXCC<=4 )后,便在)后,便在 STRB.CICS.LOADSTRB.CICS.LOAD 中中生成一个生成一个 MAPSET M211T03MAPSET M211T03 。。

自此,自此, COBOL+CICS+DB2COBOL+CICS+DB2 样例程序的样例程序的 CICS MAPCICS MAP 生成并执行完毕。生成并执行完毕。

Page 58: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

COBOL+CICS+DB2COBOL+CICS+DB2 与与 COBOL+CICSCOBOL+CICS 程序的主逻辑非常相似,程序的主逻辑非常相似,受篇幅限制,此处只介绍加入受篇幅限制,此处只介绍加入 DB2DB2 的处理逻辑后与的处理逻辑后与 COBOL+CICOBOL+CICSCS 的程序不同之处的代码。的程序不同之处的代码。(( 11 )首先在程序一开始的注释中加入如下代码:)首先在程序一开始的注释中加入如下代码:

上述注释表示应用程序中将用到数据库表上述注释表示应用程序中将用到数据库表 TT01C01TT01C01 ,且是关于书籍信,且是关于书籍信息的表。息的表。(( 22 )在引入)在引入 COPYBOOKCOPYBOOK 的代码的代码 COPY C0M11T2.COPY C0M11T2. 后面加入如下代码:后面加入如下代码:

上述代码第一行表示将含有关键的上述代码第一行表示将含有关键的 SQLCODESQLCODE 变量的变量的 SQLCASQLCA 结构加入结构加入到代码中来,下面的代码将用到到代码中来,下面的代码将用到 SQLCODESQLCODE 这个代表这个代表 SQLSQL 是否运行成是否运行成功的变量。功的变量。

第二行表示将第二行表示将 TT01C01TT01C01 这个含有数据库表中各个列对应的各个变量定这个含有数据库表中各个列对应的各个变量定义的义的 PDSPDS成员加入到代码中来,下面的代码用到表中列对应的各个变成员加入到代码中来,下面的代码用到表中列对应的各个变量时将不需要再定义。量时将不需要再定义。

Page 59: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

(( 33 )在)在 A300-PROCESSA300-PROCESS 程序段书写如下代码:程序段书写如下代码:

该代码片断实现的功能在上文该代码片断实现的功能在上文 6.16.1 中的中的 4. PROCEDURE DIVISION4. PROCEDURE DIVISION 部分部分已经解释完毕,故此处略。已经解释完毕,故此处略。

Page 60: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

DB2DB2预编译、预编译、 CICSCICS 翻译、翻译、 COBOLCOBOL 编译、链接上面的编译、链接上面的 COBOL+CICS+COBOL+CICS+DB2DB2源程序的源程序的 JCLJCL 如下面五页所示:如下面五页所示:

Page 61: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 62: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 63: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程
Page 64: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

提交上述提交上述 JCLJCL并成功(并成功( MAXCC<=4MAXCC<=4 )后,便在)后,便在 STRB.CICS.LOADSTRB.CICS.LOAD 中中生成一个生成一个 PROGRAM C0O11T3PROGRAM C0O11T3 。。

自此,自此, COBOL+CICS+DB2COBOL+CICS+DB2 样例程序的源代码编写并执行完毕。样例程序的源代码编写并执行完毕。

Page 65: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

下面在下面在 CICS RegionCICS Region 里创建各个资源,这些资源包括里创建各个资源,这些资源包括 MAPSETMAPSET ,, PROPROGRAMGRAM ,, TRANSACTIONTRANSACTION ,, DB2CONNECTIONDB2CONNECTION 和和 DB2ENTRYDB2ENTRY 。。

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 MAPSETMAPSET ::CEDA DEF MAPSET(M211T03) G(TJD0211)CEDA DEF MAPSET(M211T03) G(TJD0211)

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 PROGRAMPROGRAM ::CEDA DEF PROG(C0O11T3) G(TJD0211)CEDA DEF PROG(C0O11T3) G(TJD0211)

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 TRANSACTIONTRANSACTION ::CEDA DEF TRANSACTION(C211) PROG(C0O11T3) G(TJD0211)CEDA DEF TRANSACTION(C211) PROG(C0O11T3) G(TJD0211)

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 DB2CONNECTIONDB2CONNECTION ::CEDA DEF DB2CONN(DB8G) DB2ID(DB8G) G(TJD0211)CEDA DEF DB2CONN(DB8G) DB2ID(DB8G) G(TJD0211)

在在 CICS RegionCICS Region 里输入如下命令创建里输入如下命令创建 DB2ENTRYDB2ENTRY ::CEDA DEF DB2ENTRY(E211T01) TRANSID(C211) CEDA DEF DB2ENTRY(E211T01) TRANSID(C211) PLAN(P211T03) G(TJD0211)PLAN(P211T03) G(TJD0211)

在在 CICS RegionCICS Region 里输入如下命令安装定义的上述资源:里输入如下命令安装定义的上述资源:CEDA INS G(TJD0211)CEDA INS G(TJD0211)

Page 66: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

注:注: DB2CONNECTIONDB2CONNECTION 表示表示 CICSCICS 和和 DB2DB2 的连接,且是的连接,且是 DB2DB2子系子系统独占的,即统独占的,即 DB2CONNECTIONDB2CONNECTION 中指定的中指定的 DB2ID(DB8G)DB2ID(DB8G) 表示将使表示将使用子系统用子系统 DB8GDB8G ,如果之前,如果之前 CICSCICS 和和 DB2DB2 的连接采用另一个子系统的连接采用另一个子系统DB7GDB7G ,那么在采用,那么在采用 DB8GDB8G 之前,必须在之前,必须在 CICS RegionCICS Region 中:中:(( 11 )运行如下命令将)运行如下命令将 CICSCICS 和和 DB2DB2 的连接断开:的连接断开:DSNC STOPDSNC STOP(( 22 )安装)安装 DB2CONNECTIONDB2CONNECTION (步骤略)(步骤略)(( 33 )运行如下命令将)运行如下命令将 CICSCICS 和和 DB2DB2重新连接起来,此时将采用子系重新连接起来,此时将采用子系统统 DB8GDB8G ::DSNC STRTDSNC STRT(( 44 )可以运行如下命令查看)可以运行如下命令查看 CICSCICS 和和 DB2DB2 的连接细节:的连接细节:DSNC DISP STATDSNC DISP STAT

自此,自此, COBOL+CICS+DB2COBOL+CICS+DB2 样例程序的样例程序的 CICSCICS资源都已经定义并安资源都已经定义并安装完毕。装完毕。

Page 67: 大型主机应用上的开放系统和中间件 2011 年度教育部 -IBM 精品课程

下面执行刚刚创建并安装好的交易。在下面执行刚刚创建并安装好的交易。在 CICS RegionCICS Region 里输入里输入 C211C211 ,,回车,如果一切正常,将出现如下屏幕:回车,如果一切正常,将出现如下屏幕:

在在 ENTER KEYENTER KEY 处输入处输入 DB2DB2 表中的表中的 KEYKEY 值,如值,如 0000100001 ,按回车,,按回车, COCONTENTNTENT 处将显示处将显示 DB2DB2 表中表中 KEYKEY 值值 0000100001对应的对应的 NON KEYNON KEY 值值 BOOK1BOOK1 。。