#
1、自动增长identity
适用于MySQL、DB2、MS SQL Server,采用数据库生成的主键,用于为long、short、int类型生成唯一标识 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用) 数据库中的语法如下: MySQL:create table t_user(id int auto_increment primary key, name varchar(20)); SQL Server:create table t_user(id int identity(1,1) primary key, name varchar(20));
<id name="id" column="id" type="long"> <generator class="identity" /> </id> 2、sequence
DB2、Oracle均支持的序列,用于为long、short或int生成唯一标识 数据库中的语法如下: Oracle:create sequence seq_name increment by 1 start with 1; 需要主键值时可以调用seq_name.nextval或者seq_name.curval得到,数据库会帮助我们维护这个sequence序列,保证每次取到的值唯一,如: insert into tbl_name(id, name) values(seq_name.nextval, ‘Jimliu’);
<id name="id" column="id" type="long"> <generator class="sequence"> <param name="sequence">seq_name</param> </generator> </id> 如果我们没有指定sequence参数,则Hibernate会访问一个默认的sequence,是hibernate_sequence,我们也需要在数据库中建立这个sequence 此外,sequence还可以有另外一个参数是paramters,可以查看Hibernate的API了解它的用法,见org.hibernate.id.SequenceGenerator 调用数据库的sequence来生成主键,要设定序列名,不然hibernate无法找到: <param name="sequence">NAME_SEQ</param>(Oracle中很常用)
3、hilo
使用一个高/低位算法生成的long、short或int类型的标识符,给定一个表和字段作为高位值的来源,默认的表是hibernate_unique_key,默认的字段是next_hi。它将id的产生源分成两部分,DB+内存,然后按照算法结合在一起产生id值,可以在很少的连接次数内产生多条记录,提高效率
MySQL:create table hi_value(next_hi integer not null);
insert into hi_value(next_hi) values(1);
<id name="id" column="id"> <generator class="hilo"> <param name="table">hi_value</param> <param name="column">next_hi</param> <param name="max_lo">100</param> </generator> </id> 在hibernate持久化的时候,由hibernate负责生成低位值。hilo标识符生成器在生成标识符时需要从hi_value表中取出next_hi的当前值,然后修改该值,这个操作是在单独的事务中完成的。最大的低值在属性max_lo中配置,但在Hibernate内存中生成的低位值超过此值时,就有需要到数据库的hi_value表中再次读取高位值了 使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi(比较少用) 我们也可以自己设置自定义的表名和字段名 <id name="id" type="integer"> <column name="id"/> <generator class="hilo"> <param name="my_unique_key"/> <param column="next_hi"/> </generator> </id>
4、native
会根据底层数据库的能力,从identity、sequence、hilo中选择一个,灵活性更强,但此时,如果选择sequence或者hilo,则所有的表的主键都会从Hibernate默认的sequence或者hilo表中取。并且,有的数据库对于默认情况主键生成测试的支持,效率并不是很高 对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)
<id name="id" column="id"> <generator class="native" /> </id> 5、seqhilo
sequence和hilo的结合,hilo的高位由sequence产生,所以也需要底层数据库的支持 通过hilo算法实现,但是主键历史保存在Sequence中,适用于支持 Sequence 的数据库,如 Oracle(比较少用)
<id name="id" column="id"> <generator class="seqhilo"> <param name="sequence">seq_name</param> <param name="max_lo">100</param> </generator> </id> 6、increment
这个是由Hibernate在内存中生成主键,每次增量为1,不依赖于底层的数据库,因此所有的数据库都可以使用,但问题也随之而来,由于是Hibernate生成的,所以只
能有一个Hibernate应用进程访问数据库,否则就会产生主键冲突,不能在集群情况下使用 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法 <id name="id" column="id"> <generator class="increment" /> </id> 7、
uuid.hex
使用一个128-bit的UUID算法生成字符串类型的标识符,UUID被编码成一个32位16进制数字的字符串。UUID包含:IP地址、JVM启动时间、系统时间(精确到1/4秒)和一个计数器值(JVM中唯一) hibernate会算出一个128位的唯一值插入
<id name="id" column="id"> <generator class="uuid.hex" /> </id>
uuid.string hibernate会算出一个16位的值插入
8、assigned
由应用程序负责生成主键标识符,往往使用在数据库中没有代理主键,使用的主键与业务相关的情况,如:
<id name="id" column="id" type="string"> <generator class="assigned" /> </id> 这种主键的生成方式不建议使用,在数据库表设计时就应该使用代理主键(surrogate key),不应使用自然主键(natural key具有业务含义),在没有指定<generator>标签时,默认就是assigned主键的生成方式 在插入数据的时候主键由用户自己添加,hibernate也不管
9、foreign 使用外部表的字段作为主键
10、select 使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)
ps:
代理主键是指与业务无关且能唯一标识数据库中记录,一般是数据库自动生成的,比如mysql可以使用auto_increment,Sql2000可以使用identity生成方式,oracle可以使用sequence生成方式自然主键指业务相关,由用户指定,且能唯一标识数据库中的任意一条记录
简介版:
increment:代理主键,适合于所有数据库,由hibernate维护主键自增,和底层数据库无关,但是不适合于2个或以上hibernate进程。
identity:代理主键,适合于Mysql或ms sql server等支持自增的dbms,主键值不由hibernate维护。
sequence:代理主键,适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生。
native:代理主键,根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence。
hilo:代理主键,hibernate把特定表的字段作为hign值,生成主键值
uuid.hex:代理主键,hibernate采用uuid 128位算法生成基于字符串的主键值
assign:适合于应用程序维护的自然主键。
<li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
<li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
<li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li>
<li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
<li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>
<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
<hr />
<li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
<li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
<hr />
<li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>访问List:<s:property value="users"/></li>
<li>访问List中某个元素:<s:property value="users[1]"/></li>
<li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
<li>访问Set:<s:property value="dogs"/></li>
<li>访问Set中某个元素:<s:property value="dogs[1]"/></li>
<li>访问Map:<s:property value="dogMap"/></li>
<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
<li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
<li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
<hr />
<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
<hr />
<li>[]:<s:property value="[0].username"/></li>
摘要: 前面一段时间学过一些Struts2的知识,感觉Struts2和1.x还是有很大的差别的,我还不好说1.x肯定会过时还是2.0会很快流行,这毕竟是需要作为导向的。
在Struts2中验证真的比较容易,可以在Action中直接写validate,也可以使用validate框架进行验证,这个我觉得比Struts1.x方便了很多,但是有个问题一直困扰了我,直到现在有... 阅读全文
修改ADCD.Z110.PARMLIB(PROGD9),添加以下(注D9根据LOADPARM不同也不同): APF ADD DSNAME(DSN910.ADSNLOAD) VOLUME(ZADB92)
LNKLST ADD NAME(LNKLST00) DSN(DSN910.DB9G.SDSNEXIT) VOLUME(ZADB91) LNKLST ADD NAME(LNKLST00) DSN(DSN910.SDSNLOAD) VOLUME(ZADB91) LNKLST ADD NAME(LNKLST00) DSN(DSN910.SDXRRESL) VOLUME(ZADB91) LNKLST ADD NAME(LNKLST00) DSN(DSN910.ADSNLOAD) VOLUME(ZADB92) 修改并运行ADB720.SADBSAMP(ADBBIND)
重新开机!
ASRA - This abend occured beacuse of invalid non numeric data AICA - A looping task has been terminated with this abend code by CICS because it was executing without giving up control longer than the time period specified by the ICVR keyword in the CICS SIT. AEY9 - Invalid EXEC CICS command issued AE** - Most of the abends starts with AE, occures because they are not handled in the cics program.
|
RESP VALUE
|
CONDITION |
ABEND |
|
00 |
NORMAL |
|
01 |
ERROR |
|
02 |
RDATT |
|
03 |
WRBRK |
|
04 |
EOF |
|
05 |
EODS |
|
06 |
EOC |
|
07 |
INBFMH |
|
08 |
ENDINPT |
|
09 |
NONVAL |
|
10 |
NOSTART |
|
11 |
TERMIDERR |
AEIK |
12 |
FILENOTFOUND |
AEIL |
13 |
NOTFND |
AEIM |
14 |
DUPREC |
AEIN |
15 |
DUPKEY |
|
16 |
INVREQ |
AEIP |
17 |
IOERR |
AEIQ |
18 |
NOSPACE |
AEIR |
19 |
NOTOPEN |
|
20 |
ENDFILE |
|
21 |
ILLOGIC |
AEIU |
22 |
LENGERR |
AEIV |
23 |
QZERO |
|
24 |
SIGNAL |
|
25 |
QBUSY |
|
26 |
ITEMERR |
|
27 |
PGMIDERR |
AEIO |
28 |
TRANSIDERR |
AEI1 |
29 |
ENDDATA |
|
30 |
INVTSREQ |
|
31 |
EXPIRED |
|
32 |
RETPAGE |
|
33 |
RTEFAIL |
|
34 |
RTESOME |
|
35 |
TSIOERR |
|
36 |
MAPFAIL |
|
37 |
INVERRTERM |
|
38 |
INVMPSZ |
|
39 |
IGREQID |
|
40 |
OVERFLOW |
|
41 |
INVLDC |
|
42 |
NOSTG |
|
43 |
JIDERR |
AEYG |
44 |
QIDERR |
AEYH |
45 |
NOJBUFSP |
|
46 |
DSSTAT |
|
47 |
SELNERR |
|
48 |
FUNCERR |
|
49 |
UNEXPIN |
|
50 |
NOPASSBKRD |
|
51 |
NOPASSBKWR |
|
52 |
- |
|
53 |
SYSIDERR |
AEYQ |
54 |
ISCINVREQ |
|
55 |
ENQBUSY |
|
56 |
ENVDEFERR |
|
57 |
IGREQCD |
|
58 |
SESSIONERR |
|
59 |
SYSBUSY |
|
60 |
SESSBUSY |
|
61 |
NOTALLOC |
|
62 |
CBIDERR |
|
63 |
INVEXITREQ |
|
64 |
INVPARTNSET |
|
65 |
INVPARTN |
|
66 |
PARTNFAIL |
|
67 |
- |
|
68 |
- |
|
69 |
USERIDERR |
AEYX |
70 |
NOTAUTH |
AEY7 |
71 |
VOLIDERR |
AEXV |
72 |
SUPPRESSED |
|
73 |
- |
|
74 |
- |
|
75 |
RESIDERR |
|
76 |
- |
|
77 |
- |
|
78 |
- |
|
79 |
- |
|
80 |
NOSPOOL |
|
81 |
TERMERR |
|
82 |
ROLLEDBACK |
|
83 |
END |
AEXK |
84 |
DISABLED |
|
85 |
ALLOCERR |
|
86 |
STRELERR |
|
87 |
OPENERR |
|
88 |
SPOLBUSY |
|
89 |
SPOLERR |
|
90 |
NODEIDERR |
|
91 |
TASKIDERR |
AEXX |
92 |
TCIDERR |
AEXO |
93 |
DSNNOTFOUND |
AEX1 |
94 |
LOADING |
|
95 |
MODELIDERR |
AEX3 |
96 |
OUTDESCRERR |
|
97 |
PARTNERIDERR |
AEX5 |
98 |
PROFILEIDERR |
AEX6 |
99 |
NETNAMEIDERR |
|
255 |
NOTPOSS |
|
JCL
S0CB - Attempting to divide by 0 and not using ON SIZE ERROR
S002 - Very large record length/ wrong record length
Sx22 - Job has been cancelled. The value of x will vary depending on the way the job was cancelled. S222 means job was cancelled by a user or operator without a dump. If a TSO session times out you will probably get an S522 abend code.
S222 - The job was cancelled (by subsystem or operator) because it violated some restriction
S522 - JOB or TSO session exceeded maximum job wait time OR operator did not mount the require tape within allowed time limit
S806 - Load module not found
S837 - Space problem, Alloted space is not enough for data set
S913 - You are trying to access a dataset which you are not authorized to use.
SOC7 - 1. Moving non-numeric value to numeric field 2. Not initilizing the numeric variables before first use
SOC4 - 1. Index exceeds the size of table 2. Trying to use File Section variables without opening the file
S0C1 - Operation Exception. Check for subscript errors, missing DD card, file not opened.
SE37 - Insufficient disk space.
U1026 - COBOL sort failed.
U1056 - Program didn't close a file before ending
DB2
+100 -> End of cursor
-180 -> String representation of DATE, TTIME, TIMESTAMP is invalid
-204 -> Object not defined to DB2
-205 -> Column name not in specified DB22 table
-206 -> Column does not exist in any tabble in the SELECT
-551 -> Not authorized to access DB2
-803 -> Unquie index voilation. Try to iinsert duplicate record.
-805 -> DBRM or PACKAGE not found in PLAAN
-811 -> Cursor should be used , when morre than one row returned as an result of an singleton SELECT query
-818 -> Timestamp mismatch between plan and load module
00 - SUCCESSFUL COMPLETION 02 - DUPLICATE KEY, NON UNIQUE ALT INDEX 04 - READ, WRONG LENGTH RECORD 05 - OPEN, FILE NOT PRESENT 10 - END OF FILE 20 - INVALID KEY VSAM KSDS OR RRDS 21 - SEQUENCE ERROR, ON WRITE OR CHANGING KEY ON REWRITE 22 - DUPLICATE KEY 23 - RECORD NOT FOUND - (when we are trying to access a record with key) or FILE NOT FOUND 35 - OPEN, FILE NOT PRESENT When we will use this code in our program? There are situations where file should be read if exists, write if it does not when you dont know whether file exists are not , first you will open file in I-O mode and check status code. if it is 35 then open that file for output file. other wise you will continue with your logic 41 - OPEN, FILE IS OPEN 42 - CLOSE, FILE IS CLOSED 43 - DELETE OR REWRITE & NO GOOD READ FIRST 46 - SEQUENTIAL READ WITHOUT POSITIONING 47 - READING FILE NOT OPEN AS INPUT/IO/EXTEND 48 - WRITE WITHOUT OPEN IN IO MODE 49 - DELETE OR REWRITE WITHOUT OPEN IN IO MODE 92 - LOGIC ERROR/OPENING AN OPEN FILE OR READING OUTPUT FILE OR WRITE INPUT FILE OR DEL/REW BUT NO PRIOR READ 94 - SEQUENTIAL READ AFTER END OF FILE OR NO CURRENT REC POINTER FOR SEQ 96 - MISSING DD STATEMENT IN JCL 97 - OPEN OK, FILE INTEGRITY VERIFIED When we will use this in our programs? We use this code whenever we open the file, if status code is 00 or 97 we will proceed with our logic, other wise, call error routine. Usaully, it may come when file was not closed. for example IF WS-FILE-STATUS NOT = '00' AND '97' PERFORM ERROR-ROUTINE END-IF.
Mainframe z/os1.9 虚拟机中,在进入系统之后系统不会自动启动CICS和DB2,需要手动启动。 为了验证一下是否启动,首先进入SDSF中,输入/D A,L命令,查看是否有DB2和CICS项,如果没有,证明确实没有启动。 然后输入以下命令:
启动cics /s cicsa
停止cics /c cicsa
启动数据库/-db9g start db2
停止数据库/-db9g stop db2
然后再次输入/D A,L命令,这时,出现了DB2与CICS条目,说明启动成功。
系统关闭
主控台
s shutdown
$pjes2
setrrs shutdown
A load library contains programs ready to be executed. 一个加载库存里面包含着那些准备被调用的程序。
A load library can be any of the following: 加载库可以是下面几种类型
- System library 系统库
- Private library 私有库
- Temporary library. 临时库
System library 系统库
Unless a job or step specifies a private library, the system searches for a program in the system libraries when you code: 假如你没有在编码的时候指明一个私有库, 系统默认在系统库里面寻找这个程序进行调用。 //stepname EXEC PGM=program-name
The system looks in the libraries for a member with a name or alias that is the same as the specified program-name. The most-used system library is SYS1.LINKLIB, which contains executable programs that have been processed by the linkage editor. 系统会根据你提供的程序的名字或者是别名寻找所需要的程序,而最常用的系统库是SYS1.LINKLIB,他包含了那些已经被连接和编译的程序。
Private library 私有库
Each executable, user-written program is a member of a private library. To tell the system that a program is in a private library, the DD statement defining that library can be coded in one of the following ways: 每一个可执行,用户自己编写的程序都是私有库的一个成员,要告诉系统怎么调用这个私有库的程序,可以使用DD语句,方式有如下几种:
- With a DD statement with the ddname JOBLIB after the JOB statement, and before the first EXEC statement in the job.
在EXEC语句的之前,JOB语句之后,用DD语句加上ddname 来编码 - If the library is going to be used in only one step, with a DD statement with the ddname STEPLIB in the step.
假如这个库只在一个作业步中使用,那么可以使用在这个作业部上用 DD语句加上ddname STEPLI 进行编码
To execute a program from a private library, code: 调用一个私有库的程序,编码如下 //stepname EXEC PGM=program-name
When you code JOBLIB or STEPLIB, the system searches for the program to be executed in the library defined by the JOBLIB or STEPLIB DD statement before searching in the system libraries. 当你编写了JOBLIB 或者 STEPLIB,那么系统就会优先搜索那些定义在JOBLIB或者STEPLIB的DD语句的库的同名程序进行调用,假如找不到,系统就会在系统库里面去找
If an earlier DD statement in the job defines the program as a member of a private library, refer to that DD statement to execute the program: 假如用DD语句在JOB的之前的定义了一个私有库,那么就可以用下面的这种方式调用之前定义了的库的程序。
//stepname EXEC PGM=*.stepname.ddname
Private libraries are particularly useful for programs used too seldom to be needed in a system library. For example, programs that prepare quarterly sales tax reports are good candidates for a private library. 私有库在实际使用上是非常有用的,而系统库是很少被使用,例如,用于季度销售税报告的程序就是一个很好的例子。
Temporary library 临时库
Temporary libraries are partitioned data sets created to store a program until it is used in a later step of the same job. A temporary library is created and deleted within a job.
临时库是一个用于存储程序的分区数据集,这个数据集直到同名作业完成后被销毁,一个临时库是由一个作业来创建或者被删除。
When testing a newly written program, a temporary library is particularly useful for storing the load module from the linkage editor until it is executed by a later job step. Because the module will not be needed by other jobs until it is fully tested, it should not be stored in a private library or a system library.
In Figure 1, the LKED step creates a temporary library called &&LOADMOD on the SYSLMOD DD statement. In the GO step, we refer back to the same temporary data set by coding: 当我们在测试一个新编写的程序的时候,临时数据集十分有用,它用于存储来自于连接编辑器的加载模块直至被后面的作业步执行,因为这个模块在其他作业被测试完成时候就不需要了,因此,它不应该被存为私有库或者是系统库,在下面的图1中吗,LKED作业步就创建了一个叫做&&LOADMOD的临时库在名为SYSLMOD的DD语句中,在GO作业步中,我们就引用了这个临时库,代码如下 //GO EXEC PGM=*.LKED.SYSLMOD,....
Figure 1. Compile, link-edit, and execute JCL//USUAL JOB A2317P,'COMPLGO'
//ASM EXEC PGM=IEV90,REGION=256K, EXECUTES ASSEMBLER
// PARM=(OBJECT,NODECK,'LINECOUNT=50')
//SYSPRINT DD SYSOUT=*,DCB=BLKSIZE=3509 PRINT THE ASSEMBLY LISTING
//SYSPUNCH DD SYSOUT=B PUNCH THE ASSEMBLY LISTING
//SYSLIB DD DSNAME=SYS1.MACLIB,DISP=SHR THE MACRO LIBRARY
//SYSUT1 DD DSNAME=&&SYSUT1,UNIT=SYSDA, A WORK DATA SET
// SPACE=(CYL,(10,1))
//SYSLIN DD DSNAME=&&OBJECT,UNIT=SYSDA, THE OUTPUT OBJECT DECK
// SPACE=(TRK,(10,2)),DCB=BLKSIZE=3120,DISP=(,PASS)
//SYSIN DD * inline SOURCE CODE
.
.
code
.
/*
//LKED EXEC PGM=HEWL, EXECUTES LINKAGE EDITOR
// PARM='XREF,LIST,LET',COND=(8,LE,ASM)
//SYSPRINT DD SYSOUT=* LINKEDIT MAP PRINTOUT
//SYSLIN DD DSNAME=&&OBJECT,DISP=(OLD,DELETE) INPUT OBJECT DECK
//SYSUT1 DD DSNAME=&&SYSUT1,UNIT=SYSDA, A WORK DATA SET
// SPACE=(CYL,(10,1))
//SYSLMOD DD DSNAME=&&LOADMOD,UNIT=SYSDA, THE OUTPUT LOAD MODULE
// DISP=(MOD,PASS),SPACE=(1024,(50,20,1))
//GO EXEC PGM=*.LKED.SYSLMOD,TIME=(,30), EXECUTES THE PROGRAM
// COND=((8,LE,ASM),(8,LE,LKED))
//SYSUDUMP DD SYSOUT=* IF FAILS, DUMP LISTING
//SYSPRINT DD SYSOUT=*, OUTPUT LISTING
// DCB=(RECFM=FBA,LRECL=121)
//OUTPUT DD SYSOUT=A, PROGRAM DATA OUTPUT
// DCB=(LRECL=100,BLKSIZE=3000,RECFM=FBA)
//INPUT DD * PROGRAM DATA INPUT
.
.
data
.
/*
//
Quick Start on IKJEFT01 Utility
1) Unload data using DB2 Utility IKJEFT01
2) DB2 BIND using IKJEFT01 Utility
3) Executing DB2 program using IKJEFT01 Utitlity.
1) IKJEFT01 can be used to extract data from db2 tables.
as shown below.
JCL to extract data from db2 tables using IKJEFT01 Utility.
//STEP002 EXEC PGM=IKJEFT01,
// DYNAMNBR=20,COND=(0,NE)
//STEPLIB DD DISP=SHR,
// DSN=SYS.DB2.XXX.RUNXX.LOAD
// DD DISP=SHR,
// DSN=SYS.DB2.XXX.SDSNEXIT
// DD DISP=SHR,
// DSN=SYS.DB2.XXX.SDSNLOAD
//SYSIN DD *
SELECT *
FROM EMP_TABLE
WITH UR;
//*
//SYSTSIN DD *
DSN SYSTEM(XXX) RETRY(20)
RUN PROGRAM(DSNTIAUL) PLAN(DSNTIAUL) PARMS('SQL') -
LIB ('SYS.DB2.XXX.RUNXX.LOAD')
END
/*
//***UNLOAD FILE
//SYSREC00 DD DISP=(NEW,CATLG,DELETE),
// DSN=DEV.UNLOAD.FILE,
// UNIT=SYSDA,SPACE=(CYL,(50,50),RLSE)
//*
//***TABLE STRUCTURE
//SYSPUNCH DD DUMMY
//*
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
|
2) Using IKJEFT01 utility for DB2 BIND
Sample JCL to DB2 BIND
//* DB2 BIND JCL
//*
//BIND EXEC PGM=IKJEFT01,
// COND=(4,LT),
// REGION=4096K
//STEPLIB DD DISP=SHR,
// DSN=XXX4.DB2.XXXX.XXXXLOAD
//DBRMLIB DD DISP=SHR,
// DSN=DEV.SURESH.DBRM(DB2PROG) <--------------- (1)
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM (DEVDB )
BIND MEMBER (DB2PROG) -
PACKAGE (PACKG11) -
LIBRARY ('DEV.SURESH.DBRM') - <---------------- (2)
ACTION (REP) -
ISOLATION (CS) -
VALIDATE (BIND)-
RELEASE (COMMIT) -
OWNER (SURESH) -
QUALIFIER (DEVQUALI)
END
/*
|
(1) & (2) - specify the location of DBRM.
It is a part of cobol db2 compile jcl.. Refer below
***************************************
//DB2COMP (XXX,XXX),'COMPILE JCL', // CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID //******************************************************************** //* COMPILATION, LINK EDIT AND THE BIND STEP FOR A COBOL DB2 PROGRAM * //* WILL BE DONE BY SUBMITTING THIS JOB. * //* THE DB2 REGIONS AND CORRESPONDING PARAMETERS NEEDS TO BE CHANGED * //* WITH RESPECT TO THE PROGRAM * //******************************************************************** //* PRECOMPILE DB2 PROGRAM * //*-------------- LOCATION OF DBRM LIBRARY -------------------------* //******************************************************************** //PC EXEC PGM=DSNHPC, // PARM='HOST(COB2),APOST,SOURCE', // REGION=4096K //DBRMLIB DD DISP=SHR, // DSN=DEV.SURESH.DBRM(DB2PROG) <------------------------ (1) //STEPLIB DD DISP=SHR, // DSN=SYSX.DB2.XXX.XXXXX //******************************************************************** //*SYSIN -----------INPUT COBOL DB2 PROGRAM LOCATION-----------------* //******************************************************************** //SYSIN DD DISP=SHR, // DSN=DEV.SURESH.SRC(DB2PROG) <---------------------- (2) //SYSCIN DD DISP=(MOD,PASS), // DSN=&&TEMP, // SPACE=(800,(500,500)), // UNIT=SYSDA //******************************************************************** //* DCLGEN MEMBER LOCATION * //*SYSLIB-----------------INPUT SOURCE LIBRARY FOR SQL---------------* //******************************************************************** //SYSLIB DD DISP=SHR, // DSN=DEV.SURESH.DCL <---------------------- (3) // DD DISP=SHR, // DSN=DEV.SURESH.CPY //SYSPRINT DD SYSOUT=T //SYSTERM DD SYSOUT=T //SYSUDUMP DD SYSOUT=* //SYSUT1 DD SPACE=(800,(500,500),,,ROUND), // UNIT=SYSDA //SYSUT2 DD SPACE=(800,(500,500),,,ROUND), // UNIT=SYSDA //* //******************************************************************** //* COMPILATION * //******************************************************************** //* //COB EXEC PGM=IGYCRCTL, // COND=(4,LT,PC), // PARM=('SIZE(4000K),BUFSIZE(32760),LIST,LIB,MAP,OBJECT', // 'DATA(31),XREF,RENT'), // REGION=4M //STEPLIB DD DISP=SHR, // DSN=XXXX.XXXXXX //SYSIN DD DISP=(OLD,DELETE), // DSN=&&TEMP //SYSLIN DD DISP=(MOD,PASS), // DSN=&&LOADTMP, // SPACE=(800,(500,500)), // UNIT=SYSDA //******************************************************************** //*--------------SOURCE LIBRARIES FOR COBOL DB2 CODE (COPY LIBRARIES)* //******************************************************************** //SYSLIB DD DISP=SHR, // DSN=DEV.SURESH.DCL <----------------- (4) // DD DSN=DEV.SURESH.CPY,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSUT1 DD SPACE=(800,(500,500),,,ROUND), // UNIT=SYSDA //SYSUT2 DD SPACE=(800,(500,500),,,ROUND), // UNIT=SYSDA //SYSUT3 DD SPACE=(800,(500,500),,,ROUND), // UNIT=SYSDA //SYSUT4 DD SPACE=(800,(500,500),,,ROUND), // UNIT=SYSDA //SYSUT5 DD SPACE=(800,(500,500),,,ROUND), // UNIT=SYSDA //SYSUT6 DD SPACE=(800,(500,500),,,ROUND), // UNIT=SYSDA //SYSUT7 DD SPACE=(800,(500,500),,,ROUND), // UNIT=SYSDA //* //* //******************************************************************** //* LINK EDIT * //******************************************************************** //* //LKED EXEC PGM=IEWL, // COND=((4,LT,COB),(4,LT,PC)), // PARM='XREF' //SYSLIB DD DISP=SHR, // DSN=SXXX.SXXXXXXX // DD DISP=SHR, // DSN=XXXX.DB2.XXX.XXXXLOAD // DD DISP=SHR, // DSN=SYS1.VSCLLIB //SYSLIN DD DISP=(OLD,DELETE), // DSN=&&LOADTMP //* DD DDNAME=SYSIN //******************************************************************** //*----------------LOCATION OF LOAD LIBRARY--------------------------* //SYSLMOD DD DISP=SHR, // DSN=DEV.SURESH.LOADLIB(DB2PROG) <------------ (5) //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSUT1 DD SPACE=(1024,(50,50)), // UNIT=SYSDA //* //******************************************************************** //* BIND - BIND THE DB2 PACKAGE * //******************************************************************** //BIND EXEC PGM=IKJEFT01, // COND=(4,LT), // REGION=4096K //STEPLIB DD DISP=SHR, // DSN=XXX4.DB2.XXXX.XXXXLOAD //DBRMLIB DD DISP=SHR, // DSN=DEV.SURESH.DBRM(DB2PROG) <--------------- (6) //SYSPRINT DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSTSIN DD * DSN SYSTEM (DEVDB ) BIND MEMBER (DB2PROG) - PACKAGE (PACKG11) - LIBRARY ('DEV.SURESH.DBRM') - <---------------- (7) ACTION (REP) - ISOLATION (CS) - VALIDATE (BIND)- RELEASE (COMMIT) - OWNER (SURESH) - QUALIFIER (DEVQUALI) END /* **************************** Bottom of Data **************************** (1) - When we precompiled, precompiler will create the DBRM, it will be placed in the pds specified here.
(2) - Location of COBOL-DB2 program (3) - Needs to speficiy DCLGEN member locations (4) - Needs to specify DCLGEN and COPYBOOK locations here (5) - Load module location, load module will be created here. this location needs to be given in run jcl. (5) & (6) - specify the location of DBRM, ( same location used in step1 ).
***************************************
3) Using IKJEFT01 utility for executing cobol db2 program.
Sample JCL to execute IKJEFT01 utility to run COBOL DB2 program.
//** COBOL DB2 RUN JCL
//STEP01 EXEC PGM=IKJEFT01,
// DYNAMNBR=20
//*
//STEPLIB DD DISP=SHR,
// DSN=SYSL.DB2.DEV.XXXXLOAD
// DD DISP=SHR,
// DSN=SYSL.DB2.DEV.XXXXYYYY
//*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DEVDB)
RUN PROGRAM(DB2PROG) -
PLAN(PLAN11111) -
LIBRARY('DEV.SURESH.LOADLIB')
END
/*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
//*
//* COBOL DB2 RUN JCL ENDS
|
|