Professional Documents
Culture Documents
INTRODUCTION TO VSAM
VSAM stands for Virtual Storage Access Method, is IBM high performance access method which allows you to
access files of different organization such as sequential, indexed, relative record and linear datasets.
Features of VSAM
VSAM is one coherent file storage system used to store and retrieve data. It is not a database management
system like IDMS or DB2. It does not provide for relationships among the data. The existing databases like IMS
or DB2 may be implemented using VSAM.
VSAM is not a programming language. But you can access VSAM dataset through programming languages like
COBOL or PL/I. It is not a communication system like VTAM or CICS. It has no equivalent for a ‘PDS’ type of
file organization.
Advantages of VSAM
Provides protection of Data against unauthorized access through password facility.
Cross-system (MVS & VSE) Cmpatibility. VSAM datasets can be imported and imported in MVS and VSE
systems.
Device Independence (Access Via Catalog). The application programmer need not be concerned with Block
size ,volume and other control information, as access to VSAM dataset it always through the Catalog and all
control information are stored in the catalog entry of the dataset.
IDCAMS commands can be included in JCL to handle VSAM datasets
Clusters
VSAM files are often called clusters. A cluster is the set of catalog entries that represent a file. A cluster consists
of one or two components. All VSAM datasets consist of a data component in which data records are placed.
For KSDS, there is an additional index component, which contains the indexes used to access records in the data
component. ESDS RRDS and LDS have data component only and no index component
VSAM clusters are categorized into 4 type’s b
ased on the way we store and access the records:
These are sequential datasets that can be read in the sequence in which they were created. Records can be added
only to the end of the dataset.
These datasets are stored in sequence of some key field in the record. The data component and index component
are separated. The keys are stored in a separate index and records are accessed through the index. Individual
records can be accessed randomly on the basis of the record key. Locating the record is a two stage process.
LDS Linear dataset. These datasets consist of a stream of bytes which are accessed and written as
4k blocks accessed by Relative Byte Address
VSAM history
1
VSAM was introduced in 1973. This version had only Entry Sequence Datasets and Key Sequenced Datasets. In
1975 Relative Record Datasets and alternate indexes for KSDS was added. In 1979 DF/EF VSAM was
introduced with Integrated Catalog Facility (ICF).
DFP/VSAM Ver. 1 was introduced in 1987 to run under the MVS/XA architecture. DFP/VSAM version 2
introduced Linear Datasets (LDS)
2. VSAM Catalogs
VSAM is totally catalog-driven. Catalogs are special purpose files residing on DASD (Direct Access Storage
Device) serving as a central repository for information about all datasets under its control.
• Master catalog
• User catalog
There’s only one Master catalog per system. The entries in the master catalog may point to VSAM or non-
VSAM dataset, user catalogs, system datasets or other objects.
User catalogs contain same type of information as master catalog. All user catalogs must be cataloged into
master catalog.
Access to a dataset can only be made through a master or user catalog. Therefore all VSAM datasets have to be
cataloged. Non-VSAM datasets can also be cataloged. Catalogs are protected by RACF.
MASTER CATALOG
USER
USER USER USER USER
CATALOG CATALO
CATALOG CATALOG CATALOG
G
Vsam catalog
Catalogs maintain the following information
• Name and physical location of datasets
• password information required to access protected datasets
• Statistics about datasets Example No. of records added, read, deleted or no. of Control Interval/Control
Area splits
• Information about dataset itself Example ESDS, KSDS, RRDS, CSIZE, KEYLENGTH
• Location of catalog recovery area
Vsam records
VSAM records can be fixed or variable length. Records can also be spanned
Vsam space allocation
VSAM space allocation depends on whether the dataset is cataloged in an ICF or the older VSAM type catalog.
For VSAM datasets cataloged in the newer ICF-type catalogs, dedicated space is allocated dynamically when
the cluster is created with the DEFINE CLUSTER command
2
Each VSAM dataset cataloged in an ICF catalog has its own VTOC entry. These VSAM datasets can have 1
primary and 122 secondary allocation unlike OS dataset which can have only 1 primary and 15 secondary
extends on a volume.
Sub Allocation
Once the space has been allocated, VSAM has complete control over subsequent allocations within that space.
Within that space, VSAM can create suballocated files. Whenever a suballocated files need to be created,
extended or deleted, VSAM uses it own space management facilities.
Unique Allocation
Alternatively an entire VSAM space can be allocated to single VSAM file. In that case allocation for the file
called UNIQUE file, is managed by DADSM rather than by VSAM. Allocation information for the unique files
is maintained in two places : the VSAM catalog entry for the file and the VTOC entry for the space that contains
unique file.
The figure below shows two DASD volumes. The first volume has a VSAM dataspace contains two sub-
allocated files. Notice that there’s unused space within the dataspace too. However, that space is not available to
non-VSAM files because it’s already under VSAM’s control. The second DASD volume contains two unique
VSAM datasets. All of the unused space on the volume is available to both VSAM and Non-VSAM datasets.
Under VSE/VSAM & OS/VS VSAM most VSAM datasets are sub-allocated. Under ICF, there is no VSAM
space. All VSAM files are Unique
VOLUME 1 VOLUME II
Non-VSAM
Non-VSAM
File I
control
VSAM’s
under
datasets
VSAM
File III
VSAM
uniqu
file
e
Available Space
Non-VSAM
File II
File IV
Available Space
Non-VSAM
Non-VSAM
Control Interval
A control interval is the unit of data VSAM transfers between virtual and disk storage. It is similar to the
concept of blocking in non-VSAM files. Each control interval can contain more than one logical record.
The size of CI must be between 512 bytes to 32K. Upto 8K bytes it must be multiple of 512, beyond this it is
multiple of 2K. The length of the CI is specified at file creation time.
For index component, the size of CI is 512, 1K, 2K or 4K bytes.
3
A Control Inverval consists of records, free space and control field information as shown below
In th Control Interval shown above Rec1, Rec2, Rec3 are records. Free Space is where new records can be
inserted.
CF
RDF CIDF
Control Interval Descriptor Field(CIDF) contains information about available space within CI. Record
Descriptor Field (RDF) contains the length of each record and how many adjacent records are of the same
length. There’s one RDF for each record in variable length records.
There will be only two RDFs per CI in case of fixed length files. One RDF specifies the length of the record and
the second RDF specifies how many records are there in the CI. Each RDF is of 3 bytes .
VSAM groups control intervals into contiguous, fixed length areas of storage called Control Areas. Maximum
size of a CA is 1 cylinder. You can also specify freespace in CA. The total number of CI/CA in a Cluster is
determined by VSAM.
CONTROL AREA
CONTROL INTERVAL
CONTROL INTERVAL
CONTROL INTERVAL
CONTROL INTERVAL
CONTROL INTERVAL
Spanned Records
Spanned records are records larger than the specified CI size. That is they span more than one CI. So one
spanned record may be stored in several CIs.
Each CI that contains a record segment of a spanned record has two RDFs. The right RDF gives the length of
the segment and the left gives the update number of the segment. Spanned records can exist only in ESDS and
KSDS.
A CI that contains a record segment of a spanned record contains no other data. Records can span Control
Intervals but not Control Areas. For KSDS the entire key field of the spanned record must be in the first Control
Interval.
Logical Record 1
Record1 RC
Record1 RC Record1 RC
Segment2 Segment3
Segment1
4
Figure 3.4 Spanned Record
ESDS
ESDS is a sequential dataset. Records are retrieved in the order in which they are written to the dataset.
Additions are made always at the end of the file. Records can be retrieved randomly by using RBA(Relative
Byte Address). RBA is an indication of how far, in bytes, each record is displaced from the beginning of the file.
KSDS
In Key Sequenced Datasets logical records are placed in the dataset in the ascending collating sequence by the
key field.
Rules for key
• Key must be unique in a record
• Key must be in same position in each record and key data must be contiguous
• When a new record is added to a dataset it is inserted in its collating sequence by key
A KSDS consists of two components index component and data component
DATA Component :- Contains control areas which in turn contains Control Intervals as shown in
5
Figure 3.5
Control Areas
KSDS Structure
Index Set
Sequence Set
CI CI CI CI
Index Set
Index
component
Sequence Set Sequence Set
CI CI CI CI CI CI CI CI
6
CA1 CA2
New
Record
After Inserting
New
Record
Full
Control Interval
Rec1 Rec2 Rec3 Rec4 Rec5 US CF
FSPC US CF
EMPT|Y CI
7
I 0 K 100
Sequence Set New
Record
0
RecordJ RecordK FSPC US CF
100
FSPC US CF
200
Figure 3.11a Effect of Control Interval Split on Sequence Set
E 0 I 200 K 100
8
• DEFINE
• MODAL COMMANDS
IF
SET
PARM
• BUILDINDEX
• REPRO
• DELETE
• VERIFY
• IMPORT/EXPORT
• ALTER
• LISTCAT
The example 4.1 shown below is a skeleton JCL for executing IDCAMS commands. The PGM parameter
specifies that the program to be executed is IDCAMS utility program . The statements that follow SYSIN DD *
are IDCAMS commands. The end of data is specified by /*.
Optionally JOBCAT and STEPCAT statements may be coded to indicate catalog names for a job/step, in which
concerned dataset may be cataloged
9
Every IDCAMS command starts with a verb followed by object which takes some parameters. In the code
listing 4.2 DEFINE is the verb CLUSTER is the object which takes a dataset
DA0001T.LIB.KSDS.CLUSTER as parameter
DEFINE CLUSTER -
NAME(DA0001T.LIB.KSDS.CLUSTER) -
CYLINDERS(5, 1) -
VOLUMES (BS3013) -
INDEXED -
)
Comments:
Condition code:
The condition codes are stored in LASTCC/MAXCC. LASTCC stores the condition code for the
previous command and MAXCC stores the maximum code returned by all previous commands. Both
LASTCC and MAXCC contain zero by default at the start of IDCAMS execution. You can check the
condition code of the previous command and direct the flow of execution or terminate the JCL.
Syntax of IF statement
IF LASTCC/MAXCC
comparand VALUE -
THEN -
command
ELSE
Command
Comparand(s) are : EQ/NE/GT/LT/GE/LE
Hyphen is required after then to indicate the continuation of the command on the next line . Comment is
assumed as null command . ELSE is optional. LASTCC and MAXCC values can be changed using the SET
command.
Note : LASTCC and MAXCC can also be set to any value between 0-16
e.g.
SET LASTCC = 4
Setting MAXCC has no effect on LASTCC. Setting LASTCC changes the value of MAXCC, if LASTCC is set
to a value larger than MAXCC. Setting MAXCC = 16 terminates the job
10
.........
REPRO INFILE (INDD) -
OUTFILE (OUTDD)
................
IF LASTCC EQ 0 -
THEN -
PRINT OUTFILE (INDD)
ELSE
PRINT INFILE (OUTDD)
IF MAXCC LT 4 -
THEN -
DO
/* COMMENT */
Command
Command
END
ELSE
Command
DEFINE CLUSTER
Clusters are created and named with the DEFINE CLUSTER command.
//INPUT DD DSN=DA0004T.LIB.KSDS.CLUSTER,DISP=SHR
The high-level qualifier is important because in most installations this technique ensures that VSAM datasets
are cataloged in the appropriate user catalog.
11
RECORDS(Pri Sec)
KILOBYTES(Pri Sec)
MEGABYTES(Pri Sec)
Primary : Number of units of primary space to allocate. This amount is allocated once when the dataset is
created
Secondary : Number of units of secondary space to allocate. This amount is allocated a maximum of 122 times
as needed during the life of the dataset. VSAM calculates the control area size for you. A control area size of
one cylinder usually yields best performance. To ensure control area size of one cylinder you must allocate
space in CYLINDERS.
Allocating space ine RECORDS must be avoided as this might result in an inefficient Control Area size.
Format :
VOLUMES(volser) or VOLUMES(volser ........ volser)
Example :
VOLUMES(BS3011)
VOLUMES(BS3011 BS3040 BS3042)
You can store the data and index (in case of KSDS clusters) on separate volumes as this may provide a
performance advantage for large dataset
The Recordsize parameter
This parameter tells VSAM what size records to expect. The avg and max are average and maximum
values for variable length record. If records are of fixed length, avg and max should be the same.
Format:
RECORDSIZE(avg max)
avg : Average length of records
max : Maximum length of records
e.g. :
RECORDSIZE(80 80) [Fixed Length records]
RECORDSIZE(80 120) [Variable Length records]
RECORDSIZE can be assigned at the cluster or data level
Note :
This is an optional parameter, if omitted default is RECORDSIZE(4086 4086)
12
LINEAR :- Specifies a LINEAR dataset
DEFINE CLUSTER -
(NAME(DA0001T.LIB.ESDS.CLUSTER) -
NONINDEXED -
RECORDSIZE(125 125) -
RECORDS(100 10) -
NONSPANNED -
VOLUMES (BS3013) -
REUSE - ) -
DATA(NAME(DA0001T.LIB.ESDS.DATA))
Format :
DATA(NAME(dataname) Parameters)
dataname :- The name you choose to name the data component
Format :
INDEX(NAME(indexname) Parameters)
indexname : The name you choose to name the index component
INDEX(NAME(DA0004T.LIB.KSDS.INDEX))
When you code the DATA and INDEX parameters, you usually coda a NAME parameter for them. If you omit
the NAME parameter for DATA and INDEX , VSAM appends .DATA or .INDEX as the low-level qualifier.
Format :
KEYS(length offset)
length : length in bytes of the primary key
offset : Offset in bytes of the primary key with records (0 to n)
13
Example :
KEYS(8 0)
VSAM records begin in position zero
Note :
Default is KEYS(64 1) [Key is in bytes 2 thru 65]
//DA0001TA JOB LA2719, PCS,MSGLEVEL=(1,1),
// MGCLASS=A,NOTIFY=DA0001T
// * Delete/Define Cluster for KSDS VSAM Dataset
//*
//STEP1 EXEC PGM=IDCAMS
// SYSPRINT DD SYSOUT=*
// SYSIN DD *
DELETEDA0001T.LIB.KSDS.CLUSTER
DEFINE CLUSTER(
NAME(DA0001T.LIB.KSDS.CLUSTER) -
INDEXED -
KEYS(4 0) -
FSPC(10 20) -
RECORDSIZE(125 125) -
RECORDS(100 10) -
NONSPANNED -
VOLUMES (BS3013) -
NOREUSE - )-
DATA(NAME(DA0001T.LIB.KSDS.DATA)) INDEX(NAME(DA0001T.LIB.KSDS.INDEX))
/*
Format :
FREESPACE(%CI %CA)
Format :
REUSE|NOREUSE
Some application call for temporary dataset or workfile that must be created, used and deleted each time the
application runs. To simplify these applications, VSAM lets you create reusable files. The reusable file is a
standard VSAM KSDS, ESDS or RRDS. The only difference is that, if you open an existing reusable file for
output processing, VSAM treats the file as if were empty. Any records already present in the file are ignored.
14
Format :
CISZ(bytes)
Example :
CISZ(4096)
Note : If omitted VSAM calculates CISZ based on record size.
Remark : Control Interval is VSAM’s equivalent of a block and it is the unit of data that is actually transmitted
when records are read or written.
ESDS is processed sequentially, so the CISZ should be relatively large, depending on the size of the record. For
sequential processing with larger records you may choose a CISZ of 8k
For datasets processed randomly as well as sequentially (for backup at night) choose a CISZ for random
processing and then allocate extra buffers for sequential processing with the AMP JCL parameter.
RRDS is usually processed randomly, so the CISZ should be relatively small, depending on the size of the
record.
SHAREOPTIONS
This parameter tells VSAM whether you want to let two or more jobs to process your file at the same time. It
specifies how a VSAM dataset can be shared
Format :
cr value : Specifies the value for cross region sharing. Cross region sharing is defined as different jobs running
on the same system using Global Resource Serialization(GRS), a resource control facility available only under
MVS/XA and ESA
cs value : Specifies the value for cross system sharing means different jobs running on different system in a
NONGRS environment
Values :-
• multiple read OR single write
• multiple read AND single write
• multiple read AND multiple write
Default :- SHAREOPTIONS(1 3)
5. LISTCAT
LISTCAT’s basic function is to list information about VSAM and NONVSAM objects. With LISTCAT you can
also view password and security information, usage statistics, space allocation information, creation and
expiration dates etc.
Format 1:
15
ENTRIES (ENT) requires you to specify each level of qualification, either explicitly or implicitly, using an
asterisk as a wild card character.
Examples:
LISTCAT
ENT(DA0001T.VSAM.KSDS.CLUSTER) -
CLUSTER -
ALL -
LISTCAT
ENT(DA0001T.VSAM.KSDS.CLUSTER) -
DATA -
ALL -
LISTCAT
ENT(DA0001T.VSAM.KSDS.CLUSTER) -
ALL
Format 2:
Example
The above will list all entries with DA0001T as high level qualifier , anything in the second-level qualifier and
KSDS in the third-level qualifier . That is it would list DA0001T.ABC.KSDS and DA0001T.TEST.KSDS.AIX,
DA0001T.TEST.KSDS.DATA .
16
To execute LISTCAT from TSO prompt
LISTCAT ENTRIES (LIB.KSDS.CLUSTER) ALL
If you analyze the output of the LISTCAT command there is ALLOCATION information which shows two
fields HURBA and HARBA.
High-Used-RBA (HURBA)points to the end of the data. High-Allocated-RBA (HARBA)is the highest byte that
can be used.
HIGH-ALLOC-RBA indicates the Relative Byte Address(plus 1) of the last allocated data control area. This
value reflects the total space allocation for the data component.
HIGH-USED-RBA indicates the Relative Byte Address(plus 1) of the last used data control area. This value
reflects the portion of the space allocation that is actually filled with data records.
There are actually to HURBAs one in the VSAM control block of the cluster and one in the catalog entry for
the cluster.
You can write application programs (in COBOL, PL/I Assembler Language, in CICS) and use the statements
provided by these languages to write and read VSAM datasets
VSAM cluster
HARBA
Data space
allocated
but empty
HURBA
Data space
loaded with
records
An Alternate Index AIX provides a view of data different from the one offered by the primary key. For
example for a KSDS dataset Employee, you may have a Record Key index on Employee-no and an Alternate
Index on Employee-Name . You can now browse and even update the same KSDS in logical sequence by
Employee-Name.
Alternate Indexes may be defined on one or more than one Alternate Key(s) i.e. Field(s) other than primary key.
Alternate Key(s) need not be unique. Each alternate index itself is a KSDS with data and index component.
Alternate Index greatly reduces redundancy. There is no need to keep a separate dataset for different views like
Employees’ Social Security No. The records may be accessed sequentially or randomly based on the alternate
record keys.
Alternate Indexes do not support a reusable base cluster. So NOREUSE which is the default, should be
specified.
Too many Alternate Indexes built on a KSDS may lead to performance Degradation as access by alternate key
requires twice as many I/O’s . VSAM first locates the primary key from the alternate index and then locates the
Control Interval information from the record key index.
For ESDS, VSAM builds AIX by mapping one field to the record’s RBA.
17
Steps for defining and building alternate indexes:
RELATE Parameter
Format:
RELATE(base cluster name)
This parameter establishes the relationship between the base cluster and the alternate index via the use of the
base cluster name. It is unique to the DEFINE AIX command, and it is required.
Format:
RECORDSIZE(avg max)
This parameter specifies the average and maximum length of each alternate index record. There are two types of
alternate indexes.
KSDS unique alternate index: You can create a unique alternate index by specifying the UNIQUEKEY
parameter. The records of unique alternate indexes are of fixed length. The length of a unique alternate index
built over a KSDS is derived as follows:
For example if an unique alternate index on Soc-Sec-No is built on our KSDS cluster Employee then the
RECORDSIZE will be calculated as follows:-
5 Bytes fro HouseKeeping + size of alternate key + Size of Primary Key that the alternate
= 5 + 9 + 8 = 22
KSDS non-unique alternate index: An alternate index created with a NONUNIQUEKEY parameter has variable
length records. The RECORDSIZE is calculated as follows:-
Avgerage Record length = 5 bytes for House Keeping + size of the alternate key + size of the primary key x
average no of records the alternate index key can point to
Maximum Record length = 5 bytes for House Keeping + size of the alternate key + size of the primary key x
maximum no of records the alternate index key can point to
Define an Alternate Index Path using the IDCAMS DEFINE PATH command. The path forms a connection
between the alternate index and the base cluster. Path name becomes a catalog entry but path does not contain
any records. The path name is specified in the JCL for applications that access records via the alternate index.
UPDATE vs NOUPDATE
Records may be accessed by applications by the alternate index path alone, without opening the base cluster. In
such cases any changes made to data will be reflected in the alternate index records if the UPDATE option is
specified. If NOUPDATE is specified then the alternate index records will not be automatically updated.
UPGRADE specifies that any changes made in the base cluster records will be reflected immediately in the
alternate index records if the base cluster is opened in the application. Fortunately UPGRADE and UPDATE are
defaults for their respective commands.
19
Building Alternate Indexes
The final step in creating an alternate index is to actually build and populate it with records.
The BLDINDEX command does the following:
• The data component of the base cluster is read sequentially and pairs of key pointers are extracted.
These pairs consist of the alternate key field and its corresponding primary key field. VSAM creates a
temporary file with these records.
• This temporary file is sorted in ascending alternate key sequence.
• If NONUNIQUEKEY option is specified then a merge operation takes place, which will merge all
records with the same alternate key into a single record.
• These records are the data component of the Alternate Index. VSAM now constructs the index
component just as it does for the KSDS.
Note: The Alternate Index can be built only after the base cluster has been both defined and loaded with atleast
1 record.
Disposition of base cluster is DISP=OLD as the BLDINDEX needs absolute control of the base cluster.Output
dataset can be Alternate index cluster or pathname
The INTERNALSORT uses virtual storage whereas EXTERNAL SORT uses disk space. INTERNALSORT is
the default. If you want an external sort to be performed then include IDCUT1 and IDCUT2 DD statements in
your JCL and specify EXTERNALSORT in the BLDINDEX command.
DEFINE Cluster
(NAME(DA0001T.LIB.KSDS.CLUSTER)
.
)
DEFINE AIX
(NAME(DA0001T.LIB.KSDS.AUTHNAME.AIX) RELATE(DA0001T.LIB.KSDS.CLUSTER)
.
)
DEFINE PATH (NAME(DA0001T.LIB.KSDSK.AUTHNAME.PATH)
PATHENTRY(DA0001T.LIB.KSDS.AUTHNAME.AIX)
.
)
BLDINDEX
INDATASET(DA0001T.LIB.KSDS.CLUSTER)
OUTDATASET(DA0001T.LIB.KSDS.AUTHNAME.AIX)
.
20
)
Format :
REPRO
INFILE(ddname) | INDATASET(dsname) -
OUTFILE(ddname) | OUTDATASET(dsname) -
SKIP and COUNT parameters. SKIP specifies the number of input records to skip before beginning to copy.
COUNT specifies the number of output records to copy. You can specify both. For example skip 10 records and
copy next 10
//DD1 DD DSN=DA0001T.INPUT.KSDS,DISP=OLD
//DD2 DD DSN=DA0001T.OUTPUT.KSDS, DISP=OLD
//SYSINDD *
REPRO -
INFILE(DD1) -
OUTFILE(DD2) -
FROMKEY(A001) -
TOKEY(A069)
21
Example 7.1 JCL for Loading Dataset:
FROMADDRESS (RBA)
TOADDRESS(RBA)
FROMNUMBER (RRN)
TONUMBER(RRN)
COUNT (NO.)
SKIP(NO)
//JOBNAME DA0001TA…
//STEP10 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT = *
//DD2 DD DSN=DA0001T.KSDS.INV.BACKUP(+1),
// DISP=(NEW,CATLG,DELETE),UNIT=TAPE,
// VOL=SER=32970,LABEL=(1,SL),
// DCB=(RECFM=FB,LRECL=80)
//SYSIN DD *
REPRO
INDATASET(DA0001T.KSDS.INV.CLUSTER) –
OUTFILE(DD2)
/*
//
In the example above INDATASET is the input file and DD2 is the output tape dataset which is a part of the
GDG while is more or less like a physical sequential file. (Ref to chapter 10 for more on GDG’s )
When you DELETE-DEFINE-REPRO a VSAM dataset it has the following effects on the KSDS.
• The dataset is reorganized that is the Control Interval and Control Area splits are eliminated
• Free space is redistributed throughout the dataset as specified in the FREESPACE parameter.
• Primary index is rebuilt, however the DELETE command deletes the base cluster as well as its indexes.
So the alternate indexes have to be redefined
ESDS or RRDS need not be reorganized because the record position is fixed permanently by sequence of entry
or record number.
//DD1 DD DSN=DA0001T.LIB.KSDS.BACKUP(0),
// DISP=OLD, UNIT=TAPE,LABEL=(1,SL)
//SYSIN DD *
22
DELETE DA0001T.LIB.KSDS.CLUSTER
/* DEFINE CLUSTER NAME(DA0001T.LIB.KSDS.CLUSTER) -
INDEXED -
KEYS(4 0) -
RECORDSIZE(80 80) -
VOLUMES(BS3013) -
) -
DATA(NAME(DA0001T.LIB.KSDS.DATA)) -
INDEX(NAME(DA0001T.LIB.KSDS.INDEX))
REPRO -
INFILE(DD1) -
OUTDATASET(DA0001T.LIB.KSDS.CLUSTER)
/*
The REPRO command can also be used to merge two datasets into one. The target dataset can be a nonempty
KSDS, ESDS or RRDS. If the target dataset is an ESDS, the merged records are added to the end of the
existing dataset.
EXPORT/IMPORT Commands
The EXPORT/IMPORT commands can be used for backup and recovery . You can export a dataset, alternate
index or a catalog to a different system.
Disadvantages:
Exported data cannot be processed until Imported
Can be used only for VSAM dataset
EXPORT
FORMAT :
Optional parameters
Example :
EXPORT DA0001T.LIB.KSDS.CLUSTER -
OUTFILE(DD2)
23
IMPORT
Format :
IMPORT -
INFILE(ddname) | INDATASET(dsname) -
OUTFILE(ddname) | OUTDATASET(dsname) -
Optional parameters:
VERIFY
24
Format :
VERIFY FILE(ddname/passwd)
or
VERIFY DATASET(entryname/passwd)
VERIFY entryname/passwd (TSO)
VERIFY DATASET(DA0001T.LIB.KSDS.CLUSTER)
Remark :
VERIFY can be issued from a TSO or within a JCL statement.
It is valid only for VSAM dataset except LDS.
DELETE
- logically deletes dataset
- catalog entry deleted
Format :
DELETE entryname/passwd -
optional parameters
DELETE DA0001T.LIB.KSDS.CLUSTER -
ERASE
Example 8.2 Deleting a Cluster
Format 1 :
PRINT INDATASET (entryname/passwd) -
Format 2 :
PRINT INFILE (ddname/passwd) -
25
parameters like REPRO are available
Options
• CHAR | DUMP | HEX
• COUNT (number)
• FROMADDRESS, [TOADDRESS]
• FROMKEY, [TOKEY]
• FROMNUMBER, [TONUMBER]
• OUTFILE (ddname)
• SKIP (number)
ALTER
Options :
• ADDVOLUMES (volumes)
• AUTHORIZATION(entry string)
• BUFFERSPACE (size)
• ERASE | NOERASE
• FREESPACE(ci% ca%)
• MASTERPW(password)
• NEWNAME(newname)
• READPW (password)
• SCRATCH | NOSCRATCH
• SHAREOPTIONS
• (cross region cross system)
• TO(date) |FOR(days)
• UPDATE | NOUPDATE
• UPDATEPW(password)
• UPGRADE | NOUPGRADE
26
The ORDERED Parameter tells VSAM to assign the KEYRANGES values to the volumes, one by one, in the
order in which the KEYRANGES and VOLUMES are specified.
Format :
ORDERED | UNORDERED
Example :
KEYRANGES( (0001 1000) -
(1001 2000) -
(2001 3000)) -
VOLUMES (BS3013 -
BS3014 -
BS3001)
Note : When you code ORDERED, you must code the same no. of VOLUMES as KEYRANGES.
Format :
REPLICATE | NOREPLICATE
Example :
INDEX(NAME(DA0001T.LIB.KSDS.INDEX) -
IMBED -
REPLICATE -
)
Format :
MASTERPW(password)
Allows the highest level of access to all cluster components, including DELETE and ALTER authority
Format :
UPDATEPW(password)
Format :
READPW(password)
27
Note : Valid only for KSDS, ESDS, RRDS.
Passwords are initially specified in the DEFINE
CLUSTER
Example :
MASTERPW(TRGDEPT)
At the execution time, a password can be coded explicitly in the PASSWORD clause of a COBOL SELECT
clause
AUTHORIZATION provides additional security for a VSAM cluster by naming and assembler user verification
routine (USVR).
Format :
AUTHORIZATION (entry-point password)
Example :
AUTH(MYRTN ‘TRGDEPT’)
ALTER -
DA0001T.LIB.KSDS.CLUSTER -
NEWNAME(A2000.MY.CLUSTER)
The following attributes are unalterable. You have to DELETE the cluster and redefine it with new attributes.
CISZ
Cluster type,
IMBED/REPLICATE
REUSE | NOREUSE
Although there are many different uses for sequential datasets, many sequential files have one characteristics in
common : they are used in cyclical application
28
for example, sequential dataset that contains transaction posted daily against a master file is cyclical; each days
transactions, along with the processing required to post them, from one cycle. Similarly a sequential dataset
used to hold the backup copy of a master file is cyclical too; each time a new backup copy is made, new cycle is
begun.
In most of the cyclical applications, it’s good idea to maintain versions of the files used for several cycles. That
way if something goes wrong, you can recreate the processing that occurred during previous cycles to restore
the affected files to a known point. Then the processing can continue from that point
For this MVS provides a facility called generation data group, GDG is a collection of two or more
chronologically related versions of the same file. Each version of the file or member of the GDG, is called a
generation dataset. A generation dataset may reside on tape or DASD. It is generally sequential (QSAM) or
direct(BDAM) file. ISAM and VSAM files can’t be used in GDGs.
As each processing cycle occurs a new generation of dataset is added to the generation data group. The new
version becomes the current generation; it replaces the old current generation, which becomes a previous
generation.
Figure above is the structure of a generation data group. There are 3 previous generations, note that generations
are numbered relative to the current generation, file.c1(0).
Relative generation numbers are adjusted when each processing cycle completes, so that the current generation
is always referred to as relative generation 0.
MVS uses the generation data group’s catalog entry to keep track of relative generation numbers. As a result,
GDGs must be cataloged and each generation dataset that’s a part of the group must be cataloged too.
When you create a generation data group’s catalog entry, you specify how many generations should be
maintained Example: You might specify that five generations including the current generation should be
maintained. Then during each processing cycle, the new version of the file becomes the current version.
Although MVS lets you use relative generation numbers to simplify cyclical processing, MVS uses “Absolute
Generation Numbers” in the form GnnnnV00 to identify each generation dataset uniquely. GnnnnV00
represents the chronological sequence number of the sequence number of the generation, beginning with G0000.
V00 is a version number, which lets you maintain more than one version of a generation. Each time a new
generation dataset is created, mvs adds one the sequence number. The sequence and version numbers are stored
as a part of the file’s dataset name, like this:
filename.GnnnnV00
35 chars 9 chars
// IN DD DSN=DA0002T.MASTER, DISP=SHR
// OUT DD DSN=DA0002T.MASTER.DAY(+1),
DISP= (NEW,CATLG,DELETE),
UNIT=3390, VOL=SER=BP0031,
SPACE= (CYL,(10,5),RLSE),
DCB=(PROD.GDGMOD,
BLKSIZE=23440,LRECL=80,RECFM=FB)\
29
Relative Name and Absolute Name
//DA0003TA JOB
//UPDATE EXEC PGM=PAY3200
//OLDMAST DD DSN=MMA2.PAY.MAST(0),DISP=OLD
//NEWMAST DD DSN=MMA2.PAY.MAST(+1),
DISP= (NEW,CATLG),UNIT=3300,
VOL=SER=BS3001,
DCB=(LRECL=80,BLKSIZE=1600)
//PAYTRAN DD DSN=MMA2.PAY.TRAN,DISP=OLD
//PAYLIST DD SYSOUT=*
//REPORT EXEC PGM=PAY3300
//PAYMAST DD DSN=MMA2.PAY.MAST(+1),DISP=OLD
//PAYRPT DD SYSOUT=*
//JOB1 JOB
//UPDATE EXEC PGM=PAY3200
//OLDMAST DD DSN=MMA2.PAY.MAST(0),DISP=OLD
//NEWMAST DSN=MMA2.PAY.MAST(+1),
DISP=(NEW, CATLG), UNIT=3300,
VOL=SER=BS3001,
DCB=(LRECL=80, BLKSIZE=1600)
//PAYTRAN DD DSN=MMA2.PAY.TRAN,DISP=OLD
//PAYLIST DD SYSOUT =*
//JOB2 JOB ...........
//REPORT EXEC PGM=PAY3300
//PAYMAST DD DSN=MMA2.PAY.MAST(0),DISP=OLD
//PAYRPT DD SYSOUT=*
GDG’s are a
group of datasets which are related to each other chronologically and functionally.
Generations can continue until a specified limit is reached. The LIMIT parameter
specifies total number of generations that can exist at any one time.
Once limit is reached the oldest generation is deleted.
30
GDG Index
have to be created using the IDCAMS command ‘DEFINE GDG’ before datasets that are to be included in
them can be made a part of them.
Model containing parameter information of the datasets to be included in the GDG has to be specified.
All datasets within a GDG will have the same name. Generation number of a dataset, within a GDG is
automatically assigned by OS when created. Datasets within a GDG can be referenced by their relative
generation number. Generation 0 always references current generation
Creation of GDGs
Specification
Name of GDG
Number of generations
Limit …. maximum no of datasets in a GDG.
Action to be taken when limit is reached
NOEMPTY…
EMPTY …
SCRATCH ….
NOSCRATCH …
31
/STEP1 EXEC PGM=IDCAMS
//SYSINDD
DELETE DA0001T.ACCOUNTS.MONTHLY GDG
/*
//
Example 9.5 Deleting GDG Index
Name of the model containing the GDG DCB parameter’s is coded in the DCB parameter of the DD statement
Example :
ORGANIZATION IS SEQUENTIAL/INDEXED/RELATIVE
ACCESS MODE IS SEQUENTIAL/INDEXED/DYNAMIC
RECORD KEY IS primary Key Dataname
ALTERNATE KEY IS Alternate Key Dataname [With Duplicates]
FILE STATUS IS status-key.
32
FD Entry
Should have the record structure
If KSDS then key field must match with length and position of KEYS parameter in DEFINE CLUSTER
information
File Processing
Note: There is no COBOL standard for assigning ddnames to alternate indexes, so a quasi-standard has
emerged whereby a sequential number is appended to the eighth character of the base cluster ddname.
//LIBMAST DD DSN=DA0001T.LIB.KSDS.CLUSTER,
// DISP=SHR
//LIBMAST1 DD DSN=DA0001T.LIB.KSDS.NAME.PATH,
// DISP=SHR
//LIBMAST2 DD DSN=DA0001T.LIB.KSDS.DEPT.PATH,
// DISP=SHR
Example 10.2 JCL to access AIX
Remark:
No matter how many alternate indexes you specify in the program, there’s only one ASSIGN clause pointing to
the ddname of the base cluster.
FD : Should have record description having primary key dataname and alternate key
dataname
Key of Reference.
The key that is currently being used to access records is called the key of reference. When the program opens
the dataset, the primary key becomes, by default, the key of reference. The primary key remains the key of
reference when accessing records until it is changed. To start accessing records by an alternate index key, you
merely change the key of reference by using the KEY phrase as part of one of the following statements.
33
Example 10.5 READ for Accessing AIX
START statement, for example
START EMP-MAST
KEY IS EQUAL TO EMP-NAME.
Example 10.6 START verb
Invalid key.
2 1 Sequence error.
2 Duplicate key.
3 No record found.
4 Key outside boundary of dataset.
Logic error :
4 1 OPEN of dataset already open.
2 CLOSE for dataset not open.
3 READ not executed before REWRITE.
4 REWRITE of different-record size.
6 READ after EOF reached.
7 READ attempted for dataset not opened I-O
or INPUT.
8 WRITE for dataset not opened OUTPUT,I-O
or EXTEND.
9 DELETE or REWRITE for dataset not opened I-O.
34
VSAM I/O error processing
I/O error handling is one vital area where VSAM dataset processing differs from non-VSAM dataset processing.
When processing non-VSAM datasets, most programmers code their application programs to ignore errors,
because the access method would abend the program if a serious I/O error occurs. Not so when processing
VSAM datasets.
VSAM places program control in the hands of the programmer, not the O/S. For this reason, it is important to
check the COBOL status key designated in the FILE STATUS clause after every I/O operation. For some error
keys you'll want to abend the program immediately; for others you can just display the key, the record, and an
informative message and continue processing.
For these status key values, continue processing normally :
00 successful I/O.
02 duplicate alternate key encountered (expected).
10 end of file.
For these status key values, bypass the record, display pertinent information, and continue processing :
Note: You may want to have the program count the number of times these key values are returned and terminate
the program if the counter reaches an unacceptable number, which would likely to indicate that your input is
bad
17. Appendix-A
VSAM ASSIGNMENT
a. Define an ESDS cluster. Populate the ESDS cluster by using a COBOL program. Using LISTCAT
command list the attributes of the created cluster.
Allocation for 3000 records primary, secondary allocations for 100 records.
Fixed record length of 80 bytes each.
Key beginning in the 5th position with length of 5 bytes.
Volume parameters.
35
c. Populate the KSDS cluster by using a COBOL program. Using LISTCAT command list the attributes
of the created cluster.
d. Write a program to populate an indexed master file from transaction records. There are three datasets.
1 5 6 25 26 28 29 33
1 56 13 14 18
36
1. A table of product numbers and corresponding unit prices is to be created in storage from PRODUCT-
MASTER. There are 50 product numbers.
4. Perform a table look up using the product number from the PURCHASE-TRANS record to find the
corresponding unit price in the PRODUCT-MASTER table.
The key field is a combined group item consisting of state number and country number. Create a KSDS cluster
and populate the cluster from the following transaction records.
The output master file is also an indexed file with following record layout
Amount Owed = Qty x Price per unit + Tax rate x (Qty x Price per unit )
37