Database Programming v7r1
Database Programming v7r1
IBM i
Database
Database programming
7.1
IBM i
Database
Database programming
7.1
Note
Before using this information and the product it supports, read the information in Notices, on
page 295.
This edition applies to version 7, release 1, modification 0 of IBM i (product number 5770-SS1) and to all subsequent
releases and modifications until otherwise indicated in new editions. This version does not run on all reduced
instruction set computer (RISC) models nor does it run on CISC models.
Copyright International Business Machines Corporation 1998, 2010.
US Government Users Restricted Rights Use, duplication or disclosure restricted by GSA ADP Schedule Contract
with IBM Corp.
Contents
Database programming . . . . . . . . 1
Whats new for IBM i 7.1 . . . . . . . . .
PDF file for Database programming . . . . .
Database file concepts . . . . . . . . . .
DB2 for i . . . . . . . . . . . . .
Interfaces to DB2 for i . . . . . . . . .
Traditional system interface . . . . . .
SQL . . . . . . . . . . . . . .
System i Navigator . . . . . . . . .
IBM Query for i . . . . . . . . . .
Database files . . . . . . . . . . . .
How database files are described . . . . .
Externally and program-described data . .
Dictionary-described data . . . . . . .
Record format description . . . . . . .
Access path description. . . . . . . .
Naming conventions for a database file . .
Database data protection and monitoring . . .
Database file sizes . . . . . . . . . .
Example: Database file sizes . . . . . .
Setting up database files . . . . . . . . .
Creating and describing database files . . .
Creating a library . . . . . . . . .
Setting up source files . . . . . . . .
Why source files are used . . . . .
Creating a source file . . . . . . .
Describing database files . . . . . . .
Describing database files using DDS . .
Specifying database file and member
attributes . . . . . . . . . . .
Setting up physical files . . . . . . .
Creating a physical file . . . . . .
Specifying physical file and member
attributes . . . . . . . . . . .
Implicit physical file journaling . . . .
Setting up logical files . . . . . . . . .
Creating a logical file . . . . . . . .
Creating a logical file with more than one
record format . . . . . . . . . .
Defining logical file members . . . .
Describing logical file record formats . . .
Describing field use for logical files . .
Deriving new fields from existing fields .
Describing floating-point fields in logical
files . . . . . . . . . . . . .
Describing access paths for logical files . .
Selecting and omitting records for logical
files . . . . . . . . . . . . .
Sharing existing access paths between
logical files . . . . . . . . . .
Setting up a join logical file . . . . . .
Example 1: Joining two physical files . .
Example 2: Using more than one field to
join files . . . . . . . . . . .
Example 3: Reading duplicate records in
the secondary file . . . . . . . .
Copyright IBM Corp. 1998, 2010
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
2
2
2
2
3
3
3
4
4
5
5
6
6
7
7
11
12
12
13
13
13
14
17
18
. 26
. 33
. 33
.
.
.
.
34
38
38
39
.
.
.
.
.
39
43
45
47
48
. 50
. 51
. 52
. 55
. 58
. 59
. 67
. 69
iii
iv
103
103
103
103
104
104
105
105
105
105
106
106
107
107
108
109
109
110
111
111
115
116
117
117
118
121
121
121
122
123
124
128
139
142
146
150
154
160
161
193
193
194
194
195
197
199
200
201
202
203
204
205
206
206
207
207
208
208
208
208
209
209
209
210
210
210
210
211
211
212
217
217
218
218
218
218
219
220
221
221
222
222
223
223
223
223
225
226
226
227
228
228
228
236
237
237
238
238
239
239
242
242
243
243
244
244
244
245
245
245
246
246
247
248
248
249
250
250
250
251
251
252
252
252
253
254
254
255
256
Contents
257
257
258
258
258
258
259
259
261
261
262
262
263
263
263
264
264
265
265
266
266
266
267
267
268
268
270
270
270
270
271
271
271
276
280
282
283
284
284
284
286
287
287
287
288
288
289
289
vi
291
. 290
. 290
. 290
. 291
. 291
.
.
.
.
.
.
.
.
.
.
.
.
. 296
. 297
. 297
Database programming
DB2 for i provides a wide range of support for setting up, processing, and managing database files.
Note: By using the code examples, you agree to the terms of the Code license and disclaimer
information on page 293.
You can now create an XML data type in SQL tables. The XML data type is handled like a LOB field.
Related reference
Related information for Database programming on page 291
Product manuals and other information center topic collections contain information that relates to the
Database programming topic collection. You can view or print any of the PDF files.
DB2 for i
DB2 for i is the integrated relational database manager on the i5/OS operating system.
DB2 for i is part of the i5/OS operating system. It provides access to and protection for data. It also
provides advanced functions such as referential integrity and parallel database processing.
With DB2 for i, independent auxiliary storage pools (ASPs), also known as independent disk pools, allow
you to have one or more separate databases associated with each ASP group. You can set up databases
using primary independent disk pools.
Related concepts
Independent disk pools examples
SQL
Structured Query Language (SQL) is a standardized language that can be used within host programming
languages or interactively to define, access, and manipulate data in a relational database.
SQL uses a relational model of data; that is, it perceives all data as existing in tables. The DB2 for i
database has SQL processing capability integrated into the system. It processes compiled programs that
contain SQL statements. To develop SQL applications, you need the IBM DB2 Query Manager and SQL
Development Kit for i licensed program for the system on which you develop your applications.
Interactive SQL is a function of the IBM DB2 Query Manager and SQL Development Kit for i licensed
program that allows SQL statements to run dynamically instead of in batch mode. Every interactive SQL
statement is read from the workstation, prepared, and run dynamically.
Related concepts
SQL programming
System i Navigator
System i Navigator is a no-charge feature of the IBM i Access for Windows licensed program. It
provides a graphical, Microsoft Windows interface to common i5/OS management functions, including
database.
Most database operations that you can access using System i Navigator are based on SQL functions.
However, some operations are based on the traditional system interface, such as control language (CL)
commands.
Related concepts
Connecting to System i
Database files
A database file is one of the several types of the system object type *FILE. A database file contains
descriptions of how input data is to be presented to a program from internal storage and how output
data is to be presented to internal storage from a program.
Database files contain members and records.
Source file
A source file contains uncompiled programming code and input data needed to create some types of
objects. It can contain source statements for such items as high-level language programs and data
description specifications (DDS). A source file can be a source physical file, diskette file, tape file, or inline
data file.
Physical file
A physical file is a database file that stores application data. It contains a description of how data is to be
presented to or received from a program and how data is actually stored in the database.
A physical file consists of fixed-length records that can have variable-length fields. It contains one record
format and one or more members. From the perspective of the SQL interface, physical files are identical
to tables.
Logical file
A logical file is a database file that logically represents one or more physical files. It contains a
description of how data is to be presented to or received from a program. This type of database file
contains no data, but it defines record formats for one or more physical files.
Logical files let users access data in a sequence and format that are different from the physical files they
represent. From the perspective of the SQL interface, logical files are identical to views and indexes.
Member
Members are different sets of data, each with the same format, within one database file. Before you
perform any input or output operations on a file, the file must have at least one member.
Database programming
As a general rule, a database file has only one member, the one created when the file is created. If a file
contains more than one member, each member serves as a subset of the data in the file.
Record
A record is a group of related data within a file. From the perspective of the SQL interface, records are
identical to rows.
Related concepts
Why source files are used on page 13
A source file contains input (source) data that is needed to create some types of objects. A source file is
used when a command alone cannot provide sufficient information for creating an object.
Dictionary-described data
You can define a program-described or an externally described file with the record format description
that is stored in the data dictionary.
You can describe the record format information using the interactive data definition utility (IDDU). Even
though the file is program described, IBM Query for i, System i Access, and the data file utility (DFU) use
the record format description that is stored in the data dictionary.
You can use IDDU to describe and then create a file. The file created is an externally described file. You
can also move the file description that is stored in an externally described file into the data dictionary.
The system always ensures that the descriptions in the data dictionary and in the externally described file
are identical.
Database programming
The record format also describes each field in detail, including length, data type (for example, packed
decimal or character), validity checks, text description, and other information.
The following example shows the relationship between the record format and the records in a physical
file:
In this example of specifications for record format ITMMST, there are three fields. Field ITEM is zoned
decimal, 5 digits, with no decimal position. Field DESCRP is character, with 18 positions. Field PRICE is
zoned decimal, 5 digits, with two decimal positions.
A physical file can have only one record format. The record format in a physical file describes the way
the data is actually stored.
A logical file contains no data. Logical files are used to arrange data from one or more physical files into
different formats and sequences. For example, a logical file can change the order of the fields in the
physical file, or present to the program only some of the fields stored in the physical file.
A logical file record format can change the length and data type of fields that are stored in physical files.
The system does the necessary conversion between the physical file field description and the logical file
field description. For example, a physical file can describe a field FLDA as a packed decimal field of 5
digits, and a logical file that uses FLDA might redefine it as a zoned decimal field of 7 digits. In this case,
when your program uses the logical file to read a record, the system automatically converts (unpacks)
FLDA to zoned decimal format.
meets the high-level language restrictions. For more information about renaming database fields in
programs, see your high-level language topic collection.
In addition, names must be unique as follows:
v Field names must be unique in a record format.
v Record format names and member names must be unique in a file.
v File names must be unique in a library.
Maximum value
32 766 bytes
8 000 fields
120 fields
32 768 characters1
10 000 bytes
4 294 967 294 records2
1 869 162 846 624 bytes3
1 099 511 627 776 bytes3 5
Database programming
Description
Maximum value
For files with keyed sequence access paths, the maximum number of records in a member varies and can be
estimated using the following formulas.
When ACCPTHSIZ(*MAX4GB) is specified, use the following formula:
2,867,200,000
10 + (.8 x key length)
When ACCPTHSIZ(*MAX1TB) is specified, use the following formula:
725,680,000,000
12 + (.8 x key length)
These are estimated values. The actual maximum number of records can vary significantly.
3
Both the number of bytes in a file member and the number of bytes in an access path must be looked at when
message CPF5272 is sent indicating that the maximum system object size has been reached.
The maximum size of a variable-length character or DBCS field is 32 740 bytes. DBCS-graphic field lengths are
expressed in terms of characters; therefore, the maximums are 16 383 characters (fixed length) and 16 370 characters
(variable length).
The maximum is 4 294 966 272 bytes if the access path is created with a maximum size of 4 gigabytes (GB),
ACCPTHSIZ(*MAX4GB).
These are maximum values. There are situations where the actual limit you experience will be less than
the stated maximum. For example, certain high-level languages can have more restrictive limits than
those described above.
Keep in mind that performance can suffer as you approach some of these maximums. For example, the
more logical files you have built over a physical file, the greater the chance that system performance can
suffer (if you are frequently changing data in the physical file that causes a change in many logical file
access paths).
Normally, an i5/OS database file can grow until it reaches the maximum size allowed on the operating
system. The operating system normally does not allocate all the file space at once. Rather, it occasionally
allocates additional space as the file grows larger. This method of automatic storage allocation provides
the best combination of good performance and effective auxiliary storage space management.
If you want to control the size of the file, the storage allocation, and whether the file should be connected
to auxiliary storage, you can use the SIZE, ALLOCATE, and CONTIG parameters on the Create Physical
File (CRTPF) and the Create Source Physical File (CRTSRCPF) commands.
You can use the following formulas to estimate the disk size of your physical and logical files.
v For a physical file (excluding the access path) that does not contain null-capable fields:
Disk size = (number of valid and deleted records + 1) x
(record length + 1) + 20480 x (number of members) + 8192
The size of the physical file depends on the SIZE and ALLOCATE parameters on the CRTPF and
CRTSRCPF commands. If you specify ALLOCATE(*YES), the initial allocation and increment size on
the SIZE keyword must be used instead of the number of records.
v For a physical file (excluding the access path) that contains null-capable fields:
Disk size = (number of valid and deleted records + 1) x
(record length + 1) + 20480 x (number of members) +
8192 + ((number of fields in format 8) rounded up) x
(number of valid and deleted records + 1)
The size of the physical file depends on the SIZE and ALLOCATE parameters on the CRTPF and
CRTSRCPF commands. If you specify ALLOCATE(*YES), the initial allocation and increment size on
the SIZE keyword must be used instead of the number of records.
v For a logical file (excluding the access path):
Disk size = (12288) x (number of members) + 8192
v For a keyed sequence access path the generalized equation for index size, per member, is:
Three-byte index
Four-byte index
NodeSize
LogicalPageHeaderSize
LimbPageUtilization
3
16
.75 * LogicalPageSize
4
64
.75 * LogicalPageSize
Database programming
Constant
Three-byte index
Four-byte index
LeafPageUtilization
.75 * LogicalPageSize
.80 * LogicalPageSize
The remaining constants, CommonTextPerKey and TerminalTextPerKey, are probably best estimated by
using the following formulas:
1 - 500
501 - 1000
1001 - 2000
2001 - 10 000
10 001 - 18 000
18 001 - 26 000
26 001 - 32 768
4096 bytes
8192 bytes
16 384 bytes
N/A
N/A
N/A
N/A
8192 bytes
16 384 bytes
32 768 bytes
65 536 bytes
131 072 bytes
262 144 bytes
524 288 bytes
*MAX4GB (3-byte)
LimbPageUtilization
*MAX1TB (4-byte)
LimbPageUtilization
1 - 500
501 - 1000
1001 - 2000
2001 - 10 000
10 001 - 18 000
18 001 - 26 000
26 001 - 32 768
3072 bytes
6144 bytes
12 288 bytes
N/A
N/A
N/A
N/A
6144 bytes
12 288 bytes
24 576 bytes
49 152 bytes
98 304 bytes
196 608 bytes
393 216 bytes
*MAX4GB (3-byte)
LeafPageUtilization
*MAX1TB (4-byte)
LeafPageUtilization
1 - 500
501 - 1000
1001 - 2000
2001 - 10 000
10 001 - 18 000
18 001 - 26 000
26 001 - 32 768
3072 bytes
6144 bytes
12 288 bytes
N/A
N/A
N/A
N/A
6554 bytes
13 107 bytes
26 214 bytes
52 428 bytes
104 857 bytes
209 715 bytes
419 430 bytes
10
CommonTextPerKey = 0
which would cause:
TerminalTextPerKey = KeySizeInBytes
b = NumKeys * (KeySizeInBytes + 2 * NodeSize) *
(LimbPageUtilization - LogicalPageHeaderSize + 2 * NodeSize)
- 2 * NodeSize * (LeafPageUtilization - LogicalPageHeaderSize
+ 2 * NodeSize)
c = 0
NumberLogicalPages = ceil( [ -b - sqrt(b ** 2 ) ]
/ (2 * a))
= ceil[ (-2 * b) / (2 * a) ]
= ceil[ -b/a ]
The equation for index size in previous versions of the operating system produces the following result:
TotalIndexSize = (number of keys) * (key length + 8) *
(0.8) * (1.85) + 4096
= (NumKeys) * (KeySizeInBytes + 8) *
Database programming
11
This estimate can differ significantly from your file. The keyed sequence access path depends heavily on
the data in your records. The only way to get an accurate size is to load your data and display the file
description.
The following table shows a list of minimum file sizes.
Description
Minimum size
8192 bytes
20 480 bytes
12 288 bytes
Note: Additional space is not required for an arrival sequence access path.
In addition to the file sizes, the system maintains internal formats and directories for database files.
(These internal objects are owned by user profile QDBSHR.) The following are estimates of the sizes of
those objects:
v For any file not sharing another files format:
Format size = (144 x number of fields) + 4096
v For files sharing their format with any other file:
Format sharing directory size = (16 x number of files
sharing the format) + 4096
v For each physical file and each physical file member having a logical file or logical file member built
over it:
Data sharing directory size = (16 x number of files
or members sharing data) + 4096
v For each file member having a logical file member sharing its access path:
Access path sharing directory size = (16 x number of files
or members sharing access path) + 4096
12
You can create a database file by using IDDU, part of the IBM Rational Development Studio for i
licensed program. If you are using IDDU to describe your database files, you might also consider using
it to create your files.
v Control language (CL), using the source entry utility (SEU) or the data file utility (DFU) to specify data
description specifications (DDS)
You can create a database file by using CL. The CL database file create commands are Create Physical
File (CRTPF), Create Logical File (CRTLF), and Create Source Physical File (CRTSRCPF). After a
database file is created, you can use SEU or DFU to describe data in the file. SEU and DFU are part of
the IBM Rational Development Studio for i licensed program. These topics focus on how to create files
using these methods.
v Structured Query Language (SQL)
You can create and describe a database file (table) by using SQL statements. SQL is the IBM relational
database language. It can be used to interactively describe and create database files.
v System i Navigator
You can also create a database file (table) using System i Navigator.
Related concepts
Creating a table
Getting started with System i Navigator
SQL programming
Traditional system interface on page 2
The i5/OS traditional system interface is the full set of system commands and other non-SQL facilities
that you can use to access and change DB2 for i data.
Creating a library
A library is a system object that serves as a directory to other objects. A library groups related objects and
allows you to find objects by name. To create a library, use System i Navigator or the Create Library
(CRTLIB) command.
The system-recognized identifier for the object type is *LIB. Before you can create a database file, you
must create a library to store it. You can create a library in the following ways:
v You can use System i Navigator to create a library (in SQL, called a schema).
v You can use the Create Library (CRTLIB) command to create the library.
When creating a library, you can specify the auxiliary storage pool (ASP) where the library is to be
stored. This allows you to create multiple, separate databases.
Related tasks
Creating a schema
Related reference
Create Library (CRTLIB) command
Database programming
13
For example, to create a control language (CL) program, you must use a source file that contains source
statements in the form of commands. To create a logical file, you must use a source file that contains data
description specifications (DDS).
To create the following objects, source files are required:
v High-level language programs
v Control language programs
v Logical files
v Intersystem communications function (ICF) files
v Commands
To create the following objects, source files can be used, but are not required:
v Physical files
v Display files
v Printer files
v Translate tables
A source file can be a database file, a diskette file, a tape file, or an inline data file. (An inline data file is
included as part of a job.) A source database file is another type of database file. You can use a source
database file as you use any other database file on the system.
Related concepts
Database files on page 3
A database file is one of the several types of the system object type *FILE. A database file contains
descriptions of how input data is to be presented to a program from internal storage and how output
data is to be presented to internal storage from a program.
Creating a source file:
Before creating a source file, you should first create a library. Then use the Create Source Physical File
(CRTSRCPF), Create Physical File (CRTPF), or Create Logical File (CRTLF) command to create a source
file.
v Create Source Physical File (CRTSRCPF) command
Normally, you use the CRTSRCPF command to create a source file, because many of the parameters
default to values that you usually want for a source file.
v Create Physical File (CRTPF), or Create Logical File (CRTLF) command
If you want to create a source file and define the record format and fields using data description
specifications (DDS), use the Create Physical File (CRTPF) or Create Logical File (CRTLF) command.
As an alternative to creating a source file, you can use source files supplied with the i5/OS and other
licensed programs.
Related concepts
Creating a library on page 13
A library is a system object that serves as a directory to other objects. A library groups related objects and
allows you to find objects by name. To create a library, use System i Navigator or the Create Library
(CRTLIB) command.
Related reference
Create Physical File (CRTPF) command
Create Logical File (CRTLF) command
Creating a source file using the Create Source Physical File (CRTSRCPF) command:
14
You can create a source file using the default values of the Create Source Physical File (CRTSRCPF)
command.
CRTSRCPF FILE(QGPL/FRSOURCE) TEXT('Source file')
The CRTSRCPF command creates a physical file, but with attributes appropriate for source physical files.
For example, the default record length for a source file is 92 (80 for the source data field, 6 for the source
sequence number field, and 6 for the source date field).
Related reference
Create Source Physical File (CRTSRCPF) command
Creating a source file with DDS:
If you want to create a source file with data description specifications (DDS), use the Create Physical File
(CRTPF) or Create Logical File (CRTLF) command.
If you want to create a source file for which you need to define the record format, use the CRTPF or
CRTLF command. If you create a source logical file, the logical file member should only refer to one
physical file member to avoid duplicate keys.
The following example shows the DDS needed to define the record format for a source file using the
CRTPF command:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* R RECORD1
A
F1
6S 2
A
F2
6S
A
F3
92A
Related reference
Create Physical File (CRTPF) command
Create Logical File (CRTLF) command
Creating a source file without DDS:
When you create a source physical file without using DDS, but by specifying the record length (RCDLEN
parameter) on the Create Source Physical File (CRTSRCPF) command, the source created contains three
fields: SRCSEQ, SRCDAT, and SRCDTA.
The record length must include 12 characters for sequence number and date-of-last-change fields so that
the length of the data portion of the record equals the record length minus 12. The data portion of the
record can be defined to contain more than one field (each of which must be character or zoned decimal).
If you want to define the data portion of the record as containing more than one field, you must define
the fields using DDS.
A record format that consists of the following three fields is automatically used for a source physical file
that is created with the CRTSRCPF command.
Field
Name
Description
SRCSEQ
SRCDAT
SRCDTA
Database programming
15
Note: For all IBM-supplied database source files, the length of the data portion is 80 bytes. For
IBM-supplied device source files, the length of the data portion is the maximum record length for
the associated device.
IBM-supplied source files:
For your convenience, the i5/OS licensed program and other licensed programs provide a database
source file for each type of source.
This table shows these IBM-supplied source files.
File name
Library name
Used to create
QCBLLESRC
QCBLSRC
QGPL
QGPL
QCLSRC
QCMDSRC
QCPPSRC
QCSRC
QDDSSRC
QFMTSRC
QLBLSRC
QPLISRC
QPNLSRC
QGPL
QGPL
QGPL
QGPL
QGPL
QGPL
QGPL
QGPL
QGPL
QREXSRC
QRPGLESRC
QRPGSRC
QGPL
QGPL
QGPL
QS36PRC
#LIBRARY
QS36SRC
#LIBRARY
QTBLSRC
QTXTSRC
QGPL
QGPL
You can either add your source members to these files or create your own source files. Normally, you
want to create your own source files using the same names as the IBM-supplied files, but in different
libraries. The IBM-supplied source files are created with the file names used for the corresponding create
command (for example, the Create CL Program (CRTCLPGM) command uses the QCLSRC file name as
the default). Additionally, the IBM-supplied programmer menu uses the same default names. (If you use
the same file names as the IBM-supplied names, ensure that the library containing your source files
precedes the library containing the IBM-supplied source files in the library list.)
Source file attributes:
Here are the attributes common to most source files and the restrictions on using these attributes.
Source files usually have the following attributes:
v A record length of 92 characters (this includes a 6-byte sequence number, a 6-byte date, and 80 bytes of
source).
v Keys (sequence numbers) that are unique even though the access path does not specify unique keys.
You are not required to specify a key for a source file. Default source files are created without keys
16
(arrival sequence access path). A source file created with an arrival sequence access path requires less
storage space and reduces save/restore time in comparison to a source file for which a keyed sequence
access path is specified.
v
v
v
v
Database programming
17
Externally described files can be described with DDS. DDS provides descriptions of the
field-level, record-level, and file-level information.
You might use DDS because it provides the most options for the programmer to describe data in
the database. For example, only with DDS can you describe key fields in logical files.
The DDS form provides a common format for describing data externally. DDS data is column
sensitive. The examples that follow have numbered columns and show the data in the correct
columns.
After a database file is described, you can view the description.
Related concepts
IDDU Use PDF
SQL programming
DB2 for i5/OS SQL reference
Displaying information about database files on page 218
By using System i Navigator or CL commands, you can display various types of information about
database files.
Describing database files using DDS:
When you describe a database file using data description specifications (DDS), you can describe the file at
the file, record-format, join, field, key-field, and select/omit-field levels.
v File-level DDS provides the system information about the entire file. For example, you can specify
whether all the key field values in the file must be unique.
v Record format-level DDS provides the system information about a specific record format in the file. For
example, when you describe a logical file record format, you can specify the physical file that it is
based on.
v Join-level DDS provides the system information about the physical files that are used in a join logical
file. For example, you can specify how to join two physical files.
v Field-level DDS provides the system information about individual fields in the record format. For
example, you can specify the name and attributes of each field.
v Key field-level DDS provides the system information about the key fields for the file. For example, you
can specify which fields in the record format are to be used as key fields.
v Select/omit field-level DDS provides the system information about which records are to be returned to
the program during file processing. Select/omit specifications apply to logical files only.
Related concepts
DDS for physical and logical files
Example: Describing a physical file using DDS:
This example shows how to describe a physical file using DDS.
The DDS for a physical file, as shown in the next example, must be in the following order:
1
File-level entries (optional). The UNIQUE keyword is used to indicate that the value of the key
field in each record in the file must be unique. Duplicate key values are not allowed in this file.
Record format-level entries. The record format name is specified, along with an optional text
description.
Field-level entries. The field names and field lengths are specified, along with an optional text
description for each field.
Key field-level entries (optional). The field names used as key fields are specified.
18
Comment (optional).
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* ORDER HEADER FILE (ORDHDRP)
A 5
A
1 UNIQUE
A
2 R ORDHDR
TEXT('Order header record')
A
3 CUST
5
0
TEXT('Customer number')
A
ORDER
5
0
TEXT('Order number')
A
.
A
.
A
.
A
K CUST
A
4 K ORDER
The following example shows a physical file ORDHDRP (an order header file), with an arrival sequence
access path without key fields specified, and the DDS necessary to describe that file.
Record format of physical file ORDHDRP
Customer number (CUST) Packed decimal length 5, No decimals
Order number (ORDER) Packed Decimal Length 5, No decimals
Order date (ORDATE) Packed decimal length 6, No decimals
Purchase order number (CUSORD) Packed decimal length 15, No decimals
Shipping instructions (SHPVIA) Character length 15
Order status (ORDSTS) Character length 1
...
State (STATE) Character length 2
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* ORDER HEADER FILE (ORDHDRP)
A
R ORDHDR
TEXT('Order header record')
A
CUST
5
0
TEXT('Customer Number')
A
ORDER
5
0
TEXT('Order Number')
A
ORDATE
6
0
TEXT('Order Date')
A
CUSORD
15
0
TEXT('Customer Order No.')
A
SHPVIA
15
TEXT('Shipping Instr')
A
ORDSTS
1
TEXT('Order Status')
A
OPRNME
10
TEXT('Operator Name')
A
ORDAMT
9
2
TEXT('Order Amount')
A
CUTYPE
1
TEXT('Customer Type')
A
INVNBR
5
0
TEXT('Invoice Number')
A
PRTDAT
6
0
TEXT('Printed Date')
A
SEQNBR
5
0
TEXT('Sequence Number')
A
OPNSTS
1
TEXT('Open Status')
A
LINES
3
0
TEXT('Order Lines')
A
ACTMTH
2
0
TEXT('Accounting Month')
A
ACTYR
2
0
TEXT('Accounting Year')
A
STATE
2
TEXT('State')
A
The R in position 17 indicates that a record format is being defined. The record format name ORDHDR is
specified in positions 19 through 28.
You make no entry in position 17 when you are describing a field; a blank in position 17 along with a
name in positions 19 through 28 indicates a field name.
The data type is specified in position 35. The valid data types are:
Entry
Meaning
Database programming
19
Character
Packed decimal
Zoned decimal
Binary
Hexadecimal
Date
Time
Timestamp
Notes:
1. For double-byte character set (DBCS) data types, see Double-byte character set
considerations on page 287.
2. The system performs arithmetic operations more efficiently for the packed-decimal than for
the zoned-decimal data type.
3. Some high-level languages do not support binary floating-point data.
4. Here are some special considerations for using binary floating-point fields:
v The precision associated with a binary floating-point field is a function of the number of bits
(single or double precision) and the internal representation of the binary floating-point
value. This translates into the number of decimal digits supported in the significand and the
maximum values that can be represented in the binary floating-point field.
v When a binary floating-point field is defined with fewer digits than supported by the
precision specified, that length is only a presentation length and has no effect on the
precision used for internal calculations.
v Although binary floating-point numbers are accurate to 7 (single) or 15 (double) decimal
digits of precision, you can specify up to 9 or 17 digits. You can use the extra digits to
uniquely establish the internal bit pattern in the internal binary floating-point format, so
that identical results are obtained when a binary floating-point number in internal format is
converted to decimal and back again to internal format.
If the data type (position 35) is not specified, the decimal positions entry is used to determine the data
type. If the decimal positions (positions 36 through 37) are blank, the data type is assumed to be
character (A); if these positions contain a number 0 through 31, the data type is assumed to be packed
decimal (P).
The length of the field is specified in positions 30 through 34, and the number of decimal positions (for
numeric fields) is specified in positions 36 and 37. If a packed or zoned decimal field is to be used in a
high-level language program, the field length must be limited to the length allowed by the high-level
language you are using. The length is not the length of the field in storage but the number of digits or
characters specified externally from storage. For example, a 5-digit packed decimal field has a length of 5
specified in DDS, but it uses only 3 bytes of storage.
Character or hexadecimal data can be defined as variable length by specifying the VARLEN field-level
keyword. Generally you would use variable length fields, for example, as an employee name within a
database. Names usually can be stored in a 30-byte field; however, there are times when you need 100
bytes to store a very long name. If you always define the field as 100 bytes, you waste storage. If you
always define the field as 30 bytes, some names are truncated.
You can use the DDS VARLEN keyword to define a character field as variable length. You can define this
field as:
20
v Variable-length with no allocated length. This allows the field to be stored using only the number of
bytes equal to the data (plus two bytes per field for the length value and a few overhead bytes per
record). However, performance might be affected because all data is stored in the variable portion of
the file, which requires two disk read operations to retrieve.
v Variable-length with an allocated length equal to the most likely size of the data. This allows most field
data to be stored in the fixed portion of the file and minimizes unused storage allocations common
with fixed-length field definitions. Only one read operation is required to retrieve field data with a
length less than the allocated field length. Field data with a length greater than the allocated length is
stored in the variable portion of the file and requires two read operations to retrieve the data.
Example: Describing a logical file using DDS:
This example shows how to describe a logical file using DDS.
The DDS for a logical file, as shown in the next example, must be in the following order:
1
File-level entries (optional). In this example, the UNIQUE keyword indicates that for this file the
key value for each record must be unique; no duplicate key values are allowed.
Record format-level entries. In this example, the record format name, the associated physical file,
and an optional text description are specified.
Field-level entries (optional). In this example, each field name used in the record format is
specified.
Key field-level entries (optional). In this example, the Order field is used as a key field.
Select/omit field-level entries (optional). In this example, all records whose Opnsts field contains
a value of N are omitted from the files access path. That is, programs reading records from this
file never see a record whose OPNSTS field contains an N value.
Comment.
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* ORDER HEADER FILE (ORDHDRP)
A
6
A
1 UNIQUE
A
2 R ORDHDR
PFILE(ORDHDRP)
A
3 ORDER
TEXT('Order number')
A
CUST
TEXT('Customer number')
A
.
A
.
A
.
A
4 K ORDER
A
O OPNSTS
5 CMP(EQ 'N')
A
S
ALL
A logical file must be created after all physical files on which it is based are created. The PFILE keyword
in this example is used to specify the physical file or files on which the logical file is based.
Record formats in a logical file can be:
v A new record format based on fields from a physical file
v The same record format as in a previously described physical or logical file.
Fields in the logical file record format must either appear in the record format of at least one of the
physical files or be derived from the fields of the physical files on which the logical file is based.
Database programming
21
Related concepts
Sharing existing record format descriptions in a database file on page 25
A record format can be described once in either a physical or a logical file (except a join logical file) and
can be used by many files. When you describe a new file, you can specify that the record format of an
existing file is to be used by the new file.
Setting up logical files on page 38
A logical file contains no data, but it defines record formats for one or more physical files. You can create
various logical files and describe their record formats and access paths using data description
specifications (DDS).
Control language
Additional DDS field definition functions:
You can describe additional information about the fields in the physical and logical file record formats
with function keywords (positions 45 through 80 on the DDS form).
Some of the things you can specify include:
v Validity checking keywords to verify that the field data meets your standards. For example, you can
describe a field to have a valid range of 500 to 900. (This checking is done only when data is typed on
a keyboard to the display.)
v Editing keywords to control how a field should be displayed or printed. For example, you can use the
EDTCDE(Y) keyword to specify that a date field is to appear as MM/DD/YY. The EDTCDE and
EDTWRD keywords can be used to control editing. (This editing is done only when used in a display
or printer file.)
v Documentation, heading, and name control keywords to control the description and name of a field.
For example, you can use the TEXT keyword to document a description of each field. This text
description is included in your compiler list to better document the files used in your program. The
TEXT and COLHDG keywords control text and column-heading definitions. The ALIAS keyword can
be used to provide a more descriptive name for a field. The alias, or alternative name, is used in a
program (if the high-level language supports alias names).
v Content and default value keywords to control the null content and default data for a field. The
ALWNULL keyword specifies whether a null value is allowed in the field. If ALWNULL is used, the
default value of the field is null. If ALWNULL is not present at the field level, the null value is not
allowed, character and hexadecimal fields default to blanks, and numeric fields default to zeros, unless
the DFT (default) keyword is used to specify a different value.
Using existing field descriptions and field reference files to describe a database file:
If you want to use a field description in an existing file, you can copy that field description into your
new file description. You can also create a field reference file to contain the field descriptions that you
need for any group of files.
DDS keywords REF and REFFLD allow you to refer to a field description in an existing file. This helps
reduce the effort of coding DDS statements. It also helps ensure that the field attributes are used
consistently in all files that use the field.
In addition, you can create a physical file for the sole purpose of using its field descriptions. That is, the
file does not contain data; it is used only as a reference for the field descriptions for other files. This type
of file is known as a field reference file. A field reference file is a physical file containing no data, just
field descriptions.
You can use a field reference file to simplify record format descriptions and to ensure that field
descriptions are used consistently. You can create a field reference file using DDS and the Create Physical
File (CRTPF) command.
22
After the field reference file is created, you can build physical file record formats from this file without
describing the characteristics of each field in each file. When you build physical files, all you need to do
is to refer to the field reference file (using the REF and REFFLD keywords) and specify any changes. Any
changes to the field descriptions and keywords specified in your new file override the descriptions in the
field reference file.
In the following example, a field reference file named DSTREFP is created for distribution applications.
The following example shows the DDS needed to describe DSTREFP.
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* FIELD REFERENCE FILE (DSTREFP)
A
R DSTREF
TEXT('Field reference file')
A
A* FIELDS DEFINED BY CUSTOMER MASTER RECORD (CUSMST)
A
CUST
5 0
TEXT('Customer numbers')
A
COLHDG('CUSTOMER' 'NUMBER')
A
NAME
20
TEXT('Customer name')
A
ADDR
20
TEXT('Customer address')
A
A
CITY
20
TEXT('Customer city')
A
A
STATE
2
TEXT('State abbreviation')
A
CHECK(MF)
A
CRECHK
1
TEXT('Credit check')
A
VALUES('Y' 'N')
A
SEARCH
6 0
TEXT('Customer name search')
A
COLHDG('SEARCH CODE')
A
ZIP
5 0
TEXT('Zip code')
A
CHECK(MF)
A
CUTYPE
15
COLHDG('CUSTOMER' 'TYPE')
A
RANGE(1 5)
A
A* FIELDS DEFINED BY ITEM MASTER RECORD (ITMAST)
A
ITEM
5
TEXT('Item number')
A
COLHDG('ITEM' 'NUMBER')
A
CHECK(M10)
A
DESCRP
18
TEXT('Item description')
A
PRICE
5 2
TEXT('Price per unit')
A
EDTCDE(J)
A
CMP(GT 0)
A
COLHDG('PRICE')
A
ONHAND
5 0
TEXT('On hand quantity')
A
EDTCDE(Z)
A
CMP(GE 0)
A
COLHDG('ON HAND')
A
WHSLOC
3
TEXT('Warehouse location')
A
CHECK(MF)
A
COLHDG('BIN NO')
A
ALLOC
R
REFFLD(ONHAND *SRC)
A
TEXT('Allocated quantity')
A
CMP(GE 0)
A
COLHDG('ALLOCATED')
A
A* FIELDS DEFINED BY ORDER HEADER RECORD (ORDHDR)
A
ORDER
5 0
TEXT('Order number')
A
COLHDG('ORDER' 'NUMBER')
A
ORDATE
6 0
TEXT('Order date')
A
EDTCDE(Y)
A
COLHDG('DATE' 'ORDERED')
A
CUSORD
15
TEXT('Cust purchase ord no.')
A
COLHDG('P.O.' 'NUMBER')
A
SHPVIA
15
TEXT('Shipping instructions')
A
ORDSTS
1
TEXT('Order status code')
A
COLHDG('ORDER' 'STATUS')
A
OPRNME
R
REFFLD(NAME *SRC)
A
TEXT('Operator name')
Database programming
23
A
COLHDG('OPERATOR NAME')
A
ORDAMT
9 2
TEXT('Total order value')
A
COLHDG('ORDER' 'AMOUNT')
A
INVNBR
5 0
TEXT('Invoice number')
A
COLHDG('INVOICE' 'NUMBER')
A
PRTDAT
6 0
EDTCDE(Y)
A
COLHDG('PRINTED' 'DATE')
A
SEQNBR
5 0
TEXT('Sequence number')
A
COLHDG('SEQ' 'NUMBER')
A
OPNSTS
1
TEXT('Open status')
A
COLHDG('OPEN' 'STATUS')
A
LINES
3 0
TEXT('Lines on invoice')
A
COLHDG('TOTAL' 'LINES')
A
ACTMTH
2 0
TEXT('Accounting month')
A
COLHDG('ACCT' 'MONTH')
A
ACTYR
2 0
TEXT('Accounting year')
A
COLHDG('ACCT' 'YEAR')
A
A* FIELDS DEFINED BY ORDER DETAIL/LINE ITEM RECORD (ORDDTL)
A
LINE
3 0
TEXT('Line no. this item')
A
COLHDG('LINE' 'NO')
A
QTYORD
3 0
TEXT('Quantity ordered')
A
COLHDG('QTY' 'ORDERED'
A
CMP(GE 0)
A
EXTENS
6 2
TEXT('Ext of QTYORD x PRICE')
A
EDTCDE(J)
A
COLHDG('EXTENSION')
A
A* FIELDS DEFINED BY ACCOUNTS RECEIVABLE
A
ARBAL
8 2
TEXT('A/R balance due')
A
EDTCDE(J)
A
A* WORK AREAS AND OTHER FIELDS THAT OCCUR IN MULTIPLE PROGRAMS
A
STATUS
12
TEXT('status description')
A
A
Assume that the DDS in the previous example is entered into a source file FRSOURCE; the member name
is DSTREFP. To create a field reference file, use the CRTPF command as follows:
CRTPF FILE(DSTPRODLB/DSTREFP)
SRCFILE(QGPL/FRSOURCE) MBR(*NONE)
TEXT('Distribution field reference file')
The parameter MBR(*NONE) tells the system not to add a member to the file (because the field reference
file never contains data and therefore does not need a member).
To describe the physical file ORDHDRP by referring to DSTREFP, use the following DDS example:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* ORDER HEADER FILE (ORDHDRP) - PHYSICAL FILE RECORD DEFINITION
A
REF(DSTREFP)
A
R ORDHDR
TEXT('Order header record')
A
CUST
R
A
ORDER
R
A
ORDATE
R
A
CUSORD
R
A
SHPVIA
R
A
ORDSTS
R
A
OPRNME
R
A
ORDAMT
R
A
CUTYPE
R
A
INVNBR
R
A
PRTDAT
R
A
SEQNBR
R
A
OPNSTS
R
A
LINES
R
24
A
A
A
A
ACTMTH
ACTYR
STATE
R
R
R
The REF keyword (positions 45 through 80) with DSTREFP (the field reference file name) specified
indicates the file from which field descriptions are to be used. The R in position 29 of each field indicates
that the field description is to be taken from the reference file.
When you create the ORDHDRP file, the system uses the DSTREFP file to determine the attributes of the
fields included in the ORDHDR record format. To create the ORDHDRP file, use the CRTPF command.
Assume that the DDS in the previous example was entered into a source file QDDSSRC; the member
name is ORDHDRP.
CRTPF FILE(DSTPRODLB/ORDHDRP)
TEXT('Order Header physical file')
Note: The files used in some of the examples in this topic collection refer to this field reference file.
Using a data dictionary for field reference in a database file:
You can use a data dictionary and the interactive data description utility (IDDU) as an alternative to
using a DDS field reference file. IDDU allows you to define fields in a data dictionary.
Related concepts
IDDU Use PDF
Sharing existing record format descriptions in a database file:
A record format can be described once in either a physical or a logical file (except a join logical file) and
can be used by many files. When you describe a new file, you can specify that the record format of an
existing file is to be used by the new file.
Sharing existing record format descriptions can help reduce the number of DDS statements that you
normally code to describe a record format in a new file and can save auxiliary storage space.
The file originally describing the record format can be deleted without affecting the files sharing the
record format. After the last file using the record format is deleted, the system automatically deletes the
record format description.
The following example shows the DDS for two files. The first file describes a record format, and the
second file shares the record format of the first file:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R RECORD1
PFILE(CUSMSTP)
A
CUST
A
NAME
A
ADDR
A
SEARCH
A
K CUST
A
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R RECORD1
PFILE(CUSMSTP)
A
FORMAT(CUSMSTL)
A
K NAME
A
The first example shows file CUSMSTL, in which the fields Cust, Name, Addr, and Search make up the
record format. The Cust field is specified as a key field.
Database programming
25
The DDS in the second example shows file CUSTMSTL1, in which the FORMAT keyword names
CUSMSTL to supply the record format. The record format name must be RECORD1, the same as the
record format name shown in the first example. Because the files are sharing the same format, both files
have fields Cust, Name, Addr, and Search in the record format. In file CUSMSTL1, a different key field,
Name is specified.
The following restrictions apply to shared record formats:
v A physical file cannot share the format of a logical file.
v A join logical file cannot share the format of another file, and another file cannot share the format of a
join logical file.
v A view cannot share the format of another file, and another file cannot share the format of a view. (In
the Structured Query Language (SQL), a view is an alternative representation of data from one or more
tables. It can include all or some of the columns contained in the table or tables on which it is defined.)
If the original record format is changed by deleting all related files and creating the original file and all
the related files again, it is changed for all files that share it. If only the file with the original format is
deleted and re-created with a new record format, all files previously sharing that files format continue to
use the original format.
If a logical file is defined but no field descriptions are specified and the FORMAT keyword is not
specified, the record format of the first physical file (specified first on the PFILE keyword for the logical
file) is automatically shared. The record format name specified in the logical file must be the same as the
record format name specified in the physical file.
To find out if a file shares a format with another file, use the RCDFMT parameter on the Display
Database Relations (DSPDBR) command.
Record format relationships between physical and logical files:
When you change, add, or delete fields with the Change Physical File (CHGPF) command, a certain
relationship exists between the physical and logical files that share the same record format.
v When you change the length of a field in a physical file, you also change the length of the logical files
field.
v When you add a field to the physical file, the field is also added to the logical file.
v When you delete a field in the physical file, the field is also deleted from the logical file unless there is
another dependency in DDS, such as a keyed field or a select/omit statement.
Record format sharing limitation with physical and logical files:
You might encounter this record format sharing limitation when you are duplicating the same database
object multiple times.
A record format can only be shared by 32KB objects. Error messages are issued when you reach this
limitation.
Note: Format sharing is performed for files that are duplicated. The format is shared up to 32 767 times.
Beyond 32 767 times, if a file that shares the format is duplicated, a new format is created for the
duplicated file.
Specifying database file and member attributes:
When you create a database file, database attributes are stored with the file and members. You specify
attributes with database command parameters.
26
Related reference
Create Physical File (CRTPF) command
Create Logical File (CRTLF) command
Create Source Physical File (CRTSRCPF) command
Add Physical File Member (ADDPFM) command
Add Logical File Member (ADDLFM) command
Change Physical File (CHGPF) command
Change Physical File Member (CHGPFM) command
Change Logical File (CHGLF) command
Change Logical File Member (CHGLFM) command
Change Source Physical File (CHGSRCPF) command
Specifying the file name and member name (FILE and MBR) parameters:
The FILE and MBR parameters specify the names of a database file and a file member.
You name a file with the FILE parameter on a create command. You also name the library where the file
is stored. When you create a physical or logical file, the system normally creates a member with the same
name as the file. You can, however, specify a member name with the MBR parameter on a create
command. You can also choose not to create any members by specifying MBR(*NONE).
Note: The system does not automatically create a member for a source physical file.
Specifying the physical file data members (DTAMBRS) parameter:
The DTAMBRS parameter on the Create Logical File (CRTLF) command specifies the physical files and
members that contain the data associated with a logical file member.
You can specify:
v The order in which the physical file members are to be read.
v The number of physical file members to be used.
Related concepts
Defining logical file members on page 43
You can define members in a logical file to separate the data into logical groups. A logical file member
can be associated with one or several physical file members.
Specifying the source file and source member (SRCFILE and SRCMBR) parameters:
The SRCFILE and SRCMBR parameters specify the names of the source file and the source file member
that contain DDS statements.
If you do not specify a name:
v The default source file name is QDDSSRC.
v The default member name is the name specified on the FILE parameter.
Specifying the file type (FILETYPE) parameter:
The FILETYPE parameter specifies the type of database file.
A database file type is either data (*DATA) or source (*SRC). The Create Physical File (CRTPF) and Create
Logical File (CRTLF) commands use the default data file type (*DATA).
Database programming
27
28
29
Here are the ways you can maintain access paths for all members of a database file:
v Immediate maintenance of an access path means that the access path is maintained for a file member
whenever changes are made to its associated data, whether the member is open or not. Access paths
used by referential constraints are always in immediate maintenance.
v Rebuild maintenance of an access path means that the access path is maintained for a file member
only when the member is open, not when the member is closed; the access path is rebuilt when the
member is opened the next time. When a file member with rebuild maintenance is closed, the system
stops maintaining the access path. When the file member is opened again, the access path is totally
rebuilt. If one or more programs have opened a specific file member with rebuild maintenance
specified, the system maintains the access path for the member until the last user closes it.
v Delayed maintenance of an access path means that any maintenance of the access path is done after
the file member is opened the next time and when it remains open. However, the access path is not
rebuilt as it is with rebuild maintenance. Changes to the access path are collected from the time the
member is closed until it is opened again. When it is opened, only the collected changes are merged
into the access path.
If you do not specify the type of maintenance for a file, the default is immediate maintenance.
MAINT parameter comparison:
This table compares the effect of the immediate, rebuild, and delayed maintenance of access paths on
opening and processing files.
Function
Immediate maintenance
Rebuild maintenance
Delayed maintenance
Open
Process
Notes:
1. Delayed or rebuild maintenance cannot be specified for a file that has unique keys.
2. Rebuild maintenance cannot be specified for a file if its access path is being journaled.
30
You might want to specify immediate maintenance for access paths that are used frequently, or when you
cannot wait for an access path to be rebuilt when the file is opened. You might want to specify delayed
maintenance for access paths that are not used frequently, if infrequent changes are made to the record
keys that make up the access path.
In general, for files used interactively, immediate maintenance results in good response time. For files
used in batch jobs, either immediate, delayed, or rebuild maintenance is adequate, depending on the size
of the members and the frequency of changes.
Specifying the access path recovery (RECOVER) parameter:
The RECOVER parameter specifies when changed access paths that are not journaled or forced to
auxiliary storage are rebuilt after the system failure.
You can use the RECOVER parameter on the following commands to specify when the access path is to
be rebuilt:
v Create Physical File (CRTPF)
v Create Logical File (CRTLF)
v Create Source Physical File (CRTSRCPF)
Note: Access paths are rebuilt during the initial program load (IPL), after the IPL, or when a file is
opened.
Table 2 shows your choices for possible combinations of duplicate key and maintenance options.
Table 2. Recovery options
With this duplicate key
option
Unique
Immediate
Not unique
Immediate or delayed
Not unique
Rebuild
Database programming
31
The system allows multiple users to access and change a database file at the same time. The SHARE
parameter specifies whether the open data path (ODP) is shared with other programs in the same routing
step.
The SHARE parameter allows sharing of opened files in the same job. For example, sharing a file in a job
allows programs in the job to share the files status, record position, and buffer. The file sharing can
improve performance by reducing:
v The amount of storage the job needs.
v The time required to open and close the file.
Related concepts
Sharing database files in the same job or activation group on page 109
By default, the database management system allows one file to be read and changed by many users at
the same time. You can also share a file in the same job or activation group by specifying the SHARE
parameter.
Specifying the maximum file and record wait time (WAITFILE and WAITRCD) parameters:
The WAITFILE and WAITRCD parameters specify how long a program can wait for a file and a record in
the file if another job has the file or record locked.
If the wait time ends before the file or record is released, a message is sent to the program indicating that
the job was not able to use the file or read the record.
Related concepts
Locking records on page 105
DB2 for i has built-in integrity for records.
Locking files on page 106
When a database file is allocated exclusively, any program trying to open the file has to wait until it is
released. However, you can set a wait time for the file to become available using the WAITFILE
parameter.
Specifying the authority (AUT) parameter:
Public authority is the authority given to users who do not have any specific authority to an object, who
are not on the authorization list (if one is specified for the object), and whose group profile has no
specific authority to the object. The AUT parameter specifies public authority to a database file.
Related concepts
Specifying public authority on page 95
Public authority is given to users who do not have any specific authority to an object, who are not on the
authorization list of the object, or whose group profile has no specific authority to the object. When you
create a file, you can specify and grant public authority.
Specifying the system (SYSTEM) parameter:
The SYSTEM parameter specifies whether a database file is created on the local system or on the remote
system that supports distributed data management (DDM).
Related concepts
Distributed database programming
Specifying the text description (TEXT) parameter:
The TEXT parameter specifies the text that briefly describes a database file and member.
Specifying the coded character set identifier (CCSID) parameter:
32
A coded character set identifier (CCSID) is a 16-bit number that includes a specific set of encoding scheme
identifiers, character set identifiers, code page identifiers, and other information that uniquely identifies
the coded graphic-character representation. The CCSID parameter specifies the CCSID that describes
character data in the fields of a file.
Related concepts
i5/OS globalization
Specifying the sort sequence (SRTSEQ) parameter:
The SRTSEQ parameter specifies the sort sequence for a database file.
The values of the SRTSEQ parameter, along with the values of the CCSID and LANGID parameters,
determine which sort sequence table the file uses.
You can specify:
v System-supplied sort sequence tables with unique or shared collating weights. There are sort sequence
tables for each supported language.
v Any user-created sort sequence table.
v The hexadecimal value of the characters in the character set.
v The sort sequence of the current job or the one specified in the ALTSEQ parameter. The sort sequence
table is stored with the file, except when the sort sequence is *HEX.
Specifying the language identifier (LANGID) parameter:
The LANGID parameter specifies the language identifier that the system uses when the sort sequence
(SRTSEQ) parameter value is *LANGIDSHR or *LANGIDUNQ.
The values of the LANGID, CCSID, and SRTSEQ parameters determine which sort sequence table the file
uses. You can set the LANGID parameter for physical and logical files.
You can specify any language identifier supported on your system, or you can specify that the language
identifier for the current job be used.
Database programming
33
1. If you are using DDS, enter DDS for the physical file into a source file. You can do this using the
source entry utility (SEU). SEU is part of the IBM Rational Development Studio for i licensed
program.
2. Create the physical file. You can use the Create Physical File (CRTPF) command or the Create Source
Physical File (CRTSRCPF) command.
The following command creates a one-member file using DDS and places it in a library called
DSTPRODLB.
CRTPF FILE(DSTPRODLB/ORDHDRP)
TEXT('Order header physical file')
As shown, this command uses defaults. For the SRCFILE and SRCMBR parameters, the system uses DDS
in the source file called QDDSSRC and the member named ORDHDRP (the same as the file name). The
file ORDHDRP with one member of the same name is placed in the library DSTPRODLB.
Tables are similar to physical files. You can create tables using System i Navigator or using the CREATE
TABLE SQL statement.
Related concepts
Creating a library on page 13
A library is a system object that serves as a directory to other objects. A library groups related objects and
allows you to find objects by name. To create a library, use System i Navigator or the Create Library
(CRTLIB) command.
Creating a source file on page 14
Before creating a source file, you should first create a library. Then use the Create Source Physical File
(CRTSRCPF), Create Physical File (CRTPF), or Create Logical File (CRTLF) command to create a source
file.
Working with source files on page 245
You can use various methods to enter and maintain data in a source file.
Describing database files on page 17
You can use several methods to describe i5/OS database files. This topic discusses how to describe a
database file with data description specifications (DDS) because DDS has the most options for defining
data.
Getting started with System i Navigator
Related reference
Create Physical File (CRTPF) command
Create Source Physical File (CRTSRCPF) command
CREATE TABLE
Specifying physical file and member attributes:
You can specify the attributes of physical files and members on the Create Physical File (CRTPF), Create
Source Physical File (CRTSRCPF), Change Physical File (CHGPF), Change Source Physical File
(CHGSRCPF), Add Physical File Member (ADDPFM), and Change Physical File Member (CHGPFM)
commands.
Expiration date:
The EXPDATE parameter specifies an expiration date for each member in a physical file (ADDPFM,
CHGPFM, CRTPF, CHGPF, CRTSRCPF, and CHGSRCPF commands).
If the expiration date is past, the system operator is notified when the file is opened. The system operator
can then override the expiration date and continue, or stop the job. Each member can have a different
expiration date, which is specified when the member is added to the file.
34
Related concepts
Checking the expiration date of a physical file member on page 105
The system can check whether the data in a physical file member is still current. You can specify whether
the system checks the expiration date of a physical file member using the EXPCHK parameter on the
Override with Database File (OVRDBF) command.
Related reference
Add Physical File Member (ADDPFM) command
Change Physical File (CHGPF) command
Change Physical File Member (CHGPFM) command
Change Source Physical File (CHGSRCPF) command
Create Physical File (CRTPF) command
Create Source Physical File (CRTSRCPF) command
Size of a physical file member:
The SIZE parameter specifies the maximum number of records that can be placed in each physical file
member (CRTPF, CHGPF, CRTSRCPF, and CHGSRCPF commands).
The following formula can be used to determine the maximum:
R + (I * N)
where:
R
10 000
1000
3 (CRTPF command)
499 (CRTSRCPF command)
For example, assume that R is a file created for 5000 records plus 3 increments of 1000 records each. The
system can add 1000 to the initial record count of 5000 three times to make the total maximum 8000.
When the total maximum is reached, the system operator either stops the job or tells the system to add
another increment of records and continue. When increments are added, a message is sent to the system
history log. When the file is extended beyond its maximum size, the minimum extension is 10% of the
current size, even if this is larger than the specified increment. Instead of taking the default size or
specifying a size, you can specify *NOMAX.
Related reference
Database file sizes on page 7
Before you design and create a database file, you need to know the maximum size allowed for the file.
Change Physical File (CHGPF) command
Change Source Physical File (CHGSRCPF) command
Create Physical File (CRTPF) command
Create Source Physical File (CRTSRCPF) command
Storage allocation:
Database programming
35
The ALLOCATE parameter controls the storage that is allocated to each member when it is added to a
physical file (CRTPF, CHGPF, CRTSRCPF, and CHGSRCPF commands).
The storage allocated is large enough to contain the initial record count for a member. If you do not
allocate storage when the members are added, the system will automatically extend the storage allocation
as needed. You can use the ALLOCATE parameter only if you specified a maximum size on the SIZE
parameter. If SIZE(*NOMAX) is specified, then ALLOCATE(*YES) cannot be specified.
Related reference
Change Physical File (CHGPF) command
Change Source Physical File (CHGSRCPF) command
Create Physical File (CRTPF) command
Create Source Physical File (CRTSRCPF) command
Method of allocating storage:
The CONTIG parameter controls the method of allocating physical storage for each physical file member
(CRTPF and CRTSRCPF commands).
If you allocate storage, you can request that the storage for the starting record count for a member be
contiguous. That is, all the records in a member are to physically reside together. If there is not enough
contiguous storage, contiguous storage allocation is not used and an informational message is sent to the
job that requests the allocation, at the time the member is added.
Note: When a physical file is first created, the system always tries to allocate its initial storage
contiguously. The only difference between using CONTIG(*NO) and CONTIG(*YES) is that with
CONTIG(*YES) the system sends a message to the job log if it is unable to allocate contiguous
storage when the file is created. No message is sent when a file is extended after creation,
regardless of what you specified on the CONTIG parameter.
Related reference
Create Physical File (CRTPF) command
Create Source Physical File (CRTSRCPF) command
Record length:
The RCDLEN parameter specifies the length of records in a physical file (CRTPF and CRTSRCPF
commands).
If the file is described to the record level only, then you specify the RCDLEN parameter when the file is
created. This parameter cannot be specified if the file is described using DDS, IDDU, or SQL (the system
automatically determines the length of records in the file from the field-level descriptions).
Related reference
Create Physical File (CRTPF) command
Create Source Physical File (CRTSRCPF) command
Deleted records:
The DLTPCT parameter specifies the percentage of deleted records that each physical file member can
contain before you want the system to send a message to the system history log (CRTPF, CHGPF,
CRTSRCPF, and CHGSRCPF commands).
When a file is closed, the system checks the member to determine the percentage of deleted records. If
the percentage exceeds the value specified in the DLTPCT parameter, a message is sent to the history log.
(For information about processing the history log, see the Control language topic collection. One reason
36
you might want to know when a file reaches a certain percentage of deleted records is to reclaim the
space used by the deleted records. After you receive the message about deleted records, you can run the
Reorganize Physical File Member (RGZPFM) command to reclaim the space. You can also specify to
bypass the deleted records check by using the *NONE value for the DLTPCT parameter. *NONE is the
default for the DLTPCT parameter.
REUSEDLT parameter specifies whether deleted record space should be reused on subsequent write
operations (CRTPF and CHGPF commands). When you specify *YES for the REUSEDLT parameter, all
insert requests on that file try to reuse deleted record space. Reusing deleted record space allows you to
reclaim space used by deleted records without having to issue a RGZPFM command. When the CHGPF
command is used to change a file to reuse deleted records, it might take a long time to run, especially if
the file is large and there are already a lot of deleted records in it. It is important to note the following
items:
v The term arrival order loses its meaning for a file that reuses deleted record space. Records are no
longer always inserted at the end of the file when deleted record space is reused.
v If a new physical file is created with the reuse deleted record space attribute and the file is keyed, the
FIFO or LIFO access path attribute cannot be specified for the physical file, nor can any keyed logical
file with the FIFO or LIFO access path attribute be built over the physical file.
v You cannot change an existing physical file to reuse deleted record space if there are any logical files
over the physical file that specify FIFO or LIFO ordering for duplicate keys, or if the physical file has a
FIFO or LIFO duplicate key ordering.
v Reusing deleted record space should not be specified for a file that is processed as a direct file or if the
file is processed using relative record numbers.
Related concepts
Reorganizing a physical file member on page 212
You can reorganize a physical file member to change the manner in which records are stored on the
i5/OS operating system.
Reusing deleted records on page 101
Sometimes you might want to reuse deleted records for your database files. In this case, you can use the
REUSEDLT parameter.
Related reference
Change Physical File (CHGPF) command
Change Source Physical File (CHGSRCPF) command
Create Physical File (CRTPF) command
Create Source Physical File (CRTSRCPF) command
Physical file capabilities:
File capabilities are used to control which input/output operations are allowed for a database file
independent of database file authority. The ALWUPD and ALWDLT parameters specify whether records
in a physical file can be updated and deleted (CRTPF and CRTSRCPF commands).
Related concepts
Securing database files on page 92
You can secure database files in various ways.
Related reference
Create Physical File (CRTPF) command
Create Source Physical File (CRTSRCPF) command
Source type:
The SRCTYPE parameter specifies the source type for a member in a source file (ADDPFM and CHGPFM
commands).
Database programming
37
The source type determines the syntax checker, prompting, and formatting that are used for the member.
If you specify a unique source type other than the types that are supported on the i5/OS operating
system, such as COBOL and RPG, you must provide the programming to handle the unique type.
If the source type is changed, it is only reflected when the member is subsequently opened; members
currently open are not affected.
Related reference
Add Physical File Member (ADDPFM) command
Change Physical File Member (CHGPFM) command
Implicit physical file journaling:
A physical file can be journaled automatically when it is created.
If a data area called QDFTJRN exists in the same library into which the physical file is created, and if the
user is authorized to the QDFTJRN data area, journaling is started to the journal named in QDFTJRN if
all of the following conditions are met:
v The identified library for the physical file must not be QSYS, QSYS2, QRECOVERY, QSPL, QRCL,
QRPLOBJ, QGPL, QTEMP, or any of the independent auxiliary storage pool (ASP) equivalents of these
libraries. For example, an independent ASP equivalent of the QRPLOBJ library is QRPLxxxxx, where
xxxxx is the number of a primary ASP.
v The journal specified in the QDFTJRN data area must exist, but authority to the specified journal is not
required.
v The first 10 bytes of the QDFTJRN data area must contain the name of the library in which to find the
journal.
v The second 10 bytes must contain the name of the journal.
v The third n bytes must contain the value *FILE. The value *NONE can be used to prevent journaling
from being started.
If the QDFTJRN data area is used, the creation of the physical file cannot be replayed by the Apply
Journaled Changes (APYJRNCHG) command, although it can be replayed by the Apply Journaled
Changes Extend (APYJRNCHGX) command.
Related concepts
Automatically starting journaling
Related tasks
Starting or ending journaling for libraries on page 234
You can journal a library or a list of libraries and, optionally, journal database files that are created,
moved, or restored into the library or the list of libraries.
Related reference
Apply Journaled Changes (APYJRNCHG) command
Apply Journaled Changes Extend (APYJRNCHGX) command
38
This file uses the key field Order (order number) to define the access path. The record format is the
same as the associated physical file ORDHDRP. The record format name for the logical file must be
the same as the record format name for the physical file because no field descriptions are given.
2. Create the logical file. You can use the Create Logical File (CRTLF) command. The following example
shows how the CRTLF command can be typed:
CRTLF
FILE(DSTPRODLB/ORDHDRL)
TEXT('Order header logical file')
As shown, this command uses some defaults. For example, because the SRCFILE and SRCMBR
parameters are not specified, the system uses DDS from the IBM-supplied source file QDDSSRC, and the
source file member name is ORDHDRL (the same as the file name specified on the CRTLF command).
The ORDHDRL file with one member of the same name is placed in the DSTPRODLB library.
You can create multiple logical files over a single physical file. The maximum number of logical files that
can be created over a single physical file is 32KB.
Views are similar to logical files. You can create views using System i Navigator or using the CREATE
VIEW SQL statement.
Related concepts
Working with source files on page 245
You can use various methods to enter and maintain data in a source file.
Identifying which record format to add in a file with multiple formats on page 202
If your application uses a file name instead of a record format name for records to be added to the
database, and if the file used is a logical file with more than one record format, you need to write a
format selector program to determine where a record should be placed in the database.
Creating and using a view
Related reference
Create Logical File (CRTLF) command
CREATE VIEW
Creating a logical file with more than one record format:
A multiple-format logical file allows you to use records from two or more physical files by referring to
only one logical file.
Each record format of such a multiple-format logical file is always associated with one or more physical
files. You can use the same physical file in more than one record format.
The following example shows the data description specifications (DDS) for a physical file, ORDDTLP,
built from a field reference file:
Database programming
39
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* ORDER DETAIL FILE (ORDDTLP) - PHYSICAL FILE RECORD DEFINITION
A
REF(DSTREF)
A
R ORDDTL
TEXT('Order detail record')
A
CUST
R
A
ORDER
R
A
LINE
R
A
ITEM
R
A
QTYORD
R
A
DESCRP
R
A
PRICE
R
A
EXTENS
R
A
WHSLOC
R
A
ORDATE
R
A
CUTYPE
R
A
STATE
R
A
ACTMTH
R
A
ACTYR
R
A
The following example shows the DDS for the ORDHDRP physical file:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* ORDER HEADER FILE (ORDHDRP) - PHYSICAL FILE RECORD DEFINITION
A
REF(DSTREFP)
A
R ORDHDR
TEXT('Order header record')
A
CUST
R
A
ORDER
R
A
ORDATE
R
A
CUSORD
R
A
SHPVIA
R
A
ORDSTS
R
A
OPRNME
R
A
ORDMNT
R
A
CUTYPE
R
A
INVNBR
R
A
PRTDAT
R
A
SEQNBR
R
A
OPNSTS
R
A
LINES
R
A
ACTMTH
R
A
ACTYR
R
A
STATE
R
A
The following example shows how to create a logical file ORDFILL with two record formats. One record
format is defined for order header records from the ORDHDRP physical file; the other is defined for
order detail records from the ORDDTLP physical file.
The logical file record format ORDHDR uses one key field, Order, for sequencing; the logical file record
format ORDDTL uses two keys fields, Order and Line, for sequencing.
The following example shows the DDS for the ORDFILL logical file:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* ORDER TRANSACTION LOGICAL FILE (ORDFILL)
A
R ORDHDR
PFILE(ORDHDRP)
A
K ORDER
A
A
R ORDDTL
PFILE(ORDDTLP)
A
K ORDER
A
K LINE
A
To create the logical file ORDFILL with two associated physical files, use a Create Logical File (CRTLF)
command in the following way:
40
CRTLF
FILE(DSTPRODLB/ORDFILL)
TEXT('Order transaction logical file')
The DDS source is in the ORDFILL member of the QDDSSRC file. The ORDFILL file with a member of
the same name is placed in the DSTPRODLB library. The access path for the ORDFILL logical file
member arranges records from both the ORDHDRP and ORDDTLP files. Record formats for both
physical files are keyed on Order as the common field. Because of the order in which they were specified
in the logical file description, they are merged in Order sequence with duplicates between files retrieved
first from the ORDHDRP header file and second from the ORDDTLP detail file. Because FIFO, LIFO, or
FCFO are not specified, the order of retrieval of duplicate keys in the same file is not guaranteed.
Note: In some circumstances, it is better to use multiple logical files, rather than to use a multiple-format
logical file. For example, when keyed access is used with a multiple-format logical file, it is
possible to experience poor performance if one of the files has very few records. Even though there
are multiple formats, the logical file has only one index, with entries from each physical file.
Depending on the kind of processing being done by the application program (for example, using
RPG SETLL and READE with a key to process the small file), the system might have to search all
index entries in order to find an entry from the small file. If the index has many entries, searching
the index might take a long time, depending on the number of keys from each file and the
sequence of keys in the index. (If the small file has no records, performance is not affected, because
the system can take a fast path and avoid searching the index.)
Controlling how records are retrieved in a logical file with multiple formats:
Key field definitions are required in a logical file with more than one record format.
Each record format can have its own key field definition. The record format key fields can be defined to
merge the records from different formats. Each record format does not have to contain every key field in
the key.
Consider the following records.
Table 3. Header record format
Record
Order
Cust
Ordate
1
2
41882
32133
41394
28674
050688
060288
Order
Line
Item
Qtyord
Extens
A
B
C
D
E
32133
32133
41882
32133
41882
01
03
02
02
01
46412
12481
46412
14201
08265
25
4
10
110
40
125000
001000
050000
454500
008000
In data description specifications (DDS), the header record format is defined before the detail record
format. If the access path uses the Order field as the first key field for both record formats and the Line
field as the second key field for only the second record format, both in ascending sequence, the order of
the records in the access path is:
v Record 2
v Record A
v Record D
v Record B
Database programming
41
v Record 1
v Record E
v Record C
Note: Records with duplicate key values are arranged first in the sequence in which the physical files are
specified. Then, if duplicates still exist within a record format, the duplicate records are arranged
in the order specified by the FIFO, LIFO, or FCFO keyword. For example, if the logical file
specified the DDS keyword FIFO, then duplicate records within the format would be presented in
first-in-first-out sequence.
For logical files with more than one record format, you can use the *NONE DDS function for key fields
to separate records of one record format from records of other record formats in the same access path.
Generally, records from all record formats are merged based on key values. However, if *NONE is
specified in DDS for a key field, only the records with key fields that appear in all record formats before
the *NONE are merged. When such records are retrieved by key from more than one record format, only
key fields that appear in all record formats before the *NONE are used. To increase the number of key
fields that are used, limit the number of record formats considered.
The logical file in the following example contains three record formats, each associated with a different
physical file:
Record format
Physical file
Key fields
EMPMSTR
EMPHIST
EMPEDUC
EMPMSTR
EMPHIST
EMPEDUC
Note: All record formats have one key field in common, the Empnbr field.
The DDS for this example is:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
A
K EMPNBR 1
A
A
K EMPNBR 2
A
K EMPDAT
A
A
K EMPNBR 3
A
K *NONE
A
K CLSNBR
A
*NONE is assumed for the second and third key fields for EMPMSTR and the third key field for
EMPHIST because no key fields follow these key field positions.
The following table shows the arrangement of the records.
Empnbr
426
426
426
426
427
427
427
42
Empdat
Clsnbr
6/15/74
412
520
9/30/75
412
*NONE serves as a separator for the record formats EMPHIST and EMPEDUC. All the records for
EMPHIST with the same Empnbr field are grouped together and sorted by the Empdat field. All the
records for EMPEDUC with the same Empnbr field are grouped together and sorted by the Clsnbr field.
Note: Because additional key field values are placed in the key sequence access path to guarantee the
above sequencing, duplicate key values are not predictable.
Related concepts
DDS concepts
Controlling how records are added to a logical file with multiple formats:
To add a record to a multiple-format logical file, you need to identify the member of the based-on
physical file to which you want the record to be written.
If the application you are using does not allow you to specify a particular member within a format, each
of the formats in the logical file needs to be associated with a single physical file member. If one or more
of the based-on physical files contain more than one member, you need to use the DTAMBRS parameter,
described in Defining logical file members, to associate a single member with each format. Finally, give
each format in the multiple format logical file a unique name. If the multiple format logical file is defined
in this way, then when you specify a format name on the add operation, you target a particular physical
file member into which the record is added.
When you add records to a multiple-format logical file and your application program uses a file name
instead of a record format name, you need to write a format selector program.
Related concepts
Identifying which record format to add in a file with multiple formats on page 202
If your application uses a file name instead of a record format name for records to be added to the
database, and if the file used is a logical file with more than one record format, you need to write a
format selector program to determine where a record should be placed in the database.
Defining logical file members:
You can define members in a logical file to separate the data into logical groups. A logical file member
can be associated with one or several physical file members.
The following figure illustrates this concept.
The record formats used with all logical members in a logical file must be defined in data description
specifications (DDS) when the file is created. If new record formats are needed, another logical file or
record format must be created.
Database programming
43
The attributes of an access path are determined by the information specified in DDS and on commands
when the logical file is created. The selection of data members is specified in the DTAMBRS parameter on
the Create Logical File (CRTLF) and Add Logical File Member (ADDLFM) commands.
When a logical file is defined, the physical files used by the logical file are specified in DDS by the
record-level PFILE or JFILE keyword. If multiple record formats are defined in DDS, a PFILE keyword
must be specified for each record format. You can specify one or more physical files for each PFILE
keyword.
When a logical file is created or a member is added to the file, you can use the DTAMBRS parameter on
the CRTLF or the ADDLFM command to specify which members of the physical files used by the logical
file are to be used for data. *NONE can be specified as the physical file member name if no members
from a physical file are to be used for data.
In the following example, the logical file has two record formats defined:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
00010A
R LOGRCD2
PFILE(PF1 PF2)
A
.
A
.
A
.
00020A
R LOGRCD3
PFILE(PF1 PF2 PF3)
A
.
A
.
A
.
A
If the DTAMBRS parameter is specified on the CRTLF or ADDLFM command as in the following
example:
DTAMBRS((PF1 M1) (PF2 (M1 M2)) (PF1 M1) (PF2 (*NONE)) (PF3 M3))
Record format LOGRCD2 is associated with physical file member M1 in PF1 and M1 and M2 in file PF2.
Record format LOGRCD3 is associated with M1 in PF1 and M3 in PF3. No members in PF2 are
associated with LOGRCD3. If the same physical file name is specified on more than one PFILE keyword,
each occurrence of the physical file name is handled as a different physical file.
If a library name is not specified for the file on the PFILE keyword, the library list is used to find the
physical file when the logical file is created. The physical file name and the library name then become
part of the logical file description. The physical file names and the library names specified on the
DTAMBRS parameter must be the same as those stored in the logical file description.
If a file name is not qualified by a library name on the DTAMBRS parameter, the library name defaults to
*CURRENT, and the system uses the library name that is stored in the logical file description for the
respective physical file name. This library name is either the library name that was specified for the file
on the PFILE DDS keyword or the name of the library in which the file was found using the library list
when the logical file was created.
When you add a member to a logical file, you can specify data members as follows:
v Specify no associated physical file members (DTAMBRS (*ALL) default). The logical file member is
associated with all the physical file members of all physical files in all the PFILE keywords specified in
the logical file DDS.
v Specify the associated physical file members (DTAMBRS parameter). If you do not specify library
names, the logical file determines the libraries used. When more than one physical file member is
specified for a physical file, the member names should be specified in the order in which records are to
be retrieved when duplicate key values occur across those members. If you do not want to include any
members from a particular physical file, either do not specify the physical file name or specify the
44
physical file name and *NONE for the member name. This method can be used to define a logical file
member that contains a subset of the record formats defined for the logical file.
You can use the Create Logical File (CRTLF) command to create the first member when you create the
logical file. Subsequent members must be added using the Add Logical File Member (ADDLFM)
command. However, if you are going to add more members, you must specify more than 1 for the
MAXMBRS parameter on the CRTLF command. The following example of adding a member to a logical
file uses the CRTLF command.
CRTLF
FILE(DSTPRODLB/ORDHDRL)
MBR(*FILE) DTAMBRS(*ALL)
TEXT('Order header logical file')
*FILE is the default for the MBR parameter and means that the name of the member is the same as the
name of the file. All the members of the associated physical file (ORDHDRP) are used in the logical file
(ORDHDRL) member. The text description is the text description of the member.
v Describe your own record format by listing the field names you want to include. You can specify the
field names in a different order, rename fields using the RENAME keyword, combine fields using the
CONCAT keyword, and use specific positions of a field using the SST keyword. You can also override
attributes of the fields by specifying different attributes in the logical file. Consider this example of a
simple logical file with fields specified::
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
A
R ORDHDR
PFILE(ORDHDRP)
A
ORDER
A
CUST
A
SHPVIA
A
v Specify the name of a database file for the file name on the FORMAT keyword. The record format is
shared from this database file by the logical file being described. The file name can be qualified by a
library name. If a library name is not specified, the library list is used to find the file. The file must
exist when the file you are describing is created. In addition, the record format name you specify in the
logical file must be the same as one of the record format names in the file you specify on the FORMAT
keyword. Consider this example:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
A
R CUSRCD
PFILE(CUSMSTP)
A
FORMAT(CUSMSTL)
A
45
v
v
v
v
When a record is read from the logical file, the fields from the physical file are changed to match the
logical file description. If the program updates or adds a record, the fields are changed back. For an add
or update operation using a logical file, the program must supply data that conforms with the format
used by the logical file.
The following chart shows what types of data mapping are valid between physical and logical files.
Physical file
data type
Zoned
Packed
Binary
Floating
point
Date
Time
Timestamp
Character or
Hexadecimal
Valid
See Notes
1
Not valid
Not valid
Not valid
Not
valid
Not
valid
Not valid
Zoned
See Notes 1
Valid
Valid
See Notes
2
Valid
Not
valid
Not
valid
Not Valid
Packed
Not valid
Valid
Valid
See Notes
2
Valid
Not
valid
Not
valid
Not valid
46
Physical file
data type
Zoned
Packed
Binary
Floating
point
Date
Time
Timestamp
Binary
Not valid
See Notes
2
See Notes
2
See Notes
3
See Notes
2
Not
valid
Not
valid
Not valid
Floating point
Not valid
Valid
Valid
See Notes
2
Valid
Not
valid
Not
valid
Not valid
Date
Not valid
Valid
Not valid
Not valid
Not valid
Valid
Not
valid
Not valid
Time
Not valid
Valid
Not valid
Not valid
Not valid
Not
valid
Valid
Not valid
Timestamp
Not valid
Not valid
Not valid
Not valid
Not valid
Valid
Valid
Valid
Notes:
1. Valid only if the number of characters or bytes equals the number of digits.
2. Valid only if the binary field has zero decimal positions.
3. Valid only if both binary fields have the same number of decimal positions.
Related concepts
Double-byte character set considerations on page 287
A double-byte character set (DBCS) is a character set that represents each character with 2 bytes. The
database on the i5/OS operating system supports DBCS.
Describing field use for logical files:
You can specify that the fields in a logical file be input-only, both (input/output), or neither fields.
To describe field use for a logical file, specify one of the following items in position 38:
Entry
Meaning
Blank For simple or multiple format logical files, defaults to B (both) For join logical files, defaults to I
(input only).
B
Both input and output allowed; not valid for join logical files.
Neither input nor output; valid only for join logical files.
Note: The usage value (in position 38) is not used on a reference function. When another file refers to a
field (using a REF or REFFLD keyword) in a logical file, the usage value is not copied into that
file.
Describing field use for logical files: Both:
A both field can be used for both input and output operations. Your program can read data from the field
and write data to the field.
Both fields are not valid for join logical files because join logical files are read-only files.
Describing field use for logical files: Input only:
An input-only field can be used for read operations only. Your program can read data from the field, but
cannot update the field.
Database programming
47
Typical cases of input-only fields are key fields (to reduce maintenance of access paths by preventing
changes to key field values), sensitive fields that a user can see but not update (for example, salary), and
fields for which either the translation table (TRNTBL) keyword or the substring (SST) keyword is
specified.
If your program updates a record in which you have specified input-only fields, the input-only fields are
not changed in the file. If your program adds a record that has input-only fields, the input-only fields
take default values (DFT keyword).
Describing field use for logical files: Neither:
A neither field is used neither for input nor for output.
A neither field is valid only for join logical files. It can be used as a join field in a join logical file, but
your program cannot read or update a neither field.
Use neither fields when the attributes of join fields in the physical files do not match. In this case, one or
both join fields must be defined again. However, you cannot include these redefined fields in the record
format (the application program does not see the redefined fields.) Therefore, redefined join fields can be
coded N so that they do not appear in the record format.
A field with N in position 38 does not appear in the buffer used by your program. However, the field
description is displayed with the Display File Field Description (DSPFFD) command.
Neither fields cannot be used as select/omit or key fields.
Related reference
Example 5: Describing fields that never appear in the record format on page 72
Neither fields (where N is specified in position 38) can be used in a join logical file for neither input nor
output. Neither fields are not included in the record format. This example shows how to describe such
fields that never appear in the record format.
Deriving new fields from existing fields:
Fields in a logical file can be derived from fields in a physical file on which the logical file is based or
from fields in the same logical file.
For example, you can concatenate, using the CONCAT keyword, two or more fields from a physical file
to make them appear as one field in the logical file. Likewise, you can divide one field in the physical file
to make it appear as multiple fields in the logical file with the SST keyword.
Concatenated fields:
You can use the Concatenate (CONCAT) DDS keyword to combine two or more fields from a physical
file record format into one field in a logical file record format.
For example, a physical file record format contains the fields Month, Day, and Year. For a logical file, you
concatenate these fields into one field, Date.
The field length for the resulting concatenated field is the sum of the lengths of the included fields
(unless the fields in the physical file are binary or packed decimal, in which case they are changed to
zoned decimal). The field length of the resulting field is automatically calculated by the system. A
concatenated field can have:
v Column headings
v Validity checking
v Text description
48
In this example, the logical file record format includes the separate fields of Month, Day, and Year, as well
as the concatenated Date field. Any of the following formats can be used:
v A format with the separate fields of Month, Day, and Year
v A format with only the concatenated Date field
v A format with the separate fields Month, Day, Year and the concatenated Date field
When both separate and concatenated fields exist in the format, any updates to the fields are processed in
the sequence in which the DDS is specified. In the previous example, if the Date field contained 103188
and the Month field is changed to 12, when the record is updated, the month in the Date field would be
used. The updated record would contain 103188. If the Date field were specified first, the updated record
would contain 123188.
Database programming
49
Concatenated fields can also be used as key fields and select/omit fields.
Substring fields:
You can use the Substring (SST) DDS keyword to specify which fields (character, hexadecimal, or zoned
decimal) are in a substring.
You can also use substring with a packed field in a physical file by specifying S (zoned decimal) as the
data type in the logical file.
For example, assume that you defined the Date field in physical file PF1 as 6 characters in length. You can
describe the logical file with three fields, each 2 characters in length. You can use the SST keyword to
define MM as 2 characters starting in position 1 of the Date field, DD as 2 characters starting in position 3
of the Date field, and YY as 2 characters starting in position 5 of the Date field.
The following example shows the field descriptions in data description specifications (DDS) for these
substring fields. The SST keyword is used to specify the field to substring.
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC1
PFILE(PF1)
A
A
MM
I
SST(DATE 1 2)
A
DD
I
SST(DATE 3 2)
A
YY
I
SST(DATE 5 2)
A
Note: The starting position of the substring is specified according to its position in the field being
operated on (Date), not according to its position in the file. The I in the Usage column indicates
input-only.
Substring fields can also be used as key fields and select/omit fields.
Renamed fields:
You can use the Rename (RENAME) DDS keyword to name a field in a logical file differently than in a
physical file.
You might want to rename a field in a logical file because the program uses a different field name or
because the original field name does not conform to the naming restrictions of your high-level language.
Translated fields:
You can use the Translation Table (TRNTBL) DDS keyword to specify a translation table for a field in a
logical file.
When you read a logical file record and a translation table was specified for one or more fields in the
logical file, the system translates the data from the field value in the physical file to the value determined
by the translation table.
Describing floating-point fields in logical files:
You can use floating-point fields as mapped fields in logical files.
A floating-point field can be mapped to or from a zoned, packed, zero-precision binary, or another
floating-point field. You cannot map between a floating-point field and a nonzero-precision binary field, a
character field, a hexadecimal field, or a double-byte character set (DBCS) field.
50
Mapping between floating-point fields of different precision or between floating-point fields and other
numeric fields can result in rounding or a loss of precision. For example, mapping a double-precision
floating-point number to a single-precision floating-point number can result in rounding, depending on
the particular number involved and its internal representation. Binary floating-point rounding is to the
nearest (even) bit. The result always contains as much precision as possible. A loss of precision can also
occur between two decimal numbers if the number of digits of precision is decreased.
You can inadvertently change the value of a field that your program did not explicitly change. For binary
floating-point fields, this can occur if a physical file has a double-precision field that is mapped to a
single-precision field in a logical file, and you issue an update for the record through the logical file. If
the internal representation of the binary floating-point number causes it to be rounded when it is mapped
to the logical file, then updating the logical record causes a permanent loss of precision in the physical
file. If the rounded number is the key of the physical record, then the sequence of records in the physical
file can also change.
A fixed-point numeric field can also be updated inadvertently if the precision is decreased in the logical
file.
DB2 for i supports both binary floating-point and decimal floating-point fields. Although DDS cannot be
used to specify a decimal floating-point field type, you can create a logical file with a decimal
floating-point field by sharing the format of an SQL table. Decimal floating-point fields can be mapped to
or from the same field types as binary floating point. Decimal floating-point rounding for traditional
system interfaces is round to nearest, ties to even. For more information about decimal floating point
support, see the DB2 for i SQL reference topic collection.
v Encoded vector access path specification. You define the encoded vector access path with the SQL
CREATE INDEX statement.
v Arrival sequence access path specification. Specify no key fields. You can specify only one physical file
on the PFILE keyword (and only one of the physical files members when you add the logical file
member).
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R CUSRCD
PFILE(CUSMSTP)
v Previously defined keyed-sequence access path specification (for simple and multiple-format logical
files only). Specify the REFACCPTH keyword at the file level to identify a previously created database
file whose access path and select/omit specifications are to be copied to this logical file. You cannot
specify individual key or select/omit fields with the REFACCPTH keyword.
Note: Even though the specified files access path specifications are used, the system determines which
files access path, if any, will actually be shared. The system always tries to share access paths,
regardless of whether the REFACCPTH keyword is used.
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
REFACCPTH(DSTPRODLIB/ORDHDRL)
A
R CUSRCD
PFILE(CUSMSTP)
When you define a record format for a logical file that shares key field specifications of another files
access path (using the DDS keyword, REFACCPTH), you can use any fields from the associated physical
Database programming
51
file record format. These fields do not have to be used in the file that describes the access path. However,
all key and select/omit fields used in the file that describes the access path must be used in the new
record format.
Related reference
CREATE INDEX
Selecting and omitting records for logical files:
You can select and omit records for a logical file. This helps exclude records from a file for processing
convenience or for security.
The process of selecting and omitting records is based on comparisons identified in position 17 of the
DDS form for the logical file, and is similar to a series of comparisons coded in a high-level language
program.
For example, in a logical file that contains order detail records, you can specify that the only records you
want to use are those in which the quantity ordered is greater than the quantity shipped. All other
records are omitted from the access path. The omitted records remain in the physical file but are not
retrieved for the logical file. If you are adding records to the physical file, all records are added, but only
selected records that match the select/omit criteria can be retrieved through the select/omit access path.
In DDS, to specify select or omit, you specify an S (select) or O (omit) in position 17 of the DDS form.
You then name the field (in positions 19 through 28) that will be used in the selection or omission
process. In positions 45 through 80 you specify the comparison.
Note: Select/omit specifications appear after key specifications (if keys are specified).
Records can be selected and omitted by several types of comparisons:
v VALUES. The contents of the field are compared to a list of not more than 100 values. If a match is
found, the record is selected or omitted. In the following example, a record is selected if one of the
values specified in the VALUES keyword is found in the Itmnbr field.
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
S ITMNBR
VALUES(301542 306902 382101 422109 +
A
431652 486592 502356 556608 590307)
A
v RANGE. The contents of the field are compared to lower and upper limits. If the contents are greater
than or equal to the lower limit and less than or equal to the upper limit, the record is selected or
omitted. In the following example, all records with a range 301000 through 599999 in the Itmnbr field
are selected.
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
S ITMNBR
RANGE(301000 599999)
A
v CMP. The contents of a field are compared to a value or the contents of another field. Valid comparison
codes are EQ, NE, LT, NL, GT, NG, LE, and GE. If the comparison is met, the record is selected or
omitted. In the following example, a record is selected if its Itmnbr field is less than or equal to 599999:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
S ITMNBR
CMP(LE 599999)
A
The value for a numeric field for which the CMP, VALUES, or RANGE keyword is specified is aligned
based on the decimal positions specified for the field and filled with zeros where necessary. If decimal
positions were not specified for the field, the decimal point is placed to the right of the farthest right digit
in the value. For example, for a numeric field with length 5 and decimal position 2, the value 1.2 is
interpreted as 001.20 and the value 100 is interpreted as 100.00.
52
The status of a record is determined by evaluating select/omit statements in the sequence you specify
them. If a record qualifies for selection or omission, subsequent statements are ignored.
Normally the select and omit comparisons are treated independently of one another; the comparisons are
ORed together. That is, if the select or omit comparison is met, the record is either selected or omitted. If
the condition is not met, the system proceeds to the next comparison. To connect comparisons together,
you leave a space in position 17 of the DDS form. Then, all the comparisons that were connected in this
fashion must be met before the record is selected or omitted. That is, the comparisons are ANDed
together.
The fewer comparisons, the more efficient the task is. So, when you have several select/omit
comparisons, try to specify the one that selects or omits the most records first.
The following examples show ways to code select/omit functions. In these examples, few records exist
for which the Rep field is JSMITH. The examples show how to use DDS to select all the records before
1988 for a sales representative named JSMITH in the state of New York. All give the same results with
different efficiency. 3 shows the most efficient way.
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
S ST
CMP(EQ 'NY')
1
A
REP
CMP(EQ 'JSMITH')
A
YEAR
CMP(LT 88)
A
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
O YEAR
CMP(GE 88)
2
A
S ST
CMP(EQ 'NY')
A
REP
CMP(EQ 'JSMITH')
A
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
O REP
CMP(NE 'JSMITH')
3
A
O ST
CMP(NE 'NY')
A
S YEAR
CMP(LT 88)
A
All records must be compared with all of the select fields St, Rep, and Year before they can be
selected or omitted.
All records are compared with the Year field. Then, the records before 1988 must be compared
with the St and Rep fields.
All records are compared with the Rep field. Then, only the few for JSMITH are compared with
the St field. Then, the few records that are left are compared to the Year field.
As another example, assume that you want to select the following items:
v All records for departments other than Department 12.
v Only those records for Department 12 that contain an item number 112505, 428707, or 480100. No other
records for Department 12 are to be selected.
If you create the preceding example with a sort sequence table, the select/omit fields are translated
according to the sort table before the comparison. For example, with a sort sequence table using shared
weightings for uppercase and lowercase, NY and ny are equal.
The following diagram shows the logic of this example.
Database programming
53
It is possible to have an access path with select/omit values and process the file in arrival sequence. For
example, a high-level language program can specify that the keyed access path is to be ignored. In this
case, every record is read from the file in arrival sequence, but only those records meeting the select/omit
values specified in the file are returned to the high-level language program.
A logical file with key fields and select/omit values specified can be processed in arrival sequence or
using relative record numbers randomly. Records omitted by the select/omit values are not processed.
That is, if an omitted record is requested by relative record number, the record is not returned to the
high-level language program.
The system does not ensure that any additions or changes through a logical file will allow the record to
be accessed again in the same logical file. For example, if the selection values of the logical file specifies
only records with an A in Fld1 and the program updates the record with a B in Fld1, the program cannot
retrieve the record again using this logical file.
Note: You cannot select or omit based on the values of a floating-point field.
The two kinds of select/omit operations are access path select/omit and dynamic select/omit. The
default is access path select/omit. The select/omit specifications themselves are the same in each kind,
but the system actually does the work of selecting and omitting records at different times.
You can also use the Open Query File (OPNQRYF) command to select or omit records.
Related concepts
DDS concepts
Access path select/omit:
54
With the access path select/omit operation, the access path only contains keys that meet the select/omit
values specified for the logical file.
When you specify key fields for a logical file, an access path is kept for the file and maintained by the
system when you add or update records in the physical files used by the logical file. The only index
entries in the access path are those that meet the select/omit values.
Dynamic select/omit:
With the dynamic select/omit operation, the system only returns those records that meet the select/omit
values when a program reads records from the file. That is, the actual select/omit processing is done
when records are read by a program, rather than when the records are added or changed.
However, the keyed sequence access path contains all the keys, not just keys from selected records.
Access paths using dynamic select/omit allow more access path sharing, which can improve
performance.
To specify dynamic select/omit, use the Dynamic selection (DYNSLT) keyword. With dynamic
select/omit, key fields are not required.
If you have a file that is updated frequently and read infrequently, you might not need to update the
access path for select/omit purposes until your program reads the file. In this case, dynamic select/omit
might be the correct choice. The following example helps describe this.
You use a code field (A=active, I=inactive), which is changed infrequently, to select/omit records. Your
program processes the active records and the majority (over 80%) of the records are active. It can be more
efficient to use DYNSLT to dynamically select records at processing time rather than perform access path
maintenance when the code field is changed.
Related concepts
Sharing existing access paths between logical files
When two or more logical files are based on the same physical files with the same key fields in the same
order, they automatically share the same keyed sequence access path.
Selecting and omitting logical file records using the Open Query File (OPNQRYF) command:
As an alternative to using DDS, you can select and omit records for a logical file by specifying the
QRYSLT parameter on the Open Query File (OPNQRYF) command.
The open data path created by the OPNQRYF command is like a temporary logical file; that is, it is
automatically deleted when it is closed. A logical file, however, remains in existence until you specifically
delete it.
Related concepts
Using Open Query File (OPNQRYF) command on page 123
By using the Open Query File (OPNQRYF) command, you can open a file to a set of database records
that satisfies a database query request.
Sharing existing access paths between logical files:
When two or more logical files are based on the same physical files with the same key fields in the same
order, they automatically share the same keyed sequence access path.
When access paths are shared, the amount of system activity required to maintain the access paths and
the amount of auxiliary storage used by the files are reduced. So when a logical file with a keyed
sequence access path is created, the system always tries to share an existing access path. For access path
sharing to occur, an access path that satisfies the following conditions must exist on the system:
Database programming
55
v The logical file member to be added must be based on the same physical file members that the existing
access path is based on.
v The length, data type, and number of decimal positions specified for each key field must be identical
in both the new file and the existing file.
v If the FIFO, LIFO, or FCFO keyword is not specified, the new file can have fewer key fields than the
existing access paths. That is, a new logical file can share an existing access path if the beginning part
of the key is identical. However, when a file shares a partial set of keys from an existing access path,
any record updates made to fields that are part of the set of keys for the shared access path might
change the record position in that access path.
v The attributes of the access path (such as UNIQUE, LIFO, FIFO, or FCFO) and the attributes of the key
fields (such as DESCEND, ABSVAL, UNSIGNED, and SIGNED) must be identical.
Exceptions:
1. A FIFO access path can share an access path in which the UNIQUE keyword is specified if all the
other requirements for access path sharing are met.
2. A UNIQUE access path can share a FIFO access path that needs to be rebuilt (for example, has
*REBLD maintenance specified), if all the other requirements for access path sharing are met.
v If the new logical file has select/omit specifications, they must be identical to the select/omit
specifications of the existing access path. However, if the new logical file specifies DYNSLT, it can
share an existing access path if the existing access path has either:
The dynamic select (DYNSLT) keyword specified
No select/omit keywords specified
v The alternative collating sequence (ALTSEQ keyword) and the translation table (TRNTBL keyword) of
the new logical file member, if any, must be identical to the alternative collating sequence and
translation table of the existing access path.
Note: Logical files that contain concatenated or substring fields cannot share access paths with physical
files.
The owner of any access path is the logical file member that originally created the access path. For a
shared access path, if the logical member owning the access path is deleted, the first member to share the
access path becomes the new owner. The FRCACCPTH, MAINT, and RECOVER parameters on the
Create Logical File (CRTLF) command need not match the same parameters on an existing access path for
that access path to be shared. When an access path is shared by several logical file members, and the
FRCACCPTH, MAINT, and RECOVER parameters are not identical, the system maintains the access path
by the most restrictive value for each of the parameters specified by the sharing members. The following
list illustrates how this occurs:
v MBRA specifies:
FRCACCPTH (*NO)
MAINT (*IMMED)
RECOVER (*AFTIPL)
v MBRB specifies:
v FRCACCPTH (*YES)
MAINT (*DLY)
RECOVER (*NO)
v System does:
FRCACCPTH (*YES)
MAINT (*IMMED)
RECOVER (*AFTIPL)
Access path sharing does not depend on sharing between members; therefore, it does not restrict the
order in which members can be deleted.
56
The Display File Description (DSPFD) and Display Database Relations (DSPDBR) commands show access
path sharing relationships.
Related concepts
Arranging duplicate keys on page 89
If you do not specify the Unique (UNIQUE) keyword in data description specifications (DDS), you can
specify how the system stores records with duplicate key values.
Example: Implicitly shared access paths:
This example shows how to implicitly share an access path between logical files.
Two logical files, LFILE1 and LFILE2, are built over the physical file PFILE. LFILE1, which was created
first, has two key fields, KFD1 and KFD2. LFILE2 has three key fields, KFD1, KFD2, and KFD3. The two
logical files use two of the same key fields, but no access path is shared because the logical file with three
key fields was created after the file with two key fields.
Table 5. Physical and logical files before save and restore
Description
Access path
Fields
KFD1, KFD2
KFD1, KFD2, KFD3, F, C, A
An application uses LFILE1 to access the records and to change the KFD3 field to blank if it contains a C,
and to a C if it is blank. This application does not cause any unexpected results because the access paths
are not shared. However, after the physical file and both logical files are saved and restored, the program
appears to do nothing and takes longer to process.
Unless you change the way you restore the logical files (for example, if you restore LFILE1 and LFILE2
separately with the Restore Object (RSTOBJ) command), the system restores the logical file with the
largest number of keys first or does not build unnecessary access paths.
Because it has three key fields, LFILE2 is restored first. After recovery, LFILE1 implicitly shares the access
path for LFILE2. Users who do not understand implicitly shared access paths do not realize that when
they use LFILE1 after a recovery, they are really using the key for LFILE2.
Table 6. Physical and logical files after save and restore. Note that the only difference from before the save and
restore is that the logical files now share the same access path.
Description
Access path
Fields
KFD1
KFD2
KFD3
001
002
003
004
01
01
01
01
01
01
01
01
<blank>
<blank>
<blank>
<blank>
The first record is read through the first key of 0101<blank> and changed to 0101C. The records now look
like this.
Database programming
57
Relative record
KFD1
KFD2
KFD3
001
002
003
004
01
01
01
01
01
01
01
01
C
<blank>
<blank>
<blank>
When the application issues a get next key, the next higher key above 0101<blank> is 0101C. This is the
record that was just changed. However, this time the application changes the KFD3 field from C to blank.
Because the user does not understand implicit access path sharing, the application accesses and changes
every record twice. The end result is that the application takes longer to run, and the records look like
they have not changed.
58
In general, these examples include a picture of the files, data description specifications (DDS) for the files,
and sample data. For example 1, several cases are given that show how to join files in different situations
(when data in the physical files varies).
In these examples, for convenience and ease of recognition, join logical files are shown with the label JLF,
and physical files are illustrated with the labels PF1, PF2, and PF3.
Related concepts
Joining data from more than one table
Example 1: Joining two physical files:
This example shows how to create a join logical file that joins two physical files.
In this example, the join logical file (JLF) has field Employee number, Name, and Salary. Physical file 1 (PF1)
has Employee number and Name, while physical file 2 (PF2) has Employee number and Salary. Employee
number is common to both physical files (PF1 and PF2), but Name is found only in PF1, and Salary is
found only in PF2.
With a join logical file, the application program does one read operation (to the record format in the join
logical file) and gets all the data needed from both physical files. Without the join specification, the
logical file would contain two record formats, one based on PF1 and the other based on PF2, and the
application program would have to do two read operations to get all the needed data from the two
physical files. Thus, join provides more flexibility in designing your database.
However, a few restrictions are placed on join logical files:
v You cannot change a physical file through a join logical file. To do update, delete, or write (add)
operations, you must create a second multiple format logical file and use it to change the physical files.
You can also use the physical files, directly, to do the change operations.
v You cannot use data file utility (DFU) to display a join logical file.
v You can specify only one record format in a join logical file.
v The record format in a join logical file cannot be shared.
v A join logical file cannot share the record format of another file.
v Key fields must be fields defined in the join record format and must be fields from the first file
specified on the JFILE keyword (which is called the primary file).
v Select/omit fields must be fields defined in the join record format, but can come from any of the
physical files.
v Commitment control cannot be used with join logical files.
This example uses the following DDS:
JLF
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R JOINREC
JFILE(PF1 PF2)
A
J
JOIN(PF1 PF2)
A
JFLD(NBR NBR)
Database programming
59
A
A
A
A
A
NBR
NAME
SALARY
K NBR
JREF(PF1)
PF1
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC1
A
NBR
10
A
NAME
20
A
K NBR
A
PF2
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC2
A
NBR
10
A
SALARY
7 2
A
K NBR
A
The following list describes the DDS for the join logical file in example 1:
The record-level specification identifies the record format name used in the join logical file.
R
Identifies the record format. Only one record format can be placed in a join logical file.
JFILE
Replaces the PFILE keyword used in simple and multiple-format logical files. You must specify at
least two physical files. The first file specified on the JFILE keyword is the primary file. The other
files specified on the JFILE keyword are secondary files.
The join specification describes the way a pair of physical files is joined. The second file of the pair is
always a secondary file, and there must be one join specification for each secondary file.
J
Identifies the start of a join specification. You must specify at least one join specification in a join
logical file. A join specification ends at the first field name specified in positions 19 through 28 or
at the next J specified in position 17.
JOIN
Identifies which two files are joined by the join specification. If only two physical files are joined
by the join logical file, the JOIN keyword is optional.
JFLD
Identifies the join fields that join records from the physical files specified on the JOIN keyword.
JFLD must be specified at least once for each join specification. The join fields are fields common
to the physical files. The first join field is a field from the first file specified on the JOIN keyword,
and the second join field is a field from the second file specified on the JOIN keyword.
Join fields, except character type fields, must have the same attributes (data type, length, and
decimal positions). If the fields are character type fields, they do not need to have the same
length. If you are joining physical file fields that do not have the same attributes, you can
redefine them for use in a join logical file.
The field-level specification identifies the fields included in the join logical file.
Field names
Specifies which fields (in this example, Nbr, Name, and Salary) are used by the application
program. At least one field name is required. You can specify any field names from the physical
files used by the logical file. You can also use keywords like RENAME, CONCAT, or SST as you
would in simple and multiple format logical files.
JREF
60
In the record format (which follows the join specification level and precedes the key field level, if
any), the field names must uniquely identify which physical file the field comes from. In this
example, the Nbr field occurs in both PF1 and PF2. Therefore, the JREF keyword is required to
identify the file from which the Nbr field description will be used.
The key field level specification is optional, and includes the key field names for the join logical file.
K
Identifies a key field specification. The K appears in position 17. Key field specifications are
optional.
61
v For those records in the primary file that do not have a matching record in the secondary file, the
system adds the default value fields for the secondary file and continues the join operation. You can
use the DFT keyword in the physical file to define which defaults are used. See Case 2A: A record
missing in the secondary file (JDFTVAL keyword not specified) on page 63 and Case 2B: A record
missing in the secondary file (JDFTVAL keyword specified) on page 63.
Note: If the DFT keyword is specified in the secondary file, the value specified for the DFT keyword is
used in the join. The result would be at least one join record for each primary record.
v If a record exists in the secondary file, but the primary file has no matching value, no record is
returned to your program. A second join logical file can be used that reverses the order of primary and
secondary files to determine if secondary file records exist with no matching primary file records.
If you do not specify the JDFTVAL keyword:
v If a matching record in a secondary file exists, the system joins to the secondary, or multiple
secondaries. The result is one or more records for each record in the primary file.
v If a matching record in a secondary file does not exist, the system does not return a record.
Note: When the JDFTVAL is not specified, the system returns a record only if a match is found in every
secondary file for a record in the primary file.
In the following examples, cases 1 through 4 describe sequential read operations, and case 5 describes
reading by key.
Case 1: Matching records in primary and secondary files:
This example join logical file contains a single record for each record in the primary file because each
record in the primary file has a match in the secondary file.
Assume that a join logical file is specified as in Example 1: Joining two physical files on page 59, and
four records are contained in both PF1 and PF2, as shown in the following two tables.
Table 7. Physical file 1 (PF1)
Employee number
Name
235
Anne
440
Doug
500
Mark
729
Sue
Salary
235
1700.00
440
950.50
500
2100.00
729
1400.90
The program does four read operations and gets the following records.
Table 9. Join logical file (JLF)
Employee number
Name
Salary
235
Anne
1700.00
62
Name
Salary
440
Doug
950.50
500
Mark
2100.00
729
Sue
1400.90
Case 2A: A record missing in the secondary file (JDFTVAL keyword not specified):
This example join logical file misses one record in the primary file because it does not have a match in
the secondary file and the Join Default Values (JDFTVAL) DDS keyword is not specified.
Assume that a join logical file is specified as in Example 1: Joining two physical files on page 59, and
there are four records in PF1 and three records in PF2, as shown in the following two tables.
Table 10. Physical file 1 (PF1)
Employee number
Name
235
Anne
440
Doug
500
Mark
729
Sue
Salary
235
1700.00
440
950.50
729
1400.90
Name
Salary
235
Anne
1700.00
440
Doug
950.50
729
Sue
1400.90
If you do not specify the JDFTVAL keyword and no match is found for the join field in the secondary
file, the record is not included in the join logical file.
Case 2B: A record missing in the secondary file (JDFTVAL keyword specified):
Because the Join Default Values (JDFTVAL) DDS keyword is specified, this example join logical file
contains a single record for each record in the primary file even though one record does not have a match
in the secondary file.
Assume that a join logical file is specified as in Example 1: Joining two physical files on page 59, except
that the JDFTVAL keyword is specified, as shown in the following DDS:
Database programming
63
JLF
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
JDFTVAL
A
R JOINREC
JFILE(PF1 PF2)
A
J
JOIN(PF1 PF2)
A
JFLD(NBR NBR)
A
NBR
JREF(PF1)
A
NAME
A
SALARY
A
K NBR
A
The program reads the join logical file and gets the following records.
Table 13. Join logical file (JLF)
Employee number
Name
Salary
235
Anne
1700.00
440
Doug
950.50
500
Mark
0000.00
729
Sue
1400.90
With JDFTVAL specified, the system returns a record for 500, even though the record is missing in PF2.
Without that record, some field values can be missing in the join record. In this case, the Salary field is
missing. With JDFTVAL specified, missing character fields normally use blanks; missing numeric fields
use zeros. Therefore, in this case, the value for the missing record in the join record is 0. However, if the
DFT keyword is specified for the field in the physical file, the default value specified on the DFT
keyword is used.
Case 3: Secondary file has more than one match for a record in the primary file:
This example join logical file contains a duplicate record in the primary file because it has more than one
match in the secondary file.
Assume that a join logical file is specified as in Example 1: Joining two physical files on page 59, and
there are four records in PF1 and five records in PF2, as shown in the following two tables.
Table 14. Physical file 1 (PF1)
Employee number
Name
235
Anne
440
Doug
500
Mark
729
Sue
Salary
235
1700.00
235
1500.00
440
950.50
500
2100.00
729
1400.90
64
Name
Salary
235
Anne
1700.00
235
Anne
1500.00
440
Doug
950.50
500
Mark
0000.00
729
Sue
1400.90
In the join records, the record for 235 is duplicated. The order of the records received for the duplicated
record is unpredictable unless the JDUPSEQ keyword is used.
Related reference
Example 3: Reading duplicate records in the secondary file on page 69
This example shows how a join logical file reads duplicate records in the secondary file based on the
specification of the Join Duplicate Sequence (JDUPSEQ) DDS keyword.
Case 4: An extra record in the secondary file:
This example join logical file does not include an extra record in the secondary file because the record
does not have a match in the primary file.
Assume that a join logical file is specified as in Example 1: Joining two physical files on page 59, and
four records are contained in PF1 and five records in PF2.
The record for 301 exists only in PF2.
The program reads the join logical file and gets only four records. The record for 301 does not appear.
Table 17. Join logical file (JLF)
Employee number
Name
Salary
235
Anne
1700.00
440
Doug
950.50
500
Mark
2100.00
729
Sue
1400.90
These results would be the same even if the JDFTVAL keyword were specified, because a record must
always be contained in the primary file to receive a join record.
Case 5: Random access:
This example join logical file returns records for a random access read operation.
Assume that a join logical file is specified as in Example 1: Joining two physical files on page 59. Note
that the join logical file has key fields defined.
Database programming
65
Name
235
Anne
440
Doug
500
Mark
729
Sue
997
Tim
Salary
235
1700.00
440
950.50
729
1400.90
984
878.25
997
331.00
997
555.00
In PF2, no record is found for record 500, record 984 exists only in PF2, and duplicate records are found
for 997.
The program can get the following records.
Given a value of 235 from the program for the Nbr field in the logical file, the system supplies the
following record.
Employee number
Name
Salary
235
Anne
1700.00
Given a value of 500 from the program for the Nbr field in the logical file and with the JDFTVAL
keyword specified, the system supplies the following record.
Employee number
Name
Salary
500
Mark
0000.00
Note: If the JDFTVAL keyword was not specified in the join logical file, no record is found for a value of
500 because no matching record is contained in the secondary file.
Given a value of 984 from the program for the Nbr field in the logical file, the system supplies no record
and a no record found exception occurs because record 984 is not in the primary file.
Given a value of 997 from the program for the Nbr field in the logical file, the system returns one of the
following records.
Employee number
Name
Salary
997
Tim
331.00
66
or
Employee number
Name
Salary
997
Tim
555.00
Which record is returned to the program cannot be predicted. To specify which record is returned, specify
the JDUPSEQ keyword in the join logical file.
Notes:
1. With random access, the application programmer must be aware that duplicate records can be
contained in PF2, and ensure that the program does more than one read operation for records
with duplicate keys. If the program is using sequential access, a second read operation gets
the second record.
2. If you specify the JDUPSEQ keyword, the system can create a separate access path for the join
logical file (because there is less of a chance that the system will find an existing access path
that it can share). If you omit the JDUPSEQ keyword, the system can share the access path of
another file. (In this case, the system can share the access path of PF2.)
Related reference
Example 3: Reading duplicate records in the secondary file on page 69
This example shows how a join logical file reads duplicate records in the secondary file based on the
specification of the Join Duplicate Sequence (JDUPSEQ) DDS keyword.
Example 2: Using more than one field to join files:
You can specify more than one join field to join a pair of files. This example shows the fields in the
logical file and the two physical files.
The join logical file (JLF) has fields Part number, Color, Price, and Quantity on hand. Physical file 1 (PF1)
has Part number, Color, Price, and Vendor, while physical file 2 (PF2) has Part number, Color, Quantity on
hand, and Warehouse. The data description specifications (DDS) for these files are shown as follows:
JLF
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R JOINREC
JFILE(PF1 PF2)
A
J
JOIN(PF1 PF2)
A
JFLD(PTNBR PTNBR)
A
JFLD(COLOR COLOR)
A
PTNBR
JREF(PF1)
A
COLOR
JREF(PF1)
A
PRICE
A
QUANTOH
A
PF1
Database programming
67
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC1
A
PTNBR
4
A
COLOR
20
A
PRICE
7 2
A
VENDOR
40
A
PF2
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC2
A
PTNBR
4
A
COLOR
20
A
QUANTOH
5 0
A
WAREHSE
30
A
Color
Price
Vendor
100
Black
22.50
ABC Corp.
100
White
20.00
Ajax Inc.
120
Yellow
3.75
ABC Corp.
187
Green
110.95
ABC Corp.
187
Red
110.50
ABC Corp.
190
Blue
40.00
Ajax Inc.
Color
Quantity on hand
Warehouse
100
Black
23
ABC Corp.
100
White
15
Ajax Inc.
120
Yellow
102
ABC Corp.
187
Green
ABC Corp.
187
Red
ABC Corp.
190
Blue
Ajax Inc.
If the file is processed sequentially, the program receives the following records.
Table 22. Join logical file (JLF)
Part number
Color
Price
Quantity on hand
100
Black
22.50
23
100
White
20.00
15
120
Yellow
3.75
102
187
Green
110.95
187
Red
110.50
190
Blue
40.00
68
Note: No record for part number 190, color blue, is available to the program, because a match was not
found on both fields in the secondary file. Because JDFTVAL was not specified, no record is
returned.
Example 3: Reading duplicate records in the secondary file:
This example shows how a join logical file reads duplicate records in the secondary file based on the
specification of the Join Duplicate Sequence (JDUPSEQ) DDS keyword.
The data description specifications (DDS) for the physical files and for the join logical file are shown as
follows:
JLF
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R JREC
JFILE(PF1 PF2)
A
J
JOIN(PF1 PF2)
A
JFLD(NAME1 NAME2)
A
JDUPSEQ(TELEPHONE)
A
NAME1
A
ADDR
A
TELEPHONE
A
PF1
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC1
A
NAME1
10
A
ADDR
20
A
PF2
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC2
A
NAME2
10
A
TELEPHONE
8
A
Address
Anne
Doug
40 Pillsbury
Mark
2 Lakeside Dr.
Telephone
Anne
5551111
Anne
5556666
Anne
5552222
Doug
5555555
Database programming
69
Address
Telephone
Anne
5551111
Anne
5552222
Anne
5556666
Doug
40 Pillsbury
5555555
The program reads all the records available for Anne, then Doug, then Mark. Anne has one address, but
three telephone numbers. Therefore, there are three records returned for Anne.
The records for Anne sort in ascending sequence by telephone number because the JDUPSEQ keyword
sorts in ascending sequence unless you specify *DESCEND as the keyword parameter. The following
example shows the use of *DESCEND in DDS:
JLF
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R JREC
JFILE(PF1 PF2)
A
J
JOIN(PF1 PF2)
A
JFLD(NAME1 NAME2)
A
JDUPSEQ(TELEPHONE *DESCEND)
A
NAME1
A
ADDR
A
TELEPHONE
A
When you specify JDUPSEQ with *DESCEND, the records are returned as follows.
Table 26. Join logical file (JLF)
Name
Address
Telephone
Anne
5556666
Anne
5552222
Anne
5551111
Doug
40 Pillsbury
5555555
Note: The JDUPSEQ keyword applies only to the join specification in which it is specified.
Related reference
Example 10: A complex join logical file on page 79
This example shows a more complex join logical file.
Example 4: Using join fields whose attributes are different:
This example shows how to handle join fields when their attributes (length, data type, and decimal
positions) are different.
For example, as in Example 3: Reading duplicate records in the secondary file on page 69, the Name1
field is a character field 10 characters long in physical file PF1, and can be joined to the Name2 field, a
character field 10 characters long in physical file PF2. The Name1 and Name2 fields have the same
characteristics and, therefore, can easily be used as join fields.
70
You can also use character type fields that have different lengths as join fields without requiring any
redefinition of the fields. For example, if the NAME1 field of PF1 is 10 characters long and the NAME2
field of PF2 is 15 characters long, those fields can be used as join fields without redefining one of the
fields.
The following example shows the join fields that do not have the same attributes. Both physical files have
fields for employee number. The Nbr field in physical file PF1 and the Nbr field in physical file PF2 both
have a length of 3 specified in position 34, but in the PF1 file the field is zoned (S in position 35), and in
the PF2 file the field is packed (P in position 35). To join the two files using these fields as join fields, you
must redefine one or both fields to have the same attributes.
The following example illustrates the fields in the logical and physical files:
The join logical file (JLF) contains Employee number, Name, and Salary fields. Physical file 1 (PF1) contains
Employee number (zoned) and Name. Physical file 2 (PF2) contains Employee number (packed) and Salary.
The data description specifications (DDS) for these files are shown as follows:
JLF
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R JOINREC
JFILE(PF1 PF2)
A
J
JOIN(PF1 PF2)
A
JFLD(NBR NBR)
A
NBR
S
JREF(2)
A
NAME
A
SALARY
A
PF1
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC1
A
NBR
3S 0 <-Zoned
A
NAME
20
A
K NBR
A
PF2
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC2
A
NBR
3P 0 <-Packed
A
SALARY
7 2
A
K NBR
A
Note: In this example, the Nbr field in the logical file comes from PF2, because JREF(2) is specified.
Instead of specifying the physical file name, you can specify a relative file number on the JREF
keyword; in this example, the 2 indicates PF2.
Because the Nbr fields in the PF1 and PF2 files are used as the join fields, they must have the same
attributes. In this example, they do not. Therefore, you must redefine one or both of them to have the
Database programming
71
same attributes. In this example, to resolve the difference in the attributes of the two employee number
fields, the Nbr field in JLF (which is coming from the PF2 file) is redefined as zoned (S in position 35 of
JLF).
Example 5: Describing fields that never appear in the record format:
Neither fields (where N is specified in position 38) can be used in a join logical file for neither input nor
output. Neither fields are not included in the record format. This example shows how to describe such
fields that never appear in the record format.
Programs using the join logical file cannot see or read neither fields. Neither fields are not included in the
record format. Neither fields cannot be key fields or used in select/omit statements in the joined file. You
can use a neither field for a join field (specified at the join specification level on the JFLD keyword) that
is redefined at the record level only to allow the join operation, but is not needed or wanted in the
program.
In the following example, the program reads the descriptions, prices, and quantity on hand of parts in
stock. The part numbers themselves are not wanted except to bring together the records of the parts.
However, because the part numbers have different attributes, at least one must be redefined.
The join logical file (JLF) has fields Description, Price, and Quantity on hand. Physical file 1 (PF1) has
Description and Part number, while physical file 2 (PF2) has Part number, Price, and Quantity on hand. The
data description specifications (DDS) for these files are shown as follows:
JLF
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R JOINREC
JFILE(PF1 PF2)
A
J
JOIN(PF1 PF2)
A
JFLD(PRTNBR PRTNBR)
A
PRTNBR
S N
JREF(1)
A
DESC
A
PRICE
A
QUANT
A
K DESC
A
PF1
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC1
A
DESC
30
A
PRTNBR
6P 0
A
PF2
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC2
A
PRTNBR
6S 0
A
PRICE
7 2
A
QUANT
8 0
A
72
In PF1, the Prtnbr field is a packed decimal field; in PF2, the Prtnbr field is a zoned decimal field. In the
join logical file, they are used as join fields, and the Prtnbr field from PF1 is redefined to be a zoned
decimal field by specifying an S in position 35 at the field level. The JREF keyword identifies which
physical file the field comes from. However, the field is not included in the record format; therefore, N is
specified in position 38 to make it a neither field. A program using this file would not see the field.
In this example, a sales clerk can type a description of a part. The program can read the join logical file
for a match or a close match, and display one or more parts for the user to examine, including the
description, price, and quantity. This application assumes that part numbers are not necessary to
complete a customer order or to order more parts for the warehouse.
Example 6: Specifying key fields in a join logical file:
This example illustrates the rules for specifying key fields in a join logical file.
If you specify key fields in a join logical file, the following rules apply:
v The key fields must exist in the primary physical file.
v The key fields must be named in the join record format in the logical file in positions 19 through 28.
v The key fields cannot be fields defined as neither fields (N specified in position 38 for the field) in the
logical file.
The following example illustrates the rules for key fields:
JLF
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R JOINREC
JFILE(PF1 PF2)
A
J
JOIN(PF1 PF2)
A
JFLD(NBR NUMBER)
A
JFLD(FLD3 FLD31)
A
FLD1
RENAME(F1)
A
FLD2
JREF(2)
A
FLD3
35
N
A
NAME
A
TELEPHONE
CONCAT(AREA LOCAL)
A
K FLD1
A
K NAME
A
PF1
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC1
A
NBR
4
A
F1
20
A
FLD2
7 2
A
FLD3
40
A
NAME
20
A
PF2
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC2
A
NUMBER
4
A
FLD2
7 2
A
FLD31
35
A
AREA
3
A
LOCAL
7
A
73
v
v
v
v
v
The join logical file (JLF2) contains Name, Address, Telephone, and Salary. Physical file 1 (PF1) has Name
and Address, physical file 2 (PF2) has Name and Telephone, and physical file 3 (PF3) has Name and Salary.
In this example, the Name field is common to all the physical files (PF1, PF2, and PF3), and serves as the
join field.
The following example shows the data description specifications (DDS) for the physical and logical files:
JLF
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R JOINREC
JFILE(PF1 PF2 P3)
A
J
JOIN(PF1 PF2)
A
JFLD(NAME NAME)
A
J
JOIN(PF2 PF3)
A
JFLD(NAME NAME)
A
NAME
JREF(PF1)
A
ADDR
A
TELEPHONE
A
SALARY
A
K NAME
A
PF1
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC1
A
NAME
10
74
A
A
A
ADDR
K NAME
20
PF2
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC2
A
NAME
10
A
TELEPHONE
7
A
K NAME
A
PF3
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R REC3
A
NAME
10
A
SALARY
9 2
A
K NAME
A
Address
Anne
Doug
40 Pillsbury
Mark
2 Lakeside Dr.
Tom
Telephone
Anne
5551111
Doug
5555555
Mark
5550000
Sue
5553210
Salary
Anne
1700.00
Doug
950.00
Mark
2100.00
Address
Telephone
Salary
Anne
5551111
1700.00
Doug
40 Pillsbury
5555555
950.00
Mark
2 Lakeside Dr.
5550000
2100.00
Database programming
75
No record is returned for Tom because a record is not found for him in PF2 and PF3 and the JDFTVAL
keyword is not specified. No record is returned for Sue because the primary file has no record for Sue.
Example 8: Joining a physical file to itself:
This example shows how to use a join logical file to combine records from one physical file.
The following chart shows how you can join a physical file to itself.
The join logical file (JLF) contains Employee number, Name, and Managers name. The physical file (PF1)
contains Employee number, Name, and Managers employee number. The following example shows the data
description specifications (DDS) for these files:
JLF
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
JDFTVAL
A
R JOINREC
JFILE(PF1 PF1)
A
J
JOIN(1 2)
A
JFLD(MGRNBR NBR)
A
NBR
JREF(1)
A
NAME
JREF(1)
A
MGRNAME
RENAME(NAME)
A
JREF(2)
A
PF1
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R RCD1
A
NBR
3
A
NAME
10
DFT('none')
A
MGRNBR
3
A
Notes:
1. Relative file numbers must be specified on the JOIN keyword because the same file name is
specified twice on the JFILE keyword. Relative file number 1 refers to the first physical file
specified on the JFILE keyword, 2 refers to the second, and so forth.
2. With the same physical files specified on the JFILE keyword, the JREF keyword is required for
each field specified at the field level.
Assume that the following records are contained in PF1.
Table 31. Physical file 1 (PF1)
Employee number
Name
235
Anne
440
440
Doug
729
76
Name
500
Mark
440
729
Sue
888
Name
Managers name
235
Anne
Doug
440
Doug
Sue
500
Mark
Doug
729
Sue
none
Notes:
1. A record is returned for the manager name of Sue because the JDFTVAL keyword was
specified.
2. The value none is returned because the DFT keyword was used on the Name field in the PF1
physical file.
Example 9: Using defaults for missing records from secondary files:
This example shows how to use the default value for a missing join field in a secondary file to join to the
other secondary file.
If the DFT keyword is specified in the secondary file, the value specified for the DFT keyword is used in
the logical file.
The data description specifications (DDS) for the files are shown as follows:
JLF
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
JDFTVAL
A
R JRCD
JFILE(PF1 PF2 PF3)
A
J
JOIN(PF1 PF2)
A
JFLD(NAME NAME)
A
J
JOIN(PF2 PF3)
A
JFLD(TELEPHONE TELEPHONE)
A
NAME
JREF(PF1)
A
ADDR
A
TELEPHONE
JREF(PF2)
A
LOC
A
PF1
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R RCD1
A
NAME
20
A
ADDR
40
A
COUNTRY
40
A
PF2
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R RCD2
A
NAME
20
A
TELEPHONE
8
DFT('999-9999')
Database programming
77
A
PF3
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R RCD3
A
TELEPHONE
8
A
LOC
30
DFT('No location assigned')
A
Assume that PF1, PF2, and PF3 have the following records.
Table 33. Physical file 1 (PF1)
Name
Address
Country
Anne
USA
Doug
40 Pillsbury
Canada
Mark
2 Lakeside Dr.
Canada
Sue
120 Broadway
USA
Telephone
Anne
5551234
Doug
5552222
Sue
5551144
Location
5551234
Room 312
5552222
Main lobby
9999999
No telephone number
With JDFTVAL specified in the join logical file, the program reads the following logical file records.
Table 36. Join logical file (JLF)
Name
Address
Telephone
Location
Anne
5551234
Room 312
Doug
40 Pillsbury
5552222
Main lobby
Mark
2 Lakeside Dr.
9999999
No telephone number
Sue
120 Broadway
5551144
No location assigned
In this example, complete data is found for Anne and Doug. However, part of the data is missing for
Mark and Sue.
v PF2 is missing a record for Mark because he has no telephone number. The default value for the
Telephone field in PF2 is defined as 999-9999 using the DFT keyword. In this example, therefore,
999-9999 is the telephone number returned when no telephone number is assigned. The JDFTVAL
keyword specified in the join logical file causes the default value for the Telephone field (which is
999-9999) in PF2 to be used to match with a record in PF3. (In PF3, a record is included to show a
description for telephone number 999-9999.) Without the JDFTVAL keyword, no record would be
returned for Mark.
78
v Sues telephone number is not yet assigned a location; therefore, a record for 555-1144 is missing in
PF3. Without JDFTVAL specified, no record would be returned for Sue. With JDFTVAL specified, the
system supplies the default value specified on the DFT keyword in PF3 the Loc field (which is No
location assigned).
Example 10: A complex join logical file:
This example shows a more complex join logical file.
Assume that the data is in the following three physical files:
Vendor Master File (PF1)
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R RCD1
TEXT('VENDOR INFORMATION')
A
VDRNBR
5
TEXT('VENDOR NUMBER')
A
VDRNAM
25
TEXT('VENDOR NAME')
A
STREET
15
TEXT('STREET ADDRESS')
A
CITY
15
TEXT('CITY')
A
STATE
2
TEXT('STATE')
A
ZIPCODE
5
TEXT('ZIP CODE')
A
DFT('00000')
A
PAY
1
TEXT('PAY TERMS')
A
Order File (PF2)
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R RCD2
TEXT('VENDORS ORDER')
A
VDRNUM
5S 0
TEXT('VENDOR NUMBER')
A
JOBNBR
6
TEXT('JOB NUMBER')
A
PRTNBR
5S 0
TEXT('PART NUMBER')
A
DFT(99999)
A
QORDER
3S 0
TEXT('QUANTITY ORDERED')
A
UNTPRC
6S 2
TEXT('PRICE')
A
Part File (PF3)
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A
R RCD3
TEXT('DESCRIPTION OF PARTS')
A
PRTNBR
5S 0
TEXT('PART NUMBER')
A
DFT(99999)
A
DESCR
25
TEXT('DESCRIPTION')
A
UNITPRICE
6S 2
TEXT('UNIT PRICE')
A
WHSNBR
3
TEXT('WAREHOUSE NUMBER')
A
PRTLOC
4
TEXT('LOCATION OF PART')
A
QOHAND
5
TEXT('QUANTITY ON HAND')
A
The join logical file record format should contain the following fields:
v Vdrnam (vendor name)
v Street, City, State, and Zipcode (vendor address)
v Jobnbr (job number)
v Prtnbr (part number)
v Descr (description of part)
v
v
v
v
The data description specifications (DDS) for this join logical file are shown as follows:
Database programming
79
The DYNSLT keyword is required because the JDFTVAL keyword and select fields are specified.
The JDUPSEQ keyword is specified because duplicate vendor numbers occur in PF2.
Two JFLD keywords are specified to ensure that the correct records are joined from the PF2 and
PF3 files.
The Vdrnum field is redefined from zoned decimal to character (because it is used as a join field
and it does not have the same attributes in PF1 and PF2).
The CONCAT keyword concatenates four fields from the same physical file into one field.
The JREF keyword must be specified because the Prtnbr field exists in two physical files and you
want to use the one in PF2.
10
80
Note: Join logical files always have access paths using the second field of the pair of fields specified in
the JFLD keyword. This field acts like a key field in simple logical files. If an access path does
not already exist, the access path is implicitly created with immediate maintenance.
Related concepts
Dynamic select/omit on page 55
With the dynamic select/omit operation, the system only returns those records that meet the select/omit
values when a program reads records from the file. That is, the actual select/omit processing is done
when records are read by a program, rather than when the records are added or changed.
Sharing existing access paths between logical files on page 55
When two or more logical files are based on the same physical files with the same key fields in the same
order, they automatically share the same keyed sequence access path.
Data integrity considerations:
These situations can occur unless you lock the physical files that are used by the join logical file.
v Your program reads a record for which there are two or more records in a secondary file. The system
supplies one record to your program.
v Another program updates the record in the primary file that your program has just read, changing the
join field.
v Your program issues another read request. The system supplies the next record based on the current
(new) value of the join field in the primary file.
These same considerations apply to secondary files as well.
Summary of rules:
This is a summary of rules for joining database files.
Requirements:
Here are the principle requirements for join logical files.
v Each join logical file must have:
Only one record format, with the JFILE keyword specified for it.
At least two physical file names specified on the JFILE keyword. (The physical file names on the
JFILE keyword do not have to be different files.)
At least one join specification (J in position 17 with the JFLD keyword specified).
A maximum of 255 secondary files.
At least one field name with field use other than N (neither) at the field level.
v If only two physical files are specified for the JFILE keyword, the JOIN keyword is not required. Only
one join specification can be included, and it joins the two physical files.
v If more than two physical files are specified for the JFILE keyword, the following rules apply:
The primary file must be the first file of the pair of files specified on the first JOIN keyword (the
primary file can also be the first of the pair of files specified on other JOIN keywords).
Note: Relative file numbers must be specified on the JOIN keyword and any JREF keyword when
the same file name is specified twice on the JFILE keyword.
Every secondary file must be specified only once as the second file of the pair of files on the JOIN
keyword. This means that for every secondary file on the JFILE keyword, one join specification must
be included (two secondary files would mean two join specifications, three secondary files would
mean three join specifications).
The order in which secondary files appear in join specifications must match the order in which they
are specified on the JFILE keyword.
Database programming
81
82
Records in a physical or logical file can be retrieved through an arrival sequence access path or a keyed
sequence access path. For logical files, you can also select and omit records based on one or more field
values in each record. A key field is a field that is used to arrange the records of a particular type within
a file member.
Related concepts
Access path description on page 6
An access path of a database file describes the order in which records are to be retrieved. When you
describe an access path, you describe whether it is a keyed sequence access path or an arrival sequence
access path.
Physical files
Logical files in which each member of the logical file is based on only one physical file member
Join logical files
Views
You can use arrival sequence access paths in the following ways:
v Arrival sequence is the only processing method that allows a program to use the storage space
previously occupied by a deleted record by placing another record in that storage space. This method
requires explicit insertion of a record given a relative record number that you provide. Another
method, in which the system manages the space created by deleting records, is the reuse deleted
records attribute that can be specified for physical files.
v Through your high-level language, the Display Physical File Member (DSPPFM) command, and the
Copy File (CPYF) command, you can process a keyed sequence file in arrival sequence. You can use
this function for a physical file, a simple logical file based on one physical file member, or a join logical
file.
v Through your high-level language, you can process a keyed sequence file directly by relative record
number. You can use this function for a physical file, a simple logical file based on one physical file
member, or a join logical file.
v An arrival sequence access path does not take up any additional storage and is always saved or
restored with the file. (Because the arrival sequence access path is nothing more than the physical order
of the data as it was stored, when you save the data you save the arrival sequence access path.)
Database programming
83
Related concepts
Reusing deleted records on page 101
Sometimes you might want to reuse deleted records for your database files. In this case, you can use the
REUSEDLT parameter.
Deleting database records on page 204
The delete operation allows you to delete an existing database record.
Physical file fields that have a field procedure may not appear to arrange or order correctly because the
access paths have the internal form of the data stored in the access path, not the external form of the data
that is returned for the field in the file. This appearance of incorrect ordering is true even for logical files
whose key fields are defined over the physical file fields that have a field procedure. When using these
types of keyed sequence access paths, equal requests (get equal, next equal, or previous equal) appear to
work correctly, but other get requests (next, previous, and similar ones) can appear to return an incorrect
record. Key fields that attempt to use alternative collating sequence, SRTSEQ (sort sequence), ABSVAL
(Absolute Value), DIGIT (Digit) or ZONE (Zone) are not allowed over physical file fields that have a field
procedure.
Arranging key fields in an alternative collating sequence:
You can arrange key fields that are defined as character fields either in a sequence for EBCDIC characters
or in an alternative collating sequence.
Consider the following records.
Record
Empname
Deptnbr
Empnbr
1
2
3
4
5
Jones, Mary
Smith, Ron
JOHNSON, JOHN
Smith, ROBERT
JONES, MARTIN
45
45
53
27
53
23318
41321
41322
56218
62213
If the Empname is the key field and is a character field, using the sequence for EBCDIC characters, the
records can be arranged as follows.
Record
Empname
Deptnbr
Empnbr
1
3
5
2
4
Jones, Mary
JOHNSON, JOHN
JONES, MARTIN
Smith, Ron
Smith, ROBERT
45
53
53
45
27
23318
41322
62213
41321
56218
84
Notice that the EBCDIC sequence causes an unexpected sort order because the lowercase characters are
sorted before uppercase characters. Thus, Smith, Ron sorts before Smith, ROBERT. An alternative collating
sequence can be used to sort the records when the records were entered using uppercase and lowercase
as shown in the following example.
Record
Empname
Deptnbr
Empnbr
3
5
1
4
2
JOHNSON, JOHN
JONES, MARTIN
Jones, Mary
Smith, ROBERT
Smith, Ron
53
53
45
27
45
41322
62213
23318
56218
41321
To use an alternative collating sequence for a character key field, specify the ALTSEQ DDS keyword, and
specify the name of the table containing the alternative collating sequence. When setting up a table, each
2-byte position in the table corresponds to a character. To change the order in which a character is sorted,
change its 2-digit value to the same value as the character it should be sorted equal to. For information
about sorting uppercase and lowercase characters regardless of their case, the QCASE256 table in library
QUSRSYS is provided for you.
Related concepts
DDS concepts
Arranging key fields with the SRTSEQ parameter:
You can arrange key fields that contain character data in a sort sequence order by using the SRTSEQ
parameter.
Consider the following records.
Record
Empname
Deptnbr
Empnbr
1
2
3
4
5
6
Jones, Marilyn
Smith, Ron
JOHNSON, JOHN
Smith, ROBERT
JONES, MARTIN
Jones, Martin
45
45
53
27
53
08
23318
41321
41322
56218
62213
29231
If the Empname field is the key field and is a character field, the *HEX sequence (the EBCDIC sequence)
arranges the records as follows.
Record
Empname
Deptnbr
Empnbr
1
6
3
5
2
4
Jones, Marilyn
Jones, Martin
JOHNSON, JOHN
JONES, MARTIN
Smith, Ron
Smith, ROBERT
45
08
53
53
45
27
23318
29231
41322
62213
41321
56218
Notice that with the *HEX sequence, all lowercase characters are sorted before the uppercase characters.
Thus, Smith, Ron sorts before Smith, ROBERT, and JOHNSON, JOHN sorts between the lowercase and
uppercase Jones. You can use the *LANGIDSHR sort sequence to sort records when the records were
entered using a mixture of uppercase and lowercase. The *LANGIDSHR sequence, which uses the same
collating weight for lowercase and uppercase characters, results in the following record.
Database programming
85
Record
Empname
Deptnbr
Empnbr
3
1
5
6
4
2
JOHNSON, JOHN
Jones, Marilyn
JONES, MARTIN
Jones, Martin
Smith, ROBERT
Smith, Ron
53
45
53
08
27
45
41322
23318
62213
29231
56218
41321
Notice that with the *LANGIDSHR sequence, the lowercase and uppercase characters are treated as
equal. Thus, JONES, MARTIN and Jones, Martin are equal and sort in the same sequence they have in the
base file. While this is not incorrect, it would look better in a report if all the lowercase Jones preceded
the uppercase JONES. You can use the *LANGIDUNQ sort sequence to sort the records when the records
were entered using an inconsistent uppercase and lowercase. The *LANGIDUNQ sequence, which uses
different but sequential collating weights for lowercase and uppercase characters, results in the following
record.
Record
Empname
Deptnbr
Empnbr
3
1
6
5
4
2
JOHNSON, JOHN
Jones, Marilyn
Jones, Martin
JONES, MARTIN
Smith, ROBERT
Smith, Ron
53
45
08
53
27
45
41322
23318
29231
62213
56218
41321
The *LANGIDSHR and *LANGIDUNQ sort sequences exist for every language supported in your system.
The LANGID parameter determines which *LANGIDSHR or *LANGIDUNQ sort sequence to use. Use
the SRTSEQ parameter to specify the sort sequence and the LANGID parameter to specify the language.
Arranging key fields in ascending or descending sequence:
You can arrange key fields in either ascending or descending sequence. When you describe a key field,
the default is ascending sequence. However, you can use the Descend (DESCEND) DDS keyword to
specify that you want to arrange a key field in descending sequence.
Consider the following records.
Record
Empnbr
Clsnbr
Clsnam
1
2
3
4
5
6
56218
41322
64002
23318
41321
62213
412
412
412
412
412
412
Welding
Welding
Welding
Welding
Welding
Welding
Cpdate
I
I
I
I
I
I
032188
011388
011388
032188
051888
032188
If the Empnbr field is the key field, the two possibilities for organizing these records are:
v In ascending sequence, where the order of the records in the access path is shown in the following
table.
Record
Empnbr
Clsnbr
Clsnam
Cpdate
4
5
2
23318
41321
41322
412
412
412
Welding I
Welding I
Welding I
032188
051888
011388
86
Record
Empnbr
Clsnbr
Clsnam
Cpdate
1
6
3
56218
62213
64002
412
412
412
Welding I
Welding I
Welding I
032188
032188
011388
v In descending sequence, where the order of the records in the access path is shown in the following
table.
Record
Empnbr
Clsnbr
Clsnam
3
6
1
2
5
4
64002
62213
56218
41322
41321
23318
412
412
412
412
412
412
Welding
Welding
Welding
Welding
Welding
Welding
Cpdate
I
I
I
I
I
I
011388
032188
032188
011388
051888
032188
Order
Ordate
Line
Item
Qtyord
Extens
1
2
3
4
5
52218
41834
41834
52218
41834
063088
062888
062888
063088
062888
01
03
02
02
01
88682
42111
61132
40001
00623
425
30
4
62
50
031875
020550
021700
021700
025000
If the access path uses the Order field, then the Line field as the key fields, both in ascending sequence,
the order of the records in the access path is.
Record
Order
Ordate
Line
Item
Qtyord
Extens
5
3
2
1
4
41834
41834
41834
52218
52218
062888
062888
062888
063088
063088
01
02
03
01
02
00623
61132
42111
88682
40001
50
4
30
425
62
025000
021700
020550
031875
021700
If the access path uses the key field Order in ascending sequence, then the Line field in descending
sequence, the order of the records in the access path is.
Record
Order
Ordate
Line
Item
Qtyord
Extens
2
3
5
4
1
41834
41834
41834
52218
52218
062888
062888
062888
063088
063088
03
02
01
02
01
42111
61132
00623
40001
88682
30
4
50
62
425
020550
021700
025000
021700
031875
Database programming
87
When a record has key fields whose contents are the same as the key field in another record in the same
file, then the file is said to have records with duplicate key values. However, the duplication must occur
for all key fields for a record if they are to be called duplicate key values. For example, if a record format
has two key fields Order and Ordate, duplicate key values occur when the contents of both the Order and
Ordate fields are the same in two or more records. These records have duplicate key values.
Order
Ordate
Line
Item
Qtyord
Extens
41834
41834
41834
062888
062888
062888
03
02
01
42111
61132
00623
30
04
50
020550
021700
025000
Using the Line field as a third key field defines the file so that there are no duplicate keys.
(First key field)
order
Item
Qtyord
Extens
41834
41834
41834
062888
062888
062888
03
02
01
42111
61132
00623
30
04
50
020550
021700
025000
A logical file that has more than one record format can have records with duplicate key values, even
though the record formats are based on different physical files. That is, even though the key values come
from different record formats, they are considered duplicate key values.
Preventing duplicate key values:
DB2 for i allows records with duplicate key values in a database file. However, you can prevent duplicate
key values in your files.
For example, you can create a file where the key field is defined as the customer number field. In this
case, you want the system to ensure that each record in the file has a unique customer number.
You can prevent duplicate key values in your files by specifying the UNIQUE keyword in data
description specifications (DDS). With the UNIQUE keyword specified, a record cannot be entered or
copied into a file if its key value is the same as the key value of a record already existing in the file. You
can also use unique constraints to enforce the integrity of unique keys.
If records with duplicate key values already exist in a physical file, the associated logical file cannot have
the UNIQUE keyword specified. If you try to create a logical file with the UNIQUE keyword specified,
and the associated physical file contains duplicate key values, the logical file is not created. The system
sends you a message stating this and sends you messages (as many as 20) indicating which records
contain duplicate key values.
When the UNIQUE keyword is specified for a file, any record added to the file cannot have a key value
that duplicates the key value of an existing record in the file, regardless of the file used to add the new
record. For example, two logical files LF1 and LF2 are based on the physical file PF1. The UNIQUE
keyword is specified for LF1. If you use LF2 to add a record to PF1, you cannot add the record if it
causes a duplicate key value in LF1.
If any of the key fields allow null values, null values that are inserted into those fields might or might
not cause duplicates depending on how the access path was defined when the file was created. The
*INCNULL parameter of the UNIQUE keyword indicates that null values are included when determining
whether duplicates exist in the unique access path. The *EXCNULL parameter indicates that null values
are not included when determining whether duplicate values exist.
88
The following example shows the DDS for a logical file that requires unique key values:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* ORDER TRANSACTION LOGICAL FILE (ORDFILL)
A
UNIQUE
A
R ORDHDR
PFILE(ORDHDRP)
A
K ORDER
A
A
R ORDDTL
PFILE(ORDDTLP)
A
K ORDER
A
K LINE
A
In this example, the contents of the key fields (the Order field for the ORDHDR record format, and the
Order and Line fields for the ORDDTL record format) must be unique whether the record is added
through the ORDHDRP file, the ORDDTLP file, or the logical file defined here. With the Line field
specified as a second key field in the ORDDTL record format, the same value can exist in the Order key
field in both physical files. Because the physical file ORDDTLP has two key fields and the physical file
ORDHDRP has only one, the key values in the two files do not conflict.
Related concepts
Controlling the integrity of your database with constraints on page 252
A constraint is a restriction or limitation placed on a database file to ensure that the data in your database
remains consistent when you add, change, and remove records.
DDS concepts
Arranging duplicate keys:
If you do not specify the Unique (UNIQUE) keyword in data description specifications (DDS), you can
specify how the system stores records with duplicate key values.
You specify that records with duplicate key values are stored in the access path in one of the following
ways:
v Last-in-first-out (LIFO). When the LIFO keyword is specified (1), records with duplicate key values are
retrieved in LIFO order by the physical sequence of the records. Here is an example of DDS using the
LIFO keyword.
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* ORDERP2
A
1 LIFO
A
R ORDER2
A
.
A
.
A
.
A
K ORDER
A
v First-in-first-out (FIFO). If the FIFO keyword is specified, records with duplicate key values are
retrieved in FIFO order by the physical sequence of the records.
v First-changed-first-out (FCFO). If the FCFO keyword is specified, records with duplicate key values are
retrieved in FCFO order by the physical sequence of the keys.
v No specific order for duplicate key fields (the default). When the FIFO, FCFO, or LIFO keyword is not
specified, no guaranteed order is specified for retrieving records with duplicate keys. No specific order
for duplicate key fields allows more access path sharing, which can improve performance.
When a simple- or multiple-format logical file is based on more than one physical file member, records
with duplicate key values are read in the order in which the files and members are specified on the
DTAMBRS parameter of the Create Logical File (CRTLF) or Add Logical File Member (ADDLFM)
command. Examples of logical files with more than one record format can be found in DDS concepts.
Database programming
89
The LIFO or FIFO order of records with duplicate key values is not determined by the sequence of the
updates made to the contents of the key fields, but only by the physical sequence of the records in the
file member. Assume that a physical file has the FIFO keyword specified (records with duplicate keys are
in FIFO order), and that the following table shows the order in which records were added to the file.
Order records were added to file
Key value
1
2
3
4
5
A
B
C
C
D
The sequence of the access path is FIFO, with ascending key values.
Record number
Key value
1
2
3
4
5
A
B
C
C
D
Records 3 and 4, which have duplicate key values, are in FIFO order. That is, because record 3 was added
to the file before record 4, it is read before record 4. This would become apparent if the records were read
in descending order. This can be done by creating a logical file based on this physical file, with the
DESCEND keyword specified in the logical file.
The sequence of the access path is FIFO, with descending key values.
Record number
Key value
5
3
4
2
1
D
C
C
B
A
If the key value of physical record 1 is changed to C, the sequence of the access path for the physical file
is FIFO, with ascending key values.
Record number
Key value
2
1
3
4
5
B
C
C
C
D
Finally, changing to descending order, the new sequence of the access path for the logical file is FIFO,
with descending key values.
Record number
Key value
5
1
D
C
90
Record number
Key value
3
4
2
C
C
B
After the change, record 1 does not appear after record 4, even though the contents of the key field were
updated after record 4 was added.
The FCFO order of records with duplicate key values is determined by the sequence of updates made to
the contents of the key fields. In the preceding example, after record 1 is changed such that the key value
is C, the sequence of the access path is FCFO, with ascending key values only.
Record number
Key value
2
3
4
1
5
B
C
C
C
D
For FCFO, the duplicate key ordering can change when the FCFO access path is rebuilt or when a
rollback operation is performed. In some cases, your key field can change but the physical key does not
change. In these cases, the FCFO ordering does not change, even though the key field has changed. For
example, when the index ordering is changed to be based on the absolute value of the key, the FCFO
ordering does not change. The physical value of the key does not change even though your key changes
from negative to positive. Because the physical key does not change, FCFO ordering does not change.
If the reuse deleted records attribute is specified for a physical file, the duplicate key ordering must be
allowed to default or must be FCFO. The reuse deleted records attribute is not allowed for the physical
file if either the key ordering for the file is FIFO or LIFO, or if any of the logical files defined over the
physical file have duplicate key ordering of FIFO or LIFO.
Related concepts
Sharing existing access paths between logical files on page 55
When two or more logical files are based on the same physical files with the same key fields in the same
order, they automatically share the same keyed sequence access path.
91
Note: The user or group is given the default authority to the object. You can change a users authority to
one of the types defined by the system or you can customize the authority.
You can also remove and customize authority using System i Navigator.
92
Database programming
93
94
The following example shows the relationship between authority granted for logical files and the physical
files used by the logical file. The logical files LF1, LF2, and LF3 are based on the physical file PF1.
USERA has read (*READ) and add (*ADD) authority to the data in PF1 and object operational
(*OBJOPR), read (*READ), and add (*ADD) authority for LF1 and LF2. This means that USERA cannot
open PF1 or use its data directly in any way because the user does not have object operational authority
(*OBJOPR) to PF1; USERA can open LF1 and LF2 and read records from and add records to PF1 through
LF1 and LF2.
Note: The user was not given authority for LF3 and, therefore, cannot use it.
Related concepts
Triggering automatic events in your database on page 270
A trigger is a set of actions that run automatically when a specified change or read operation is performed
on a specified database file. You can define a set of trigger actions in any high-level language that is
supported on the i5/OS operating system.
Database programming
95
Note: When you create a logical file, no data authorities are granted. Consequently, *CHANGE is the
same as *USE, and *ALL does not grant any data authority.
You can grant public authority in the following ways:
v Define public authority using System i Navigator.
v Use the Edit Object Authority (EDTOBJAUT), Grant Object Authority (GRTOBJAUT), or Revoke Object
Authority (RVKOBJAUT) command to grant or revoke the public authority of a file.
You can also use System i Navigator to set default public authority for a new file.
Related reference
Create Physical File (CRTPF) command
Create Source Physical File (CRTSRCPF) command
Edit Object Authority (EDTOBJAUT) command
Grant Object Authority (GRTOBJAUT) command
Revoke Object Authority (RVKOBJAUT) command
Defining public authority using System i Navigator:
Public authority is defined for every object on the system to describe what type of access a user has to
the object when that user has no specific authority to it. You can define public authority for a database
file using System i Navigator.
To define public authority, follow these steps:
1. From System i Navigator, expand your system Databases.
2. Expand the database that you want to work with.
3.
4.
5.
6.
Navigate until the object for which you want to edit permissions is visible.
Right-click the object for which you want to add permissions, and click Permissions.
In the Permissions window, select Public from the group list.
From the Authorities view list, select Details to implement detailed permissions. Select the
appropriate check box to apply the permissions that you want for public authority.
6. In the New Object window, select a default public authority. To use an authorization list, click Browse
for the name of the authorization list. To view authorization list properties, click Edit.
7. Click OK to close the Permissions window.
Here is a list of default public authorities:
96
Database programming
97
Related concepts
Using logical files to secure data
You can use logical files to prevent data in physical files from being read or changed.
SQL programming
2. Create a logical file to allow access to only some fields in the physical file.
a. Enter DDS for logical file LF1 into source file DDSSRC:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
00010A
R FORMAT1
PFILE(SAMPLE/PF)
00020A
F1
00030A
F2
98
a. Enter DDS for logical file LF2 into source file DDSSRC:
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
00010A
R FORMAT1
PFILE(SAMPLE/PF)
00020A
F1
00030A
F2
00040A
K F1
00050A
S F1
COMP(EQ 'A')
Database programming
99
These topics describe the file processing parameters and other methods or considerations that can be
used to affect database file processing. The parameter values are determined by the high-level language
program, the file attributes, and any open or override commands processed before the high-level
language program is called.
Related concepts
ILE Concepts PDF
Control language
Related reference
Create Physical File (CRTPF) command
Create Logical File (CRTLF) command
Create Source Physical File (CRTSRCPF) command
Add Physical File Member (ADDPFM) command
Add Logical File Member (ADDLFM) command
Change Physical File (CHGPF) command
Change Physical File Member (CHGPFM) command
Change Logical File (CHGLF) command
Change Logical File Member (CHGLFM) command
Change Source Physical File (CHGSRCPF) command
Override with Database File (OVRDBF) command
Open Database File (OPNDBF) command
Open Query File (OPNQRYF) command
Close File (CLOF) command
FILE(FILEX)
MBR(*ALL)
If you specify MBR(*ALL) on the OVRDBF command, your program reads the members in the order they
were created. For each member, your program reads the records in keyed or arrival sequence, depending
on whether the file is an arrival sequence or keyed sequence file.
100
When you use a database file in a program, the system needs to know what type of operation you plan
to use for the file. You can specify the type of processing with the OPTION parameter.
For example, the system needs to know if you plan to just read data in the file or if you plan to read and
update the data. The valid operation options are: input, output, update, and delete. The system
determines the options you are using from the information you specify in your high-level language
program or from the OPTION parameter on the Open Database File (OPNDBF) and Open Query File
(OPNQRYF) commands.
The system uses the options to determine which operations are allowed in your program. For example, if
you open a file for input only and your program tries an output operation, your program receives an
error.
Normally, the system verifies that you have the required data authority when you do an input/output
operation in your program. However, when you use the OPNQRYF or OPNDBF command, the system
verifies at the time the file is opened that you have the required data authority to perform the operations
specified on the OPTION parameter.
The system also uses these options to determine the locks to use to protect the data integrity of the files
and records being processed by your program.
Related concepts
Types of data authority on page 94
A data authority is a specific authority to read, add, update, or delete data in a database file, to run a
program, or to search a library or directory.
Locking shared data on page 105
By definition, all database files can be used by many users at the same time. However, some operations
can lock files, members, or records to prevent them from being shared across jobs.
Specifying the initial file position:
After a database file is opened, the system needs to know where it should start processing the file. You
can specify the initial file position with the POSITION parameter.
The default is to start just before the first record in the file (the first sequential read operation reads the
first record). But, you can tell the system to start at the end of the file, or at a certain record in the middle
of the file using the Override with Database File (OVRDBF) command. You can also dynamically set a
position for the file in your program.
Related concepts
Setting a position in the file on page 193
After a file is opened by a job, the system maintains a position in the file for that job. The file position is
used in processing the file.
Reusing deleted records:
Sometimes you might want to reuse deleted records for your database files. In this case, you can use the
REUSEDLT parameter.
When you specify REUSEDLT(*YES) on the Create Physical File (CRTPF) or Change Physical File
(CHGPF) command, the following operations might work differently:
v Arrival order becomes meaningless for a file that reuses deleted record space. Records might not be
added at the end of the file.
v End-of-file delay does not work for the files that reuse deleted record space.
v One hundred percent reuse of deleted record space is not guaranteed. A file full condition might be
reached or the file might be extended even though deleted record space still exists in the file.
Database programming
101
Note: Because of the way the system reuses deleted record space, the following types of files should not
be created or changed to reuse deleted record space:
v Files processed using relative record numbers, and files used by an application to determine a
relative record number that is used as a key into another file
v Files used as queues
v Any files used by applications that assume new record insertions are at the end of the file
v When DB2 Symmetric Multiprocessing is installed, files on which you expect to have parallel
index maintenance performed when rows are updated, inserted, or deleted
If you decide to change an existing physical file to reuse deleted record space, and there are logical files
with access paths with first-in-first-out (FIFO) or last-in-first-out (LIFO) duplicate key ordering over the
physical file, you can re-create the logical files without the FIFO or LIFO attribute and avoid rebuilding
the existing access path by following these steps:
1. Rename the existing logical file that has the FIFO or LIFO attribute.
2. Create a second logical file identical to the renamed file except that duplicate key ordering should not
be specified for the file. Give the new file the original file name. The new file shares the access path of
the renamed file.
3. Delete the renamed file.
Ignoring the keyed sequence access path:
If a key field is defined for a database file, the system automatically uses the keyed sequence access path.
However, sometimes you can use the ACCPTH parameter to ignore the keyed sequence access path for
better performance.
You can use the ACCPTH parameter to ignore the keyed sequence access path and process the file in
arrival sequence. You can tell the system to ignore the keyed sequence access path in some high-level
languages, or on the Open Database File (OPNDBF) command.
When you ignore the keyed sequence access path, operations that read data by key are not allowed.
Operations are done sequentially along the arrival sequence access path. (If this option is specified for a
logical file with select/omit values defined, the arrival sequence access path is used and only those
records meeting the select/omit values are returned to the program. The processing is done as if the
DYNSLT keyword were specified for the file.)
Note: You cannot ignore the keyed sequence access path for logical file members that are based on more
than one physical file member.
Delaying end-of-file processing:
When your program reaches the end of a database file, the system normally signals your program that
there is no more data to read. If you want the system to hold your program until more data arrives in the
file, use the EOFDLY parameter to delay the end-of-file processing.
If you use the EOFDLY parameter on the Override with Database File (OVRDBF) command, the program
can read the newly arrived records when more data arrives in the file.
Note: End-of-file delay should not be used for files that reuse deleted records.
102
Related concepts
Waiting for more records when end of file is reached on page 197
End-of-file delay is a method of continuing to read sequentially from a database file (logical or physical)
after an end-of-file condition occurs.
Specifying the record length:
As an option, you can specify the record length in your high-level language program.
The system needs to know the length of the record your program will be processing, but it is not
required that you specify the record length in your program. The system automatically determines this
information from the attributes and description of the file named in your program.
If the file that is opened contains records that are longer than the length specified in the program, the
system allocates a storage area to match the file members record length and this option is ignored. In
this case, the entire record is passed to the program. (However, some high-level languages allow you to
access only that portion of the record defined by the record length specified in the program.) If the file
that is opened contains records that are less than the length specified in the program, the system allocates
a storage area for the program-specified record length. The program can use the extra storage space, but
only the record lengths defined for the file member are used for input/output operations.
Ignoring record formats:
When you use a multiple-format logical file, the system assumes that you want to use all the formats
defined for the file. However, if you do not want to use all the formats, you can specify which formats
you want to use and ignore.
If you do not use this option to ignore formats, your program can process all formats defined in the file.
For more information about this processing option, see your high-level language topic collection.
Determining whether duplicate keys exist:
The set of keyed sequence access paths used to determine whether the key is a duplicate key differs
depending on the input/output (I/O) operation that is performed. You can determine whether duplicate
keys exist using the DUPKEYCHK parameter.
For input operations (reads), the keyed sequence access path used is the one that the file is opened with.
Any other keyed sequence access path that can exist over the physical file are not considered. Also, any
records in the keyed sequence access path omitted because of select/omit specifications are not
considered when deciding if the key operation is a duplicate.
For output (write) and update operations, all nonunique keyed sequence access paths of *IMMED
maintenance that exist over the physical file are searched to determine if the key for this output or
update operation is a duplicate. Only keyed sequence access paths that have *REBLD and *DLY
maintenance are considered if the access paths are actively open over the file at feedback time.
When you process a keyed file with a COBOL program, you can specify duplicate key feedback to be
returned to your program through the COBOL language, or on the Open Database File (OPNDBF) or
Open Query File (OPNQRYF) command. However, in COBOL, having duplicate key feedback returned
can cause a decline in performance.
Database programming
103
Journaling and commitment control are the preferred methods for i5/OS data and transaction recovery.
You can use the COMMIT parameter to protect your file with journaling and commitment control.
Database file journaling is started by running the Start Journal Physical File (STRJRNPF) command for
the file. Access path journaling is started by running the Start Journal Access Path (STRJRNAP) command
for the file or by using System-Managed Access-Path Protection (SMAPP). You tell the system that you
want your files to run under commitment control through the Start Commitment Control (STRCMTCTL)
command and through high-level language specifications. You can also specify the commitment control
(COMMIT) parameter on the Open Database File (OPNDBF) and Open Query File (OPNQRYF)
commands.
If you are performing insert, update, or delete operations on a file that is associated with a referential
constraint and the delete rule, update rule, or both are other than RESTRICT, you must use journaling.
Related concepts
Managing journals on page 228
Journal management allows you to record all the data changes that occur to one or more database files.
You can then use the journal for recovery.
Ensuring data integrity with commitment control on page 236
Commitment control allows you to define and process a number of changes to database files in a single
unit (transaction).
Ensuring data integrity with referential constraints on page 258
You use referential constraints to enforce the referential integrity of your database. Referential integrity
encompasses all of the mechanisms and techniques that you can use to ensure that your database
contains only valid data.
Writing data and access paths to auxiliary storage:
Normally, DB2 for i determines when to write changed data and access paths from main storage to
auxiliary storage. However, you can control when database changes are written to auxiliary storage.
If you want to control when changed data are written from main storage to auxiliary storage, you can use
the force write ratio (FRCRATIO) parameter on the create, change, or override database file commands,
and the force access path (FRCACCPTH) parameter on the create and change database file commands.
Using the FRCRATIO and FRCACCPTH parameters have performance and recovery considerations for
your system.
Related concepts
Recovering and restoring your database on page 228
You can use several i5/OS save and restore functions to recover your database after the system loses
data.
Checking changes to the record format description:
When a database file is opened, the system checks whether the description of the record format has been
changed since the program was compiled to an extent that it cannot process the file.
The system normally notifies your program of a level check. When you use the create or change file
command, you can specify that you want level checking. You can also override the level check attribute
defined for the file using the LVLCHK parameter on the Override with Database File (OVRDBF)
command.
104
Related concepts
Effects of changing fields in a file description on page 223
The system uses the information in the record format description to determine the level identifier.
Changes to the fields in a file description cause the level identifier to change. Changes in key fields or
select/omit fields might cause unexpected results in programs using the new access path.
Checking the expiration date of a physical file member:
The system can check whether the data in a physical file member is still current. You can specify whether
the system checks the expiration date of a physical file member using the EXPCHK parameter on the
Override with Database File (OVRDBF) command.
If you check that the expiration date and the current date is later than the expiration date, an inquiry
message is sent to the system operator when the physical file member is opened. If the inquiry message
is canceled, an escape message is sent to the program.
Related concepts
Expiration date on page 34
The EXPDATE parameter specifies an expiration date for each member in a physical file (ADDPFM,
CHGPFM, CRTPF, CHGPF, CRTSRCPF, and CHGSRCPF commands).
Preventing the job from changing data in a file:
If you want to test your program, but do not want to change data in a file that is used for the test, you
can tell the system not to write (inhibit) any changes to the file that the program attempts to make. For
this operation, you can use the INHWRT parameter.
To inhibit any changes to the file, specify INHWRT(*YES) on the Override with Database File (OVRDBF)
command.
Database programming
105
The system determines the lock condition based on the type of file processing specified in your program
and the operation requested. For example, if your open options include update or delete, each record
read is locked so that any number of users can read the record at the same time, but only one user can
update the record.
The system normally waits a specific number of seconds for a locked record to be released before it sends
your program a message that it cannot get the record you are requesting. The default record wait time is
60 seconds; however, you can set your own wait time through the WAITRCD parameter on the create
and change file commands and the override database file command. If your program is notified that the
record it wants is locked by another operation, you can have your program take the appropriate action
(for example, you can send a message to the operator that the requested record is currently unavailable).
If the record lock is being implicitly acquired as a result of a referential integrity CASCADE DELETE,
SET NULL, or SET DEFAULT delete rule, the lock wait time is limited to 30 seconds.
The system automatically releases a lock when the locked record is updated or deleted. However, you
can release record locks without updating the record. For information about how to release a record lock,
see your high-level language topic collection.
Note: Using commitment control changes the record locking rules.
You can display locked records using either the Display Record Locks (DSPRCDLCK) command or
System i Navigator.
Related concepts
Commitment control
Displaying locked records using the Display Record Locks (DSPRCDLCK) command on page 109
You can use the Display Record Locks (DSPRCDLCK) command to display the current lock status (wait
or held) of records in a physical file member.
Related tasks
Displaying locked rows using System i Navigator on page 108
You can use System i Navigator to display locked rows in a table.
Locking files:
When a database file is allocated exclusively, any program trying to open the file has to wait until it is
released. However, you can set a wait time for the file to become available using the WAITFILE
parameter.
You can control the amount of time a program waits for the file to become available by specifying a wait
time on the WAITFILE parameter of the create and change file commands and the override database file
command. If you do not specifically request a wait time, the system defaults the file wait time to zero
seconds.
A file is exclusively allocated when an operation that changes its attributes is run. These operations (such
as move, rename, grant or revoke authority, change owner, or delete) cannot be run at the same time with
any other operation on the same file or on members of that file. Other file operations (such as display,
open, dump, or check object) only use the file definition, and thus lock the file less exclusively. They can
run at the same time with each other and with input/output operations on a member.
Locking members:
Member operations (such as add and remove) automatically allocate the file exclusively to prevent other
file operations from occurring at the same time.
106
Input/output (I/O) operations on the same member cannot run, but I/O operations on other members of
the same file can run at the same time.
Locking record format data:
Sometimes you might want to lock the entire set of records associated with a record format (for example,
all the records in a physical file). In this case, you can use the RCDFMTLCK parameter on the Override
Database File (OVRDBF) command.
Database lock considerations:
These tables show the types of locks that some of the database functions place on database files, the valid
lock combinations, and the types of locks for constraints.
Table 37 summarizes some of the most commonly used database functions and the types of locks they
place on database files. The types of locks are explained on the next page.
Table 37. Database functions and locks
Function
Command
File lock
Member/Data lock
Add Member
Change File
Attributes
Change Member
Attributes
Change Object Owner
Check Object
Clear Physical File
Member
Create Duplicate
Object
Create File
ADDPFM, ADDLFM
CHGPF, CHGLF
*EXCLRD
*EXCL
*EXCLRD
*EXCLRD
*EXCLRD
CHGPFM, CHGLFM
*SHRRD
*EXCLRD
CHGOBJOWN
CHKOBJ
CLRPFM
*EXCL
*SHRNUPD
*SHRRD
*EXCLRD3
CRTDUPOBJ
CRTPF, CRTLF,
CRTSRCPF
Delete File
DLTF
*EXCL
*EXCLRD
Grant/Revoke
GRTOBJAUT,
*EXCL
Authority
RVKOBJAUT
Initialize Physical File INZPFM
*SHRRD
*EXCLRD
Member
Move Object
MOVOBJ
*EXCL
Open File
OPNDBF, OPNQRYF *SHRRD
*SHRRD
*EXCLRD
Rebuild Access Path
EDTRBDAP, OPNDBF *SHRRD
*SHRRD
*EXCLRD
Remove Member
RMVM
*EXCLRD
*EXCL
*EXCLRD
Rename File
RNMOBJ
*EXCL
*EXCL
*EXCL
Rename Member
RNMM
*EXCLRD
*EXCL
*EXCL
Reorganize Physical
RGZPFM
*SHRRD
*EXCL4
File Member
Restore File
RSTLIB, RSTOBJ
*EXCL
Save File
SAVLIB, SAVOBJ,
*SHRNUPD1
*SHRNUPD2
SAVCHGOBJ
1
For save-while-active, the file lock is *SHRUPD initially, and then the lock is reduced to *SHRRD. See
Save-while-active function for a description of save-while-active locks for the save commands.
2
The clear operation does not happen if the member is open in this process or in any other process.
If ALWCANCEL(*YES) is specified, the LOCK keyword can specify a *SHRUPD or *EXCLRD lock instead.
Database programming
107
*EXCL
*EXCLRD
*SHRUPD
*SHRNUPD
*SHRRD
*EXCL
*EXCLRD2
X
*SHRUPD3
X
X
*SHRNUPD4
X
X
*SHRRD5
X
X
X
X
1
Exclusive lock (*EXCL). The object is allocated for the exclusive use of the requesting job; no other job can use the
object.
2
Exclusive lock, allow read (*EXCLRD). The object is allocated to the job that requested it, but other jobs can read
the object.
Shared lock, allow read and update (*SHRUPD). The object can be shared either for read or change with other
jobs.
Shared lock, read only (*SHRNUPD). The object can be shared for read with other jobs.
Shared lock (*SHRRD). The object can be shared with another job if the job does not request exclusive use of the
object.
Table 38 shows database locking for constraints of a database file, depending on whether the constraint is
associated with the parent file (PAR) or the dependent file (DEP).
Table 38. Database constraint locks
Type of function
ADDPFM1
ADDPFM1
ADDPFCST7
ADDPFCST6
ADDPFCST
RMVM2
RMVM2
DLTF3
DLTF3
RMVPFCST7
RMVPFCST6
RMVPFCST
CHGPFCST
1
If adding a physical file
File5
Member5
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
member causes a referential constraint to be established.
File type
DEP
PAR
*REFCST
*UNQCST *PRIKEY
*UNIQUE *PRIKEY
DEP
PAR
DEP
PAR
*REFCST
*UNQCST *PRIKEY
*UNIQUE *PRIKEY
Other file
*EXCL
*EXCL
*EXCL
*EXCL
Other
member
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL4
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*EXCL
*SHRRD
*EXCL
If removing a physical file member causes an established referential constraint to become defined.
When deleting a dependent or parent file that has constraints established or defined for the file.
When the Remove Physical File Constraint (RMVPFCST) command is invoked for the parent file which has
constraints established or defined, the parent and any logical files over the parent file are all locked *EXCL.
For referential constraints, the column refers to the dependent file or the dependent member.
Unique constraint or primary key constraint is a parent key in a referential constraint where the other file is a
dependent file.
108
Displaying locked records using the Display Record Locks (DSPRCDLCK) command:
You can use the Display Record Locks (DSPRCDLCK) command to display the current lock status (wait
or held) of records in a physical file member.
The DSPRCDLCK command will also indicate what type of lock is currently held. Depending on the
parameters you specify, this command displays the lock status for a specific record or displays the lock
status of all records in the member. You can also display record locks from the Work with Job (WRKJOB)
display.
Related concepts
Control language
Backup and recovery
Related reference
Display Record Locks (DSPRCDLCK) command
manual.
The SHARE parameter on the create file, change file, and override database file commands allows
sharing in a job or activation group, including sharing the file, its status, its positions, and its storage
area. Sharing files in the job or activation group can improve performance by reducing the amount of
main storage needed and by reducing the time needed to open and close the file.
Using the SHARE(*YES) parameter lets two or more programs running in the same job or activation
group share an open data path (ODP). An open data path is the path through which all input/output
operations for the file are performed. In a sense, it connects the program to a file. If you do not specify
the SHARE(*YES) parameter, a new open data path is created every time a file is opened. If an active file
is opened more than once in the same job or activation group, you can use the active ODP for the file
with the current open of the file. You do not have to create a new open data path.
This reduces the amount of time required to open the file after the first open, and the amount of main
storage required by the job or activation group. SHARE(*YES) must be specified for the first open and
Database programming
109
other opens of the same file for the ODP to be shared. A well-designed (for performance) application
normally shares an ODP with files that are opened in multiple programs in the same job or activation
group.
Specifying SHARE(*NO) tells the system not to share the ODP for a file. Normally, this is specified only
for those files that are seldom used or require unique processing in specific programs.
Note: A high-level language program processes an open or a close operation as if the file were not being
shared. You do not specify that the file is being shared in the high-level language program. You
indicate that the file is being shared in the same job or activation group through the SHARE
parameter. The SHARE parameter is specified only on the create, change, and override database
file commands.
Open considerations for files shared in a job or an activation group:
Here are the considerations for opening a database file that is shared in the same job or activation group.
v Make sure that when the shared file is opened for the first time in a job or activation group, all the
open options needed for subsequent opens of the file are specified. If the open options specified for
subsequent opens of a shared file do not match those specified for the first open of a shared file, an
error message is sent to the program. (You can correct this by making changes to your program or to
the Open Database File (OPNDBF) or Open Query File (OPNQRYF) command parameters, to remove
any incompatible options.)
v
v
v
v
v
For example, PGMA is the first program to open FILE1 in the job or activation group and PGMA only
needs to read the file. However, PGMA calls PGMB, which will delete records from the same shared
file. Because PGMB will delete records from the shared file, PGMA will have to open the file as if it,
PGMA, is also going to delete records. You can accomplish this by using the correct specifications in
the high-level language. (To accomplish this in some high-level languages, you might have to use file
operation statements that are never run. See your high-level language topic collection for more details.)
You can also specify the file processing option on the OPTION parameter on the OPNDBF and
OPNQRYF commands.
Sometimes sharing a file within a job or activation group is not desirable. For example, one program
needs records from a file in arrival sequence and another program needs records in keyed sequence. In
this situation, you should not share the open data path (ODP). Specify SHARE(*NO) on the Override
with Database File (OVRDBF) command to ensure that the file is not shared within the job or
activation group.
If debug mode is entered with UPDPROD(*NO) after the first open of a shared file in a production
library, subsequent shared opens of the file share the original ODP and allow the file to be changed. To
prevent this, specify SHARE(*NO) on the OVRDBF command before opening files being debugged.
The use of commitment control for the first open of a shared file requires that all subsequent shared
opens also use commitment control.
Key feedback, insert key feedback, or duplicate key feedback must be specified on the full open if any
of these feedback types are desired on the subsequent shared opens of the file.
If you did not specify a library name in the program or on the OVRDBF command (*LIBL is used), the
system assumes that the library list has not changed since the last open of the same shared file with
*LIBL specified. If the library list has changed, you should specify the library name on the OVRDBF
command to ensure that the correct file is opened.
The record length that is specified on the full open is the record length that is used on subsequent
shared opens even if a larger record length value is specified on the shared opens of the file.
Overrides and program specifications specified on the first open of the shared file are processed.
Overrides and program specifications specified on subsequent opens, other than those that change the
file name or the value specified on the SHARE or LVLCHK parameter of the OVRDBF command, are
ignored.
110
v Overrides specified for a first open using the OPNQRYF command can be used to change the names of
the files, libraries, and members that should be processed by the OPNQRYF command. Any parameter
values specified on the OVRDBF command other than TOFILE, MBR, LVLCHK, and SEQONLY are
ignored by the OPNQRYF command.
v The OPNDBF and OPNQRYF commands scope the ODP to the level specified on the Open Scope
(OPNSCOPE) parameter according to the following rules:
The system searches for shared opens in the activation group first, and then in the job.
Shared opens that are scoped to an activation group might not be shared between activation groups.
Shared opens that are scoped to the job can be shared throughout the job, by any number of
activation groups at a time.
The CPF4123 diagnostic message lists the mismatches that can be encountered between the full open and
the subsequent shared opens. These mismatches do not cause the shared open to fail.
Note: The OPNQRYF command never shares an existing shared ODP in the job or activation group. If a
shared ODP already exists in the job or activation group with the same file, library, and member
name as the one specified on the OPNQRYF command, the system sends an error message and the
query file is not opened.
Input/output considerations for files shared in a job or an activation group:
Here are the considerations for processing a database file that is shared in the same job or activation
group.
v Because only one open data path is allowed for a shared file, only one record position is maintained
for all the programs in the job or activation group that is sharing the file. If a program establishes a
position for a record using a read or a read-for-update operation, and then calls another program that
also uses the shared file, the record position might have moved or a record lock been released when
the called program returns to the calling program. This can cause errors in the calling program because
of an unexpected record position or lock condition. When sharing files, it is your responsibility to
manage the record position and record locking considerations by re-establishing position and locks.
v If a shared file is first opened for update operation, this does not necessarily cause every subsequent
program that shares the file to request a record lock. The system determines the type of record lock
needed for each program using the file. The system tries to keep lock contention to a minimum, while
still ensuring data integrity.
For example, PGMA is the first program in the job or activation group to open a shared file. PGMA
intends to update records in the file; therefore, when the program reads a record for update operation,
it locks the record. PGMA then calls PGMB. PGMB also uses the shared file, but it does not update any
records in the file; PGMB just reads records. Even though PGMA originally opened the shared file as
update-capable, PGMB does not lock the records it reads, because of the processing specifications in
PGMB. Thus, the system ensures data integrity, while minimizing record lock contention.
Close considerations for files shared in a job or an activation group:
Here are the considerations for closing a database file that is shared in the same job or activation group.
v The complete processing of a close operation (including releasing file, member, and record locks;
forcing changes to auxiliary storage; and destroying the open data path) is done only when the last
program to open the shared open data path closes it.
v If the file was opened with the Open Database File (OPNDBF) or the Open Query File (OPNQRYF)
command, use the Close File (CLOF) command to close the file. The Reclaim Resources (RCLRSC)
command can also be used to close a file opened by the OPNQRYF command when one of the
following parameters is specified:
OPNSCOPE(*ACTGRPDFN), and the open is requested from the default activation group.
TYPE(*NORMAL)
Database programming
111
If one of the following parameters is specified, the file remains open even if the Reclaim Resources
(RCLRSC) command is run:
OPNSCOPE(*ACTGRPDFN), and the open is requested from an activation group other than the
default.
OPNSCOPE(*ACTGRP)
OPNSCOPE(*JOB)
TYPE(*PERM)
Example 1: A single set of files with similar processing options:
You use the same set of files each time you sign on.
A control language (CL) program (PGMA) is used as the first program (to set up the application,
including overrides and opening the shared files). PGMA then transfers control to PGMB, which displays
the application menu. Assume, in this example, that files A, B, and C are used, and files A and B are to
be shared. Files A and B were created with SHARE(*NO); therefore the Override with Database File
(OVRDBF) command should precede each of the Open Database File (OPNDBF) commands to specify the
SHARE(*YES) option. File C was created with SHARE(*NO) and File C is not to be shared in this
example.
Note: By using the code examples, you agree to the terms of the Code license and disclaimer
information on page 293.
PGMA:
PGM
OVRDBF
OVRDBF
OPNDBF
OPNDBF
TFRCTL
ENDPGM
/* PGMA
FILE(A)
FILE(B)
FILE(A)
FILE(B)
PGMB
PGMB:
PGM
DCLF
SNDRCVF
IF
IF
.
.
IF
GOTO
ENDPGM
BEGIN:
- Initial program */
SHARE(*YES)
SHARE(*YES)
OPTION(*ALL) ....
OPTION(*INP) ...
The files opened in PGMA are either scoped to the job, or PGMA, PGM11, and PGM12 run in the same
activation group and the file opens are scoped to that activation group.
In this example, assume that:
v PGM11 opens files A and B. Because these files were opened as shared by the OPNDBF commands in
PGMA, the open time is reduced. The close time is also reduced when the shared open data path is
closed. The OVRDBF commands remain in effect even though control is transferred (with the Transfer
Control (TFRCTL) command in PGMA) to PGMB.
v PGM12 opens files A, B, and C. File A and B are already opened as shared and the open time is
reduced. Because file C is used only in this program, the file is not opened as shared.
In this example, the Close File (CLOF) command is not used because only one set of files is required.
When the operator signs off, the files are automatically closed. It is assumed that PGMA (the initial
program) is called only at the start of the job. For more information about how to reclaim resources in the
Integrated Language Resources, see the ILE Concepts book.
112
Note: The display file (DISPLAY) in PGMB can also be specified as a shared file, which can improve the
performance for opening the display file in any programs that use it later.
In Example 1, the OPNDBF commands are placed in a separate program (PGMA) so the other processing
programs in the job run as efficiently as possible. That is, the important files used by the other programs
in the job are opened in PGMA. After the files are opened by PGMA, the main processing programs
(PGMB, PGM11, and PGM12) can share the files; therefore, their open and close requests will process
faster. In addition, by placing the open commands (OPNDBF) in PGMA rather than in PGMB, the amount
of main storage used for PGMB is reduced.
Any overrides and opens can be specified in the initial program (PGMA); then, that program can be
removed from the job (for example, by transferring out of it). However, the open data paths that the
program created when it opened the files remain in existence and can be used by other programs in the
job.
Note: Overrides must be specified before the file is opened. Some of the parameters on the OVRDBF
command also exist on the OPNDBF command. If conflicts arise, the OVRDBF value is used.
Related concepts
ILE Concepts PDF
Example 2: Multiple sets of files with similar processing options:
You use a different set of files for each program. You normally work with one program for a considerable
length of time before selecting a new program.
Assume that a menu requests the operator to specify the application program (for example, accounts
receivable or accounts payable) that uses the Open Database File (OPNDBF) command to open the
required files. When the application is ended, the Close File (CLOF) command closes the files. The CLOF
command is used to help reduce the amount of main storage needed by the job.
An example of the accounts receivable programs follows:
Note: By using the code examples, you agree to the terms of the Code license and disclaimer
information on page 293.
PGMC:
BEGIN:
PGM
/* PGMC PROGRAM */
DCLF
FILE(DISPLAY)
SNDRCVF RCDFMT(TOPMENU)
IF
(&RESPONSE *EQ '1') CALL ACCRECV
IF
(&RESPONSE *EQ '2') CALL ACCPAY
.
.
IF
(&RESPONSE *EQ '90') SIGNOFF
GOTO
BEGIN
ENDPGM
ACCREC: PGM
/* ACCREC PROGRAM */
DCLF
FILE(DISPLAY)
OVRDBF
FILE(A) SHARE(*YES)
OVRDBF
FILE(B) SHARE(*YES)
OPNDBF
FILE(A) OPTION(*ALL) ....
OPNDBF
FILE(B) OPTIONS(*INP) ...
BEGIN: SNDRCVF RCDFMT(ACCRMENU)
IF
(&RESPONSE *EQ '1') CALL PGM21
IF
(&RESPONSE *EQ '2') CALL PGM22
.
.
IF
(&RESPONSE *EQ '88') DO /* Return */
Database programming
113
GOTO
ENDPGM
CLOF FILE(A)
CLOF FILE(B)
RETURN
ENDDO
BEGIN
The program for the accounts payable menu would be similar, but with a different set of OPNDBF and
CLOF commands.
For this example, files A and B were created with SHARE(*NO). Therefore, an OVRDBF command must
precede the OPNDBF command. As in Example 1, the amount of main storage used by each job can be
reduced by placing the OPNDBF commands in a separate program and calling it. A separate program can
also be created for the CLOF commands. The OPNDBF commands can be placed in an application setup
program that is called from the menu, which transfers control to the specific application program menu
(any overrides specified in this setup program are kept). However, calling separate programs for these
functions also uses system resources and, depending on the frequency with which the different menus are
used, it might be better to include the OPNDBF and CLOF commands in each application program menu
as shown in this example.
Another choice is to use the Reclaim Resources (RCLRSC) command in PGMC (the setup program)
instead of using the CLOF command. The RCLRSC command closes any files and frees any leftover
storage associated with any files and programs that were called and have since returned to the calling
program. However, RCLRSC does not close files that are opened with the following parameters specified
on the OPNDBF or Open Query File (OPNQRYF) command:
v OPNSCOPE(*ACTGRPDFN), and the open is requested from some activation group other than the
default.
v OPNSCOPE(*ACTGRP) reclaims if the RCLRSC command is from an activation group with an
activation group number that is lower than the activation group number of the open.
v OPNSCOPE(*JOB).
v TYPE(*PERM).
The following example shows the RCLRSC command used to close files:
.
.
IF
IF
.
.
114
does not require any more considerations because a program specifying an open for input only would
operate similarly as if it had not done a shared open (for example, no additional record locking occurs
when a record is read).
However, some options specified on the OPNDBF command can affect how the program operates. For
example, SEQONLY(*NO) is specified on the open command for a file in the program. An error would
occur if the OPNDBF command used SEQONLY(*YES) and a program attempted an operation that was
not valid with sequential-only processing.
The ACCPTH parameter must also be consistent with the way programs will use the access path (arrival
or keyed).
If COMMIT(*YES) is specified on the OPNDBF command and the Start Commitment Control
(STRCMTCTL) command specifies LCKLVL(*ALL) or LCKLVL(*CS), any read operation of a record locks
that record (per commitment control record locking rules). This can cause records to be locked
unexpectedly and cause errors in the program.
Two OPNDBF commands can be used for the same data (for example, one with OPTION(*ALL) and the
other specifying OPTION(*INP)). The second use must be a logical file pointing to the same physical
file(s). This logical file can then be opened as SHARE(*YES) and multiple uses made of it during the
same job.
Database programming
115
116
Related concepts
Using Open Query File (OPNQRYF) command on page 123
By using the Open Query File (OPNQRYF) command, you can open a file to a set of database records
that satisfies a database query request.
Input/output considerations for sequential-only processing:
Here are the considerations for input/output operations on files when sequential-only processing is
specified.
v For input, your program receives one record at a time from the input buffer. When all records in the
input buffer are processed, the system automatically reads the next set of records.
Note: Changes made after records are read into the input buffer are not reflected in the input buffer.
v For output, your program must move one record at a time to the output buffer. When the output
buffer is full, the system automatically adds the records to the database.
Note: If you are using a journal, the entire buffer is written to the journal at one time as if the entries
had logically occurred together. This journal processing occurs before the records are added to
the database.
If you use sequential-only processing for output, you might not see all the changes made to the file as
they occur. For example, if sequential-only is specified for a file being used by PGMA, and PGMA is
adding new records to the file and the SEQONLY parameter was specified with 5 as the number of
records in the buffer, then only when the buffer is filled will the newly added records be transferred to
the database. In this example, only when the fifth record was added, would the first five records be
transferred to the database, and be available for processing by other jobs in the system.
In addition, if you use sequential-only processing for output, some additions might not be made to the
database if you do not handle the errors that can occur when records are moved from the buffer to the
database. For example, assume that the buffer holds five records, and the third record in the buffer had
a key that was a duplicate of another record in the file and the file was defined as a unique-key file. In
this case, when the system transfers the buffer to the database it would add the first two records and
then get a duplicate key error for the third. Because of this error, the third, fourth, and fifth records in
the buffer would not be added to the database.
v The force-end-of-data function can be used for output operations to force all records in the buffer to
the database (except those records that would cause a duplicate key in a file defined as having unique
keys, as described previously). The force-end-of-data function is only available in certain high-level
languages.
v The number of records in a block will be changed to one if all of the following conditions are true:
The member was opened for output-only processing or sequential-only processing.
No override operations are in effect that have specified sequential-only processing.
The file being opened is being extended because the increment number of records was set to zero.
The number of bytes available in the file is less than the number of bytes that fit into a block of
records.
Close considerations for sequential-only processing:
Here are the considerations for closing files when sequential-only processing is specified.
When a file for which sequential-only processing is specified is closed, all records still in the output
buffer are added to the database. However, if an error occurs for a record, any records following that
record are not added to the database.
Database programming
117
If multiple programs in the same job are sharing a sequential-only output file, the output buffer is not
emptied until the final close occurs. Consequently, a close (other than the last close in the job) does not
cause the records still in the buffer to appear in the database for this or any other job.
File name
Parameter
FILE
Command
CRTPF, CRTLF
CHGPF,
CHGLF
OPNDBF
OPNQRYF
OVRDBF
Yes
Yes1
Yes
Yes
Yes
Yes
Yes
Yes
Library name
LIB
Yes
Yes
Member
name
MBR
Yes
No
Yes
Yes
Yes
Member
processing
options
OPTION
No
No
Yes
Yes
No
No
No
No
No
Yes
Starting file
position after
open
POSITION
No
No
No
No
Yes
Program
SEQONLY
performs only
sequential
processing
No
No
Yes
Yes
Yes
Ignore keyed
sequence
access path
ACCPTH
No
No
Yes
No
No
Time to wait
for file locks
WAITFILE
Yes
Yes
No
No
Yes
Time to wait
for record
locks
WAITRCD
Yes
Yes
No
No
Yes
Prevent
overrides
SECURE
No
No
No
No
Yes
118
Parameter
Command
CRTPF, CRTLF
CHGPF,
CHGLF
OPNDBF
OPNQRYF
OVRDBF
Number of
NBRRCDS
records to be
transferred
from auxiliary
to main
storage
No
No
No
No
Yes
Share open
data path
with other
programs
SHARE
Yes3
Yes4
No
No
Yes
Format
selector
FMTSLR
Yes5
Yes5
No
No
Yes
Force ratio
FRCRATIO
Yes
Yes
No
No
Yes
Inhibit write
INHWRT
No
No
No
No
Yes
Level check
record
formats
LVLCHK
Yes
Yes
No
No
Yes
Expiration
EXPCHK
date checking
No
No
No
No
Yes
Expiration
date
EXPDATE
Yes6
Yes6
No
No
Yes
Force access
path
FRCACCPTH
Yes
Yes
No
No
No
Commitment
control
COMMIT
No
No
Yes
Yes
No
End-of-file
delay
EOFDLY
No
No
No
No
Yes
No
No
Yes
Yes
No
Yes6
Yes6
No
No
No
Coded
character set
identifier
Yes6
Yes6
No
No
No
Yes
Yes7
No
Yes
No
Yes
No
Yes
No
CCSID
LANGID
Yes
Database programming
119
Parameter
Command
CRTPF, CRTLF
CHGPF,
CHGLF
OPNDBF
OPNQRYF
OVRDBF
File name: The CHGPF and CHGLF commands use the file name for identification only. You cannot change the file
name.
Library name: The CHGPF and CHGLF commands use the library name for identification only. You cannot change
the library name.
Share open data path with other programs: It applies only to members that are added on the create file request.
Share open data path with other programs: It applies only to the current members of the file on the change file
request.
Expiration date, reuse deleted records, and coded character set identifier: They are used on the CRTPF and CHGPF
commands only.
Sort sequence and language identifier: They cannot be specified on the CHGLF command. They can be specified
on the CHGPF command only when they are used in conjunction with the source file.
RPG/400
ILE RPG
COBOL/400
ILE COBOL
PL/I
File name
Yes
Yes
Yes
Yes
Yes
Library name
No
Yes
No
No
Yes
Member name
No
Yes
No
No
Yes
Record length
Yes
Yes
Yes
Yes
Yes
Member
processing
options
Yes
Yes
Yes
Yes
Yes
Record format
lock state
No
No
No
No
Yes
Record formats
the program will
use
Yes
Yes
No
No
No
No
Yes
Yes
No
Program
performs only
sequential
processing
Yes
Yes
Yes
Yes
Yes
Ignore keyed
sequence access
path
Yes
Yes
Yes
Yes
Yes
No
No
No
No
Yes
Level check
record formats
Yes
Yes
Yes
Yes
Yes
120
Table 40. Database processing options specified in high-level language programs (continued)
Description
RPG/400
ILE RPG
COBOL/400
ILE COBOL
PL/I
Commitment
control
Yes
Yes
Yes
Yes
Yes
Duplicate key
check
No
No
Yes
Yes
No
Note: Control language (CL) programs can also specify many of these parameters. See Table 39 on page 118 for
more information about the database processing options that can be specified on CL commands.
Database programming
121
After finding the member, the system connects your program to the database file. This allows your
program to perform input/output operations on the file. For more information about opening files in
your high-level language program, see the appropriate high-level language topic collection.
You can also open a database file member with the OPNDBF command and the OPNQRYF command.
The OPNDBF command is useful in an initial program in a job for opening shared files. The OPNQRYF
command is very effective in selecting and arranging records outside your program. Then, your program
can use the information supplied by the OPNQRYF command to process only the data it needs.
Related concepts
Control language
Related reference
Open Database File (OPNDBF) command
Open Query File (OPNQRYF) command
ACCPTH parameter
If the file has a keyed sequence access path and either (1) the open option is *OUT, or (2) the open option
is *INP or *ALL, but your program does not use the keyed sequence access path, then you can specify
ACCPTH(*ARRIVAL) on the OPNDBF parameter. Ignoring the keyed sequence access path can improve
your jobs performance.
COMMIT parameter
Specify *YES if the application programs use commitment control. If you specify *YES, you must be
running in a commitment control environment (the Start Commitment Control (STRCMTCTL) command
was processed) or the OPNDBF command will fail. Use the default of *NO if the application programs do
not use commitment control.
DUPKEYCHK parameter
Specify whether you want duplicate key feedback. If you specify *YES, duplicate key feedback is returned
on I/O operations. If you specify *NO, duplicate key feedback is not returned on I/O operations. Use the
default (*NO) if the application programs are not written in the COBOL or ILE C/C++ language, or if
your COBOL or ILE C/C++ program does not use the duplicate-key feedback information that is
returned.
MBR parameter
If a member, other than the first member in the file, is to be opened, you must specify the name of the
member to be opened or issue an Override with Database File (OVRDBF) command before the OPNDBF
command.
Note: You must specify a member name on the OVRDBF command to use a member (other than the first
member) to open in subsequent programs.
OPNID parameter
If an identifier other than the file name is to be used, you must specify it. The open identifier can be used
in other control language (CL) commands to process the file. For example, the Close File (CLOF)
command uses the identifier to specify which file is to be closed.
122
OPNSCOPE parameter
This parameter specifies the scoping of the open data path (ODP). Specify *ACTGRPDFN if the request is
from the default activation group, and the ODP is to be scoped to the call level of the program issuing
the command. If the request is from any other activation group, the ODP is scoped to that activation
group. Specify *ACTGRP if the ODP is to be scoped to the activation group of the program issuing the
command. Specify *JOB if the ODP is to be scoped to the job. If you specify this parameter and the TYPE
parameter you get an error message.
OPTION parameter
Specify the *INP option if your application programs use input-only processing (reading records without
updating records). This allows the system to read records without trying to lock each one for possible
update. Specify the *OUT option if your application programs use output-only processing (writing
records into a file but not reading or updating existing records).
Note: If your program does direct output operations to active records (updating by relative record
number), *ALL must be specified instead of *OUT. If your program does direct output operations
to deleted records only, *OUT must be specified.
SEQONLY parameter
Specify *YES if subsequent application programs process the file sequentially. This parameter can also be
used to specify the number of records that should be transferred between the system data buffers and the
program data buffers. SEQONLY(*YES) is not allowed unless OPTION(*INP) or OPTION(*OUT) is also
specified on the Open Database File (OPNDBF) command. Sequential-only processing should not be used
with a keyed sequence access path file unless the physical data is in access path order.
TYPE parameter
Specify what you want to happen when exceptions that are not monitored occur in your application
program. If you specify *NORMAL, one of the following operations can happen:
v Your program can issue a Reclaim Resources (RCLRSC) command to close the files opened at a higher
level in the call stack than the program issuing the RCLRSC command.
v The high-level language you are using can perform a close operation.
Specify *PERM if you want to continue the application without opening the files again. TYPE(*NORMAL)
causes files to be closed if both of the following situations occur:
v Your program receives an error message.
v The files are opened at a higher level in the call stack.
TYPE(*PERM) allows the files to remain open even if an error message is received. Do not specify this
parameter if you specified the OPNSCOPE parameter.
123
The OPNQRYF command allows a dynamic definition without using DDS. The OPNQRYF command
does not support all of the DDS functions, but it supports significant functions that go beyond the
capabilities of DDS. In addition, IBM Query for i can be used to perform some of the functions that the
OPNQRYF command performs. However, the OPNQRYF command is more useful as a programmers
tool.
The OPNQRYF command parameters also have many functions similar to the SQL SELECT statements.
For example, the FILE parameter is similar to the SQL FROM statement, the QRYSLT parameter is similar
to the SQL WHERE statement, the GRPFLD parameter is similar to the SQL GROUP BY statement, and
the GRPSLT parameter is similar to the SQL HAVING statement.
The following list shows the major functions supplied by the OPNQRYF command:
v
v
v
v
v
v
v
v Group processing
v Final total-only processing
v Performance optimization
v Open query identifier (ID)
v Sort sequence processing
To understand the OPNQRYF command, you must be familiar with its two processing approaches: using
a format in the file, and using a file with a different format. The typical use of the OPNQRYF command
is to select, arrange, and format the data so it can be read sequentially by your high-level language
program.
Related concepts
SQL programming
Control language
Related reference
Open Query File (OPNQRYF) command
Creating queries:
You can use the Open Query File (OPNQRYF) command to create a query over database records.
Alternatively, you can create a query by running SQL scripts in System i Navigator.
Related concepts
Querying your database by running SQL scripts
Related reference
Open Query File (OPNQRYF) command
Creating an open query file using an existing record format:
The Open Query File (OPNQRYF) command does the record selection, and your program processes only
the records that meet the selection values. You can use this approach to select a set of records, return
records in a different sequence than they are stored, or both.
124
Assume that you only want your program to process the records in which the Code field is equal to D.
You create the program as if there were only records with a D in the Code field. That is, you do not code
any selection operations in the program. You then run the OPNQRYF command and specify that only the
records with a D in the Code field are to be returned to the program. The following chart is an example of
using the OPNQRYF command to select and sequence records:
Create the high-level language program to process the database file as you would any normal
program using externally described data. Only one format can be used, and it must exist in the
file.
Run the Override with Database file (OVRDBF) command specifying the file and member to be
processed and SHARE(*YES). (If the member is permanently changed to SHARE(*YES) and the
first or only member is the one you want to use, this step is not necessary.)
The OVRDBF command can be run after the OPNQRYF command, unless you want to override
the file name specified in the OPNQRYF command. In this discussion and in these examples, the
OVRDBF command is shown first.
Some restrictions are placed on using the OVRDBF command with the OPNQRYF command. For
example, MBR(*ALL) causes an error message and the file is not opened.
Run the OPNQRYF command, specifying the database file, member, format names, any selection
options, any sequencing options, and the scope of influence for the opened file.
Call the high-level language program you created in step 1. Besides using a high-level language,
the Copy from Query File (CPYFRMQRYF) command can also be used to process the file created
by the OPNQRYF command. Other control language (CL) commands (for example, the Copy File
(CPYF) and the Display Physical File Member (DSPPFM) commands) and utilities (for example,
Query) do not work on files created with the OPNQRYF command.
Close the file that you opened in step 3, unless you want the file to remain open. The Close File
(CLOF) command can be used to close the file.
Database programming
125
Delete the override specified in step 2 with the Delete Override (DLTOVR) command. It might
not always be necessary to delete the override, but the command is shown in all the examples for
consistency.
Related concepts
Files shared in a job on page 189
To use the open data path that is built by the Open Query File (OPNQRYF) command, your program
must share the query file.
Creating an open query file using a different record format:
For more advanced functions of the Open Query File (OPNQRYF) command (such as dynamically joining
records from different files), you must define a new file that contains a different record format.
This new file is separate from the one you are going to process and contains the fields that you want to
create with the OPNQRYF command. This powerful capability also lets you define fields that do not
currently exist in your database records, but can be derived from them.
When you code your high-level language program, specify the name of the file with the different format
so the externally described field definitions of both existing and derived fields can be processed by the
program.
Before calling your high-level language program, you must specify an Override with Database File
(OVRDBF) command to direct your program file name to the open query file. On the OPNQRYF
command, specify both the database file and the new file with the special format to be used by your
high-level language program. If the file you are querying does not have SHARE(*YES) specified, you
must specify SHARE(*YES) on the OVRDBF command.
The following chart shows the process flow:
126
Specify the data description specifications (DDS) for the file with the different record format, and
create the file. This file contains the fields that you want to process with your high-level language
program. Normally, data is not contained in this file, and it does not require a member. You
normally create this file as a physical file without keys. A field reference file can be used to
describe the fields. The record format name can be different from the record format name in the
database file that is specified. You can use any database or DDM file for this function. The file
can be a logical file and it can be indexed. It can have one or more members, with or without
data.
Create the high-level language program to process the file with the record format that you
created in step 1. In this program, do not name the database file that contains the data.
Run the OVRDBF command. Specify the name of the file with the different (new) record format
on the FILE parameter. Specify the name of the database file that you want to query on the
TOFILE parameter. You can also specify a member name on the MBR parameter. If the database
member you are querying does not have SHARE(*YES) specified, you must also specify
SHARE(*YES) on the OVRDBF command.
Run the OPNQRYF command. Specify the database file to be queried on the FILE parameter, and
specify the name of the file with the different (new) format that was created in step 1 on the
FORMAT parameter. Mapped field definitions can be required on the OPNQRYF command to
describe how to map the data from the database file into the format that was created in step 1.
You can also specify selection options, sequencing options, and the scope of influence for the
opened file.
Database programming
127
The first file named in step 4 for the FILE parameter was opened with OPNQRYF as
SHARE(*YES) and is still open. The file must be closed. The Close File (CLOF) command can be
used.
The previous steps show the normal flow using externally described data. It is not necessary to create
unique DDS and record formats for each OPNQRYF command. You can reuse an existing record format.
However, all fields in the record format must be actual fields in the real database file or defined by
mapped field definitions. If you use program-described data, you can create the program at any time.
You can use the file created in step 1 to hold the data created by the OPNQRYF command. For example,
you can replace step 5 with a high-level language processing program that copies data to the file with the
different format, or you can use the Copy from Query File (CPYFRMQRYF) command. The Copy File
(CPYF) command cannot be used. You can then follow step 5 with the CPYF command or Query.
Dynamically selecting records:
The Open Query File (OPNQRYF) command supports dynamic record selection. That is, you can request
a subset of records in a file without using data description specifications (DDS).
For example, you can select records that have a specific value or range of values (for example, all
customer numbers between 1000 and 1050).
The examples that follow show how to select records using the OPNQRYF command. In all these
examples, it is assumed that a single-format database file (physical or logical) is being processed. (The
FILE parameter on the OPNQRYF command allows you to specify a record format name if the file is a
multiple-format logical file.)
Related concepts
Usage notes for the Open Query File (OPNQRYF) command on page 161
You need to be aware of these considerations when using the Open Query File (OPNQRYF) command.
Related reference
Open Query File (OPNQRYF) command
Example 1: Dynamically selecting records:
This example shows how to select records with a specific value using the Open Query File (OPNQRYF)
command.
Assume that you want to select all the records from FILEA where the value of the Code field is D. Your
processing program is PGMB. PGMB only sees the records that meet the selection value (you do not have
to test in your program).
Note: You can specify parameters easier by using the prompt function for the OPNQRYF command. For
example, you can specify an expression for the QRYSLT parameter without the surrounding
delimiters because the system will add the single quotation marks.
Specify the following parameters:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) QRYSLT('CODE *EQ "D" ')
PGM(PGMB)
OPNID(FILEA)
FILE(FILEA)
Notes:
128
1. The entire expression in the QRYSLT parameter must be enclosed in single quotation marks (
).
2. When specifying field names in the OPNQRYF command, the names in the record are not
enclosed in quotation marks.
3. Character literals must be enclosed by quotation marks ( ). (The quotation mark character is
used in the examples.) It is important to place the character(s) between the quotation marks in
either uppercase or lowercase to match the value you want to find in the database. (The
examples are all shown in uppercase.)
4. To request a selection against a numeric constant, specify:
OPNQRYF
Note: Single quotation marks ( ) and quotation marks ( ) enclose the CL variables and
*CAT operators.
v If doing selection against a numeric field, specify:
OPNQRYF
Note: Single quotation marks enclose the field and operator only.
When comparing two fields or constants, the data types must be compatible. The following table
describes the valid comparisons.
Table 41. Valid data type comparisons for the OPNQRYF command
Any numeric
Character
Date1
Time1
Timestamp1
Any numeric
Character
Date1
Time1
Timestamp1
Valid
Not valid
Not valid
Not valid
Not valid
Not valid
Valid
Valid2
Valid2
Valid2
Not valid
Valid2
Valid
Not valid
Not valid
Not valid
Valid2
Not valid
Valid
Not valid
Not valid
Valid2
Not valid
Not valid
Valid
Date, time, and timestamp data types can be represented by fields and expressions, but not constants;
however, character constants can represent date, time, or timestamp values.
2
The character field or constant must represent a valid date value if compared to a date data type, a
valid time value if compared to a time data type, or a valid timestamp value if compared to a timestamp
data type.
The performance of record selection can be greatly enhanced if a file on the system uses the field being
selected in a keyed sequence access path. This allows the system to quickly access only the records that
meet the selection values. If no such access path exists, the system must read every record to determine if
it meets the selection values.
Database programming
129
Even if an access path exists on the field you want to select from, the system might not use the access
path. For example, if it is faster for the system to process the data in arrival sequence, it will do so.
Related concepts
Double-byte character set considerations on page 287
A double-byte character set (DBCS) is a character set that represents each character with 2 bytes. The
database on the i5/OS operating system supports DBCS.
Open Query File (OPNQRYF) command: Performance considerations on page 157
Here are the tips and techniques for optimizing the performance of the Open Query File (OPNQRYF)
command.
Example 2: Dynamically selecting records:
This example shows how to select records with a specific date value using the Open Query File
(OPNQRYF) command.
Assume that you want to process all records in which the Date field in the record is the same as the
current date. Also assume that the Date field is in the same format as the system date. In a control
language (CL) program, you can specify:
DCL
RTVSYSVAL
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
A CL variable is assigned with a leading ampersand (&) and is not enclosed in single quotation marks.
The whole expression is enclosed in single quotation marks. The CAT operators and CL variable are
enclosed in both single quotation marks and quotation marks.
It is important to know whether the data in the database is defined as character, date, time, timestamp, or
numeric. In the preceding example, the Date field is assumed to be character.
If the DATE field is defined as date data type, the preceding example can be specified as:
OVRDBF FILE(FILEA) SHARE(*YES)
OPNQRYF FILE(FILEA) QRYSLT('%CURDATE *EQ DATE')
CALL PGM(PGMB)
CLOF OPENID(FILEA)
DLTOVR FILE(FILEA)
Note: The date field does not have to have the same format as the system date.
You can also specify the example as:
DCL VAR(&CVTDAT); TYPE(*CHAR) LEN(6)
DCL VAR(&CURDAT); TYPE(*CHAR) LEN(8)
RTVSYSVAL SYSVAL(QDATE) RTNVAR(&CVTDAT);
CVTDAT DATE(&CVTDAT); TOVAR(&CURDAT); TOSEP(/)
OVRDBF FILE(FILEA) SHARE(*YES)
OPNQRYF FILE(FILEA)
QRYSLT('"' *CAT &CURDAT *CAT '" *EQ DATE')
CALL PGM(PGMB)
CLOF OPNID (FILEA)
DLTOVR FILE(FILEA)
This is where DATE has a date data type in FILEA, the job default date format is MMDDYY, and the job
default date separator is the slash (/).
Note: For any character representation of a date in one of the following formats, MMDDYY, DDMMYY,
YYMMDD, or Julian, the job default date format and separator must be the same to be recognized.
130
If, instead, you were using a constant, the QRYSLT would be specified as follows:
QRYSLT('"12/31/87" *EQ DATE')
The job default date format must be MMDDYY and the job default separator must be the slash (/).
If a numeric field exists in the database and you want to compare it to a variable, only a character
variable can be used. For example, to select all records where a packed Date field is greater than a
variable, you must ensure that the variable is in character form. Normally, this means that before the
OPNQRYF command, you use the Change Variable (CHGVAR) command to change the variable from a
decimal field to a character field. The CHGVAR command would be specified as follows:
CHGVAR VAR(&CHARVAR);
VALUE('123188')
The QRYSLT parameter would be specified as follows (see the difference from the preceding examples):
QRYSLT(&CHARVAR
If, instead, you were using a constant, the QRYSLT statement would be specified as follows:
QRYSLT('123187 *GT DATE')
FILE(FILEA) SHARE(*YES)
FILE(FILEA) QRYSLT('DATE *EQ %RANGE("88.01.01" +
"88.12.31") ')
PGM(PGMC)
OPNID(FILEA)
FILE(FILEA)
This example also works if the DATE field has a date data type, the job default date format is YYMMDD,
and the job default date separator is the period (.).
Note: For any character representation of a date in one of the following formats, MMDDYY, DDMMYY,
YYMMDD, or Julian, the job default date format and separator must be the same to be recognized.
If the ranges are variables defined as character data types and the DATE field is defined as a character
data type, specify the QRYSLT parameter as follows:
QRYSLT('DATE *EQ %RANGE("' *CAT &LORNG *CAT '"' *BCAT '"'
*CAT &HIRNG *CAT '")')
However, if the DATE field is defined as a numeric data type, specify the QRYSLT parameter as follows:
QRYSLT('DATE *EQ %RANGE(' *CAT &LORNG *BCAT &HIRNG *CAT ')')
Note: *BCAT can be used if the QRYSLT parameter is in a control language (CL) program, but it is not
allowed in an interactive command.
Example 4: Dynamically selecting records:
This example shows how to select records using the contains function of the Open Query File
(OPNQRYF) command.
Database programming
131
Assume that you want to process all records in which the Addr field contains the street named
BROADWAY. The contains (*CT) function determines if the characters appear anywhere in the named
field. You can specify as follows:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) QRYSLT('ADDR *CT "BROADWAY" ')
PGM(PGMC)
OPNID(FILEA)
FILE(FILEA)
In this example, assume that the data is in uppercase in the database record. If the data is in lowercase or
mixed case, you can specify a translation function to translate the lowercase or mixed case data to
uppercase before the comparison is made. The system-provided table QSYSTRNTBL translates the letters
a through z to uppercase. (You can use any translation table to perform the translation.) Therefore, you
can specify as follows:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) QRYSLT('%XLATE(ADDR QSYSTRNTBL) *CT +
"BROADWAY" ')
PGM(PGMC)
OPNID(FILEA)
FILE(FILEA)
When the %XLATE function is used on the QRYSLT statement, the value of the field passed to the
high-level language program appears as it is in the database. You can force the field to appear in
uppercase using the %XLATE function on the MAPFLD parameter.
Example 5: Dynamically selecting records:
This example shows how to select records by specifying multiple fields on the Open Query File
(OPNQRYF) command.
Assume that you want to process all records in which either the Amt field is equal to zero, or the Lstdat
field (YYMMDD order in character format) is equal to or less than 88-12-31. You can specify:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) QRYSLT('AMT *EQ 0 *OR LSTDAT +
*LE "88-12-31" ')
PGM(PGMC)
OPNID(FILEA)
FILE(FILEA)
This example also works if the LSTDAT field has a date data type. The LSTDAT field can be in any valid
date format; however, the job default date format must be YYMMDD and the job default date separator
must be the dash ().
Note: For any character representation of a date in one of the following formats, MMDDYY, DDMMYY,
YYMMDD, or Julian, the job default date format and separator must be the same to be recognized.
If variables are used, the QRYSLT parameter is typed as follows:
QRYSLT('AMT *EQ ' *CAT &VARAMT *CAT ' *OR +
LSTDAT *LE "' *CAT &VARDAT *CAT '"')
Note: The &VARAMT variable must be defined as a character type. If the variable is passed to your
control language (CL) program as a numeric type, you must convert it to a character type to allow
concatenation. You can use the Change Variable (CHGVAR) command to do this conversion.
132
133
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) QRYSLT('YEAR *EQ "88" ') +
MAPFLD((CHAR6 '%DIGITS(DATE)') +
(YEAR '%SST(CHAR6 5 2)' *CHAR 2))
PGM(PGMC)
OPNID(FILEA)
FILE(FILEA)
In this example, if DATE was a date data type, it can be specified as follows:
OPNQRYF FILE(FILEA) +
QRYSLT ('YEAR *EQ 88') +
MAPFLD((YEAR '%YEAR(DATE)'))
The first mapped field definition specifies that the Char6 field be created from the packed decimal Date
field. The %DIGITS function converts from packed decimal to character and ignores any decimal
definitions (that is, 1234.56 is converted to 123456). Because no definition of the Char6 field is specified,
the system assigns a length of 6. The second mapped field defines the Year field as type *CHAR
(character) and length 2. The expression uses the substring function to map the last 2 characters of the
Char6 field into the Year field.
Note that the mapped field definitions are processed in the order in which they are specified. In this
example, the Date field was converted to character and assigned to the Char6 field. Then, the last two
digits of the Char6 field (the year) were assigned to the Year field. Any changes to this order would have
produced an incorrect result.
Note: Mapped field definitions are always processed before the QRYSLT parameter is evaluated.
You can accomplish the same result by specifying the substring on the QRYSLT parameter and dropping
one of the mapped field definitions as follows:
OPNQRYF
FILE(FILEA) +
QRYSLT('%SST(CHAR6 5 2) *EQ "88" ') +
MAPFLD((CHAR6 '%DIGITS(DATE)'))
FILE(FILEA) SHARE(*YES)
FILE(FILEA) +
QRYSLT('%DIGITS(DATE) *EQ %WLDCRD("03__88")')
PGM(PGMC)
OPNID(FILEA)
FILE(FILEA)
Note that the only time the MAPFLD parameter is needed to define a database field for the result of the
%DIGITS function is when the result needs to be used with a function that only supports a simple field
name (not a function or expression) as an argument. The %WLDCRD operation has no such restriction on
the operand that appears before the *EQ operator.
Note that although the field in the database is in numeric form, quotation marks surround the literal to
make its definition the same as the Char6 field. The wildcard function is not supported for DATE, TIME,
or TIMESTAMP data types.
134
The %WLDCRD function lets you select any records that match your selection values, in which the
underline (_) will match any single character value. The two underline characters in Example 8 allow any
day in the month of March to be selected. The %WLDCRD function also allows you to name the wild
card character (underline is the default).
The wild card function supports two different forms:
v A fixed-position wild card as shown in the previous example in which the underline (or your
designated character) matches any single character as in this example:
QRYSLT('FLDA *EQ %WLDCRD("A_C")')
This compares successfully to ABC, ACC, ADC, AxC, and so on. In this example, the field being
analyzed only compares correctly if it is exactly 3 characters in length. If the field is longer than 3
characters, you also need the second form of wild card support.
v A variable-position wild card matches any zero or more characters. The Open Query File (OPNQRYF)
command uses an asterisk (*) for this type of wild card variable character or you can specify your own
character. An asterisk is used in this example:
QRYSLT('FLDB *EQ %WLDCRD("A*C*") ')
This compares successfully to AC, ABC, AxC, ABCD, AxxxxxxxC, and so on. The asterisk causes the
command to ignore any intervening characters if they exist. Notice that in this example the asterisk is
specified both before and after the character or characters that can appear later in the field. If the
asterisk is omitted from the end of the search argument, it causes a selection only if the field ends with
the character C.
You must specify an asterisk at the start of the wild card string if you want to select records where the
remainder of the pattern starts anywhere in the field. Similarly, the pattern string must end with an
asterisk if you want to select records where the remainder of the pattern ends anywhere in the field.
For example, you can specify:
QRYSLT('FLDB *EQ %WLDCRD("*ABC*DEF*") ')
You get a match on ABCxDEF, ABCxxxxxxDEF, ABCxxxDEFxxx, and so on. The underline forces at least
one character to appear between the ABC and DEF (for example, ABCDEF would not match).
Assume that you have a Name field that contains:
v
v
v
v
JOHNS
JOHNS SMITH
JOHNSON
JOHNSTON
You would not select the other records because a comparison is made with blanks added to the value you
specified. The way to select all four names is to specify:
QRYSLT('NAME *EQ %WLDCRD("JOHNS*")')
Database programming
135
Related concepts
Double-byte character set considerations on page 287
A double-byte character set (DBCS) is a character set that represents each character with 2 bytes. The
database on the i5/OS operating system supports DBCS.
Control language
Example 9: Dynamically selecting records:
This example shows how to specify complex selection statements when you select records using the Open
Query File (OPNQRYF) command.
Complex selection statements can also be specified. For example, you can specify:
QRYSLT('DATE *EQ "880101" *AND AMT *GT 5000.00')
QRYSLT('DATE *EQ "880101" *OR AMT *GT 5000.00')
The rules governing the priority of processing the operators are described in the Control language (CL)
topic. Some of the rules are:
v The *AND operations are processed first; therefore, the record would be selected if:
The Code field = A
or
The Code field = B
and
v Parentheses can be used to control how the expression is handled, as shown in this example:
QRYSLT('(CODE *EQ "A" *OR CODE *EQ "B") *AND TYPE *EQ "X" +
*OR CODE *EQ "C"')
and
and
You can also use the symbols described in the Control language (CL) topic, instead of the abbreviated
form (for example, you can use = instead of *EQ), as shown in this example:
QRYSLT('CODE = "A" & TYPE = "X" | AMT > 5000.00')
136
If field NAME has a CCSID of 37 and field CUSTOMER has a CCSID of 273, the mapping of either
NAME or CUSTOMER is performed during processing of the OPNQRYF command so that the join of the
two fields provides a meaningful result.
Normally, constants defined in the MAPFLD, QRYSLT, and GRPSLT parameters are tagged with the
CCSID defined to the current job. This suggests that when two users with different job CCSIDs run the
same OPNQRYF command (or a program containing an OPNQRYF command) and the OPNQRYF
command has constants defined in it, the users can get different results because the CCSID tagged to the
constants might cause the constants to be treated differently.
You can tag a constant with a specific CCSID by using the MAPFLD parameter. By specifying a MAPFLD
whose definition consists only of a constant and then specifying a CCSID for the MAPFLD, the constant
becomes tagged with the CCSID specified in the MAPFLD parameter. For example:
OPNQRYF FILE(FILEA) FORMAT(RESULTF) QRYSLT('NAME *EQ MAP1') +
MAPFLD((MAP1 '"Smith"' *CHAR 5 *N 37))
The constant Smith is tagged with the CCSID 37 regardless of the job CCSID of the user issuing the
OPNQRYF command. In this example, all users get the same result records (although the result records
would be mapped to the users job CCSID). Conversely, if the query is specified as:
OPNQRYF FILE(FILEA) FORMAT(RESULTF) QRYSLT('NAME *EQ "Smith"')
The results of the query might differ, depending on the job CCSID of the user issuing the OPNQRYF
command.
Related concepts
i5/OS globalization
Example 11: Dynamically selecting records:
This example shows how to use a sort sequence and a language identifier when you select records using
the Open Query File (OPNQRYF) command.
To see how to use a sort sequence, run the examples in this topic against the STAFF file shown in
Table 42.
Table 42. The STAFF file
ID
NAME
DEPT
JOB
YEARS
SALARY
COMM
10
Sanders
20
Mgr
18357.50
20
Pernal
20
Sales
18171.25
612.45
Database programming
137
NAME
DEPT
JOB
YEARS
SALARY
COMM
30
Merenghi
38
MGR
17506.75
40
OBrien
38
Sales
18006.00
846.55
50
Hanes
15
Mgr
10
20659.80
60
Quigley
38
SALES
00
16808.30
650.25
70
Rothman
15
Sales
16502.83
1152.00
80
James
20
Clerk
13504.60
128.20
90
Koonitz
42
sales
18001.75
1386.70
100
Plotz
42
mgr
18352.80
In the examples, the results are shown for a particular statement using each of the following sort
sequences:
v *HEX sort sequence.
v Shared-weight sort sequence for language identifier ENU.
v Unique-weight sort sequence for language identifier ENU.
Note: ENU is chosen as a language identifier by specifying either SRTSEQ(*LANGIDUNQ) or
SRTSEQ(*LANGIDSHR), and LANGID(ENU) in the OPNQRYF command.
The following command selects records with the value MGR in the JOB field:
OPNQRYF FILE(STAFF) QRYSLT('JOB *EQ "MGR"')
Table 43 shows the record selection with the *HEX sort sequence. The records that match the record
selection criteria for the JOB field are selected exactly as specified in the QRYSLT statement; only the
uppercase MGR is selected.
Table 43. Using the *HEX sort sequence. OPNQRYF FILE(STAFF) QRYSLT(JOB *EQ MGR) SRTSEQ(*HEX)
ID
NAME
DEPT
JOB
YEARS
SALARY
COMM
30
Merenghi
38
MGR
17506.75
Table 44 shows the record selection with the shared-weight sort sequence. The records that match the
record selection criteria for the JOB field are selected by treating uppercase and lowercase letters the
same. With this sort sequence, mgr, Mgr, and MGR values are selected.
Table 44. Using the shared-weight sort sequence. OPNQRYF FILE(STAFF) QRYSLT(JOB *EQ MGR)
SRTSEQ(LANGIDSHR) LANGID(ENU)
ID
NAME
DEPT
JOB
YEARS
SALARY
COMM
10
Sanders
20
Mgr
18357.50
30
Merenghi
38
MGR
17506.75
50
Hanes
15
Mgr
10
20659.80
100
Plotz
42
mgr
18352.80
Table 45 on page 139 shows the record selection with the unique-weight sort sequence. The records that
match the record selection criteria for the JOB field are selected by treating uppercase and lowercase
letters as unique. With this sort sequence, the mgr, Mgr, and MGR values are all different. The MGR value is
selected.
138
Table 45. Using the unique-weight sort sequence. OPNQRYF FILE(STAFF) QRYSLT(JOB *EQ MGR)
SRTSEQ(LANGIDUNQ) LANGID(ENU)
ID
NAME
DEPT
JOB
YEARS
SALARY
COMM
30
Merenghi
38
MGR
17506.75
Arranging records:
By using the Open Query File (OPNQRYF) command, you can arrange query records by the value of one
or more key fields in various ways and without using data description specifications (DDS).
Specifying dynamic keyed sequence access paths:
The Open Query File (OPNQRYF) command supports dynamic keyed sequence access paths. That is, you
can specify a keyed sequence access path without using data description specifications (DDS).
If an access path that can be shared already exists, the system can share it. If a new access path is
required, it is built before any records are passed to the program.
Related concepts
Specifying key fields from different physical files on page 140
The Open Query File (OPNQRYF) command allows you to specify a processing sequence for a join
logical file in which the keys can be in different physical files (DDS restricts the keys to the primary file).
Example 1: Specifying dynamic keyed sequence access paths:
This example shows how to arrange records using one key field.
Assume that you want to process the records in FILEA arranged by the value in the Cust field with
program PGMD. You can specify:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) KEYFLD(CUST)
PGM(PGMD)
OPNID(FILEA)
FILE(FILEA)
Note: The FORMAT parameter on the Open Query File (OPNQRYF) command is not needed because
PGMD is created by specifying FILEA as the processed file. FILEA can be an arrival sequence or a
keyed sequence file. If FILEA is keyed, its key field can be the Cust field or a totally different field.
Example 2: Specifying dynamic keyed sequence access paths:
This example shows how to arrange records using multiple key fields.
If you want the records to be processed by Cust sequence and then by Date in Cust, specify:
OPNQRYF
In these two examples, the FORMAT parameter is not used. (If a different format is defined, all key fields
must exist in the format.)
Example 3: Specifying dynamic keyed sequence access paths:
This example shows how to arrange records using a unique-weight sort sequence.
Database programming
139
To process the records by the JOB field values with a unique-weight sort sequence using the STAFF file in
Example 11: Dynamically selecting records on page 137, specify:
OPNQRYF FILE(STAFF) KEYFLD(JOB) SRTSEQ(*LANGIDUNQ) LANGID(ENU)
Mgr
MGR
sales
Sales
Sales
Sales
SALES
The results from this query are similar to the results in Example 3. The mgr and sales entries can be in
any sequence because the uppercase and lowercase letters are treated as equals. That is, the
shared-weight sort sequence treats mgr, Mgr, and MGR as equal values. Likewise, sales, Sales, and SALES
are treated as equal values.
Specifying key fields from different physical files:
The Open Query File (OPNQRYF) command allows you to specify a processing sequence for a join
logical file in which the keys can be in different physical files (DDS restricts the keys to the primary file).
The specification is identical to specifying dynamic keyed sequence access paths. The access path is
specified by using whatever key fields are required. There is no restriction on which physical file the key
fields are in. However, if a key field exists in other than the primary file of a join specification, the system
must make a temporary copy of the joined records. The system must also build a keyed sequence access
path over the copied records before the query file is opened. The key fields must exist in the format
identified on the FORMAT parameter.
Example: Specifying key fields from different physical files
This example shows how to use a field in a secondary file as a key field.
Assume that you already have a join logical file named JOINLF. FILEX is specified as the primary file
and is joined to FILEY. You want to process the records in JOINLF by the Descrp field which is in FILEY.
Assume that the file record formats contain the following fields.
FILEX
FILEY
JOINLF
Item
Qty
Item
Descrp
Item
Qty
140
FILEX
FILEY
JOINLF
Descrp
FILE(JOINLF) SHARE(*YES)
FILE(JOINLF) KEYFLD(DESCRP)
PGM(PGMC)
OPNID(JOINLF)
FILE(JOINLF)
If you want to arrange the records by Qty in Descrp (Descrp is the primary key field and Qty is a
secondary key field) you can specify:
OPNQRYF
Related concepts
Specifying dynamic keyed sequence access paths on page 139
The Open Query File (OPNQRYF) command supports dynamic keyed sequence access paths. That is, you
can specify a keyed sequence access path without using data description specifications (DDS).
Unique-key processing:
The Open Query File (OPNQRYF) command supports unique-key processing. It allows you to process
only the first record of a group.
A group is defined by one or more records with the same set of key values. Processing the first record
implies that the records you receive have unique keys.
When you use unique-key processing, you can only read the file sequentially. The key fields are sorted
according to the specified sort sequence (SRTSEQ) and language identifier (LANGID).
If you specify unique-key processing, and the file actually has duplicate keys, you receive only a single
record for each group of records with the same key value.
Related reference
Example 3: Specifying dynamic keyed sequence access paths on page 139
This example shows how to arrange records using a unique-weight sort sequence.
Example 4: Specifying dynamic keyed sequence access paths on page 140
This example shows how to arrange records using a shared-weight sort sequence.
Example 1: Unique-key processing:
This example shows how to read only unique-key records.
Assume that you want to process FILEA, which has records with duplicate keys for the Cust field. You
want only the first record for each unique value of the Cust field to be processed by program PGMF. You
can specify:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) KEYFLD(CUST) UNIQUEKEY(*ALL)
PGM(PGMF)
OPNID(FILEA)
FILE(FILEA)
Database programming
141
Assume that you want to process the same file with the sequence Slsman, Cust, Date, but you want only
one record per Slsman and Cust field. Assume that the file contains the following records.
Slsman
Cust
Date
Record #
01
01
01
01
02
5000
5000
4025
4025
3000
880109
880115
880103
880101
880101
1
2
3
4
5
You specify the number of key fields that are unique, starting with the first key field.
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) KEYFLD(SLSMAN CUST DATE) UNIQUEKEY(2)
PGM(PGMD)
OPNID(FILEA)
FILE(FILEA)
Cust
Date
Record #
01
01
02
4025
5000
3000
880101
880109
880101
4
1
5
Note: Null values are treated as equal, so only the first null value would be returned.
Random processing:
In addition to sequential processing, you can use the OPNQRYF command for random processing (for
example, the RPG language operation CHAIN or the COBOL language operation READ). However, if
you use the grouping or unique-key function, you cannot process the file randomly.
Considerations for arranging records:
Here are the considerations for arranging records using the Open Query File (OPNQRYF) command.
The default processing for the OPNQRYF command provides records in any order that improves
performance and does not conflict with the order specified on the KEYFLD parameter. Therefore, unless
you specify the KEYFLD parameter to either name specific key fields or specify KEYFLD(*FILE), the
sequence of the records returned to your program can vary each time you run the same OPNQRYF
command.
When you specify the KEYFLD(*FILE) parameter option for the OPNQRYF command, and a sort
sequence other than *HEX has been specified for the query with the job default or the OPNQRYF
SRTSEQ parameter, you can receive your records in an order that does not reflect the true file order. If
the file is keyed, the querys sort sequence is applied to the key fields of the file and informational
message CPI431F is sent. The files sort sequence and alternative collating sequence table are ignored for
the ordering, if they exist. This allows users to indicate which fields to apply a sort sequence to without
having to list all the field names. If a sort sequence is not specified for the query (for example, *HEX),
ordering is done as it was prior to Version 2 Release 3.
Formatting records:
The Open Query File (OPNQRYF) command allows you to specify a record format for the query records.
You can also define fields that are mapped from existing fields through numeric and character operations.
142
FILEAA
Order
Item
Qty
Price
Descrp
Order
Item
Exten
Brfdsc
The Exten field is a mapped field. Its value is determined by multiplying Qty times Price. It is not
necessary to have either the Qty or Price field in the new format, but they can exist in that format, too, if
you want. The Brfdsc field is a brief description of the Descrp field (it uses the first 10 characters).
Assume that you have specified PGMF to process the new format. To create this program, use FILEAA as
the file to read. You can specify:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
Notice that the attributes of the Exten field are those defined in the record format for FILEAA. If the
value calculated for the field is too large, an exception is sent to the program.
It is not necessary to use the substring function to map to the Brfdsc field if you only want the characters
from the beginning of the field. The length of the Brfdsc field is defined in the FILEAA record format.
All fields in the format specified on the FORMAT parameter must be described on the OPNQRYF
command. That is, all fields in the output format must either exist in one of the record formats for the
files specified on the FILE parameter or be defined on the MAPFLD parameter. If you have fields in the
format on the FORMAT parameter that your program does not use, you can use the MAPFLD parameter
Database programming
143
to place zeros or blanks in the fields. Assume the Fldc field is a character field and the Fldn field is a
numeric field in the output format, and you are using neither value in your program. You can avoid an
error on the OPNQRYF command by specifying:
MAPFLD((FLDC ' " " ')(FLDN 0))
Notice quotation marks enclose a blank value. By using a constant for the definition of an unused field,
you avoid having to create a unique format for each use of the OPNQRYF command.
Example 2: Defining fields mapped from existing fields:
This example shows the use of built-in functions.
Assume that you want to calculate a mathematical function that is the sine of the Fldm field in FILEA.
First, you can create a file (assume that it is called FILEAA) with a record format that contains the
following fields.
FILEA
FILEAA
Code
Fldm
Code
Fldm
Sinm
You can then create a program (assume PGMF) using FILEAA as input and specify:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
The built-in function %SIN calculates the sine of the field specified as its argument. Because the Sinm
field is defined in the format specified on the FORMAT parameter, the Open Query File (OPNQRYF)
command converts its internal definition of the sine value (in binary floating point) to the definition of
the Sinm field. This technique can be used to avoid certain high-level language restrictions on the use of
binary floating-point fields. For example, if you defined the Sinm field as a packed decimal field, PGMF
can be written in any high-level language, even though the value was built using a binary floating-point
field.
There are many other functions besides sine that can be used.
Related reference
Built-in functions on page 166
These built-in functions are supported for an expression that is used to define a derived field on the
MAPFLD parameter or for a complex selection operand specified on the QRYSLT or GRPSLT parameter.
Restricted built-in functions on page 180
Some built-in functions are restricted in the way certain relational operators are specified on the QRYSLT
and GRPSLT parameters.
Example 3: Defining fields mapped from existing fields:
This example shows the use of mapped fields and built-in functions.
Assume, in Example 2: Defining fields mapped from existing fields, that a field called Fldx also exists
in FILEA and the Fldx field has appropriate attributes used to hold the sine of the Fldm field. Also,
assume that you are not using the content of the Fldx field. You can use the MAPFLD parameter to
change the content of a field before passing it to your high-level language program. For example, you can
specify:
144
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) MAPFLD((FLDX '%SIN(FLDM)'))
PGM(PGMF) /* Created using file FILEA as input */
OPNID(FILEA)
FILE(FILEA)
In this case, you do not need to specify a different record format on the FORMAT parameter. (The default
uses the format of the first file on the FILE parameter.) Therefore, the program is created by using FILEA.
When using this technique, you must ensure that the field you redefine has attributes that allow the
calculated value to process correctly. The least complicated approach is to create a separate file with the
specific fields you want to process for each query.
You can also use this technique with a mapped field definition and the %XLATE function to translate a
field so that it appears to the program in a different manner than what exists in the database. For
example, you can translate a lowercase field so the program only sees uppercase.
The sort sequence and language identifier can affect the results of the %MIN and %MAX built-in
functions. For example, the uppercase and lowercase versions of letters can be equal or unequal
depending on the selected sort sequence and language identifier.
Note: The translated field value is used to determine the minimum and maximum, but the untranslated
value is returned in the result record.
The example described uses FILEA as an input file. You can also update data using the Open Query File
(OPNQRYF) command. However, if you use a mapped field definition to change a field, updates to the
field are ignored.
Related reference
Built-in functions on page 166
These built-in functions are supported for an expression that is used to define a derived field on the
MAPFLD parameter or for a complex selection operand specified on the QRYSLT or GRPSLT parameter.
Restricted built-in functions on page 180
Some built-in functions are restricted in the way certain relational operators are specified on the QRYSLT
and GRPSLT parameters.
Considerations for specifying record formats:
Here are the considerations for using the FORMAT parameter on the Open Query File (OPNQRYF)
command.
You must specify a record format name on the FORMAT parameter when you request join processing by
specifying multiple entries on the FILE parameter (that is, you cannot specify FORMAT(*FILE)). Also, a
record format name is normally specified with the grouping function or when you specify a complex
expression on the MAPFLD parameter to define a derived field. Consider the following guidelines and
rules:
v The record format name is any name you select. It can differ from the format name in the database file
you want to query.
v The field names are any names you select. If the field names are unique in the database files you are
querying, the system implicitly maps the values for any fields with the same name in a queried file
record format (FILE parameter) and in the query result format (FORMAT parameter).
v If the field names are unique, but the attributes differ between the file specified on the FILE parameter
and the file specified on the FORMAT parameter, the data is implicitly mapped.
v The correct field attributes must be used when using the MAPFLD parameter to define derived fields.
For example, if you are using the grouping %SUM function, you must define a field that is large
enough to contain the total. If not, an arithmetic overflow occurs and an exception is sent to the
program.
Database programming
145
v Decimal alignment occurs for all field values mapped to the record format identified on the FORMAT
parameter. Assume that you have a field in the query result record format with 5 digits with 0
decimals, and the value that was calculated or must be mapped to that field is 0.12345. You will receive
a result of 0 in your field because digits to the right of the decimal point are truncated.
Related reference
Example 1: Dynamically joining database files on page 150
This example shows how to dynamically join database files without DDS.
Grouping records:
By using the Open Query File (OPNQRYF) command, you can group records by like values of one or
more fields and calculate aggregate functions, such as the minimum field value and average field value,
for each group.
Summarizing data from database file records (grouping):
The group processing function of the Open Query File (OPNQRYF) command allows you to summarize
data from existing database records.
You can specify:
The grouping fields
Selection values both before and after grouping
A keyed sequence access path over the new records
Mapped field definitions that allow you to do such functions as sum, average, standard deviation, and
variance, as well as counting the records in each group
v The sort sequence and language identifier that supply the weights by which the field values are
grouped
v
v
v
v
You normally start by creating a file with a record format containing only the following types of fields:
v Grouping fields. Specified on the GRPFLD parameter that define groups. Each group contains a
constant set of values for all grouping fields. The grouping fields do not need to appear in the record
format identified on the FORMAT parameter.
v Aggregate fields. Defined by using the MAPFLD parameter with one or more of the following built-in
functions:
%COUNT
Counts the records in a group
%SUM
A sum of the values of a field over the group
%AVG
Arithmetic average (mean) of a field, over the group
%MAX
Maximum value in the group for the field
%MIN
Minimum value in the group for the field
%STDDEV
Standard deviation of a field, over the group
%VAR Variance of a field, over the group
v Constant fields. Allow constants to be placed in field values. The restriction that the Open Query File
(OPNQRYF) command must know all fields in the output format is also true for the grouping function.
146
When you use group processing, you can only read the file sequentially.
Example: Summarizing data from database file records (grouping):
This example shows how to use the group processing function to summarize data from existing database
records.
Assume that you want to group the data by customer number and analyze the amount field. Your
database file is FILEA and you create a file named FILEAA containing a record format with the following
fields.
FILEA
FILEAA
Cust
Type
Amt
Cust
Count (count of records per customer)
Amtsum (summation of the amount field)
Amtavg (average of the amount field)
Amtmax (maximum value of the amount field)
When you define the fields in the new file, you must ensure that they are large enough to hold the
results. For example, if the Amt field is defined as 5 digits, you might need to define the Amtsum field as
7 digits. Any arithmetic overflow causes your program to end abnormally.
Assume that the records in FILEA have the following values.
Cust
Type
Amt
001
001
004
002
003
001
004
003
A
B
A
A
B
A
A
B
500.00
700.00
100.00
1200.00
900.00
300.00
300.00
600.00
You then create a program (PGMG) using FILEAA as input to print the records.
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
Count
Amtsum
Amtavg
Amtmax
001
002
003
004
3
1
2
2
1500.00
1200.00
1500.00
400.00
500.00
1200.00
750.00
200.00
700.00
1200.00
900.00
300.00
Database programming
147
Note: If you specify the GRPFLD parameter, the groups might not appear in ascending sequence. To
ensure a specific sequence, you should specify the KEYFLD parameter.
Assume that you want to print only the summary records in this example in which the Amtsum value is
greater than 700.00. Because the Amtsum field is an aggregate field for a given customer, use the GRPSLT
parameter to specify selection after grouping. Add the GRPSLT parameter:
GRPSLT('AMTSUM *GT 700.00')
Count
Amtsum
Amtavg
Amtmax
001
002
003
3
1
2
1500.00
1200.00
1500.00
500.00
1200.00
750.00
700.00
1200.00
900.00
The Open Query File (OPNQRYF) command supports selection both before grouping (QRYSLT
parameter) and after grouping (GRPSLT parameter).
Assume that you want to select additional customer records in which the Type field is equal to A. Because
Type is a field in the record format for file FILEA and not an aggregate field, you add the QRYSLT
statement to select before grouping as follows:
QRYSLT('TYPE *EQ "A" ')
Note: Fields used for selection do not have to appear in the format processed by the program.
Your program retrieves the following records.
Cust
Count
Amtsum
Amtavg
Amtmax
001
002
2
1
800.00
1200.00
400.00
1200.00
500.00
1200.00
Note: The values for CUST 001 changed because the selection took place before the grouping took place.
Assume that you want to arrange the output by the Amtavg field in descending sequence, in addition to
the previous QRYSLT parameter value. You can do this by changing the KEYFLD parameter on the
OPNQRYF command as:
KEYFLD((AMTAVG *DESCEND))
Count
Amtsum
Amtavg
Amtmax
002
001
1
2
1200.00
800.00
1200.00
400.00
1200.00
500.00
148
FINTOT
Code
Amt
The FINTOT file is created specifically to hold the single record which is created with the final totals. You
can specify:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
You can use the GRPSLT keyword with the final total function. The GRPSLT selection values you specify
determines if you receive the final total record.
Example 3: Final total-only processing:
This example shows total-only processing using a new record format.
Assume that you want to process the new file/format with a control language (CL) program. You want to
read the file and send a message with the final totals. You can specify:
DCLF
DCL
DCL
OVRDBF
OPNQRYF
RCVF
CLOF
CHGVAR
CHGVAR
SNDPGMMSG
DLTOVR
FILE(FINTOT)
&COUNTA *CHAR LEN(7)
&TOTAMTA *CHAR LEN(9)
FILE(FINTOT) TOFILE(FILEA) SHARE(*YES)
FILE(FILEA) FORMAT(FINTOT) MAPFLD((COUNT '%COUNT') +
(TOTAMT '%SUM(AMT)'))
OPNID(FILEA)
&COUNTA &COUNT
&TOTAMTA &TOTAMT
MSG('COUNT=' *CAT &COUNTA *CAT +
' Total amount=' *CAT &TOTAMTA);
FILE(FINTOT)
You must convert the numeric fields to character fields to include them in an immediate message.
Database programming
149
150
Assume that you want to join FILEA and FILEB and the files contain the following fields.
FILEA
FILEB
JOINAB
Cust
Name
Addr
Cust
Amt
Cust
Name
Amt
The join field is Cust which exists in both files. Any record format name can be specified on the Open
Query File (OPNQRYF) command for the join file. The file does not need a member. The records are not
required to be in keyed sequence.
You can specify:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
File JOINAB is a physical file with no data. This file contains the record format to be specified on the
FORMAT parameter of the OPNQRYF command.
Notice that the TOFILE parameter on the Override with Database File (OVRDBF) command specifies the
name of the primary file for the join operation (the first file specified for the FILE parameter on the
OPNQRYF command). In this example, the FILE parameter on the OPNQRYF command identifies the
files in the sequence they are to be joined (A to B). The format for the file is in the file JOINAB.
The JFLD parameter identifies the Cust field in FILEA to join to the Cust field in FILEB. Because the Cust
field is not unique across all of the joined record formats, it must be qualified on the JFLD parameter. The
system attempts to determine, in some cases, the most efficient values even if you do not specify the
JFLD parameter on the OPNQRYF command. For example, using the previous example, if you specified:
OPNQRYF
The system joins FILEA and FILEB using the Cust field because of the values specified for the QRYSLT
parameter. Notice that in this example the JFLD parameter is not specified on the command. However, if
either JDFTVAL(*ONLYDFT) or JDFTVAL(*YES) is specified on the OPNQRYF command, the JFLD
parameter must be specified.
The MAPFLD parameter is needed on the Open Query File (OPNQRYF) command to describe which file
should be used for the data for the Cust field in the record format for file JOINAB. If a field is defined on
the MAPFLD parameter, its unqualified name (the Cust field in this case without the file name
identification) can be used anywhere else in the OPNQRYF command. Because the Cust field is defined
on the MAPFLD parameter, the first value of the JFLD parameter need not be qualified. For example, the
same result can be achieved by specifying:
JFLD((CUST FILEB/CUST)) +
MAPFLD((CUST 'FILEA/CUST'))
Any other uses of the same field name in the OPNQRYF command to indicate a field from a file other
than the file defined by the MAPFLD parameter must be qualified with a file name.
Database programming
151
Because no KEYFLD parameter is specified, the records appear in any sequence depending on how the
OPNQRYF command selects the records. You can force the system to arrange the records the same as the
primary file. To do this, specify *FILE on the KEYFLD parameter. You can specify this even if the primary
file is in arrival sequence.
The JDFTVAL parameter (similar to the JDFTVAL keyword in DDS) can also be specified on the
OPNQRYF command to describe what the system should do if one of the records is missing from the
secondary file. In this example, the JDFTVAL parameter was not specified, so only the records that exist
in both files are selected.
If you tell the system to improve the results of the query (through parameters on the OPNQRYF
command), it generally tries to use the file with the smallest number of records selected as the primary
file. However, the system also tries to avoid building a temporary file.
You can force the system to follow the file sequence of the join as you have specified it in the FILE
parameter on the OPNQRYF command by specifying JORDER(*FILE). If JDFTVAL(*YES) or
JDFTVAL(*ONLYDFT) is specified, the system will never change the join file sequence because a different
sequence can cause different results.
Example 2: Dynamically joining database files:
This example shows how to read only those records that have a match in secondary files.
Assume that you want to join files FILEAB, FILECD, and FILEEF to select only those records with
matching records in secondary files. Define a file JOINF and describe the format that should be used.
Assume that the record formats for the files contain the following fields.
FILEAB
FILECD
FILEEF
JOINF
Abitm
Abord
Abdat
Cditm
Cddscp
Cdcolr
Efitm
Efcolr
Efqty
Abitm
Abord
Cddscp
Cdcolr
Efqty
In this case, all field names in the files that make up the join file begin with a 2-character prefix (identical
for all fields in the file) and end with a suffix that is identical across all the files (for example, xxitm). This
makes all field names unique and avoids having to qualify them.
The xxitm field allows the join from FILEAB to FILECD. The two fields xxitm and xxcolr allow the join
from FILECD to FILEEF. A keyed sequence access path does not have to exist for these files. However, if
a keyed sequence access path does exist, performance might improve significantly because the system
will attempt to use the existing access path to arrange and select records, where it can. If access paths do
not exist, the system automatically creates and maintains them as long as the file is open.
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
The join field pairs do not have to be specified in the preceding order. For example, the same result is
achieved with a JFLD parameter value of:
JFLD((CDCOLR EFCOLR)(ABITM CDITM) (CDITM EFITM))
152
The attributes of each pair of join fields do not have to be identical. Normal padding of character fields
and decimal alignment for numeric fields occurs automatically.
The JDFTVAL parameter is not specified so *NO is assumed and no default values are used to construct
join records. If you specified JDFTVAL(*YES) and there is no record in file FILECD that has the same join
field value as a record in file FILEAB, defaults are used for the Cddscp and Cdcolr fields to join to file
FILEEF. Using these defaults, a matching record can be found in file FILEEF (depending on if the default
value matches a record in the secondary file). If not, a default value appears for these files and for the
Efqty field.
Example 3: Dynamically joining database files:
This example shows how to use mapped fields as join fields.
You can use fields defined on the MAPFLD parameter for either one of the join field pairs. This is useful
when the key in the secondary file is defined as a single field (for example, a 6-character date field) and
there are separate fields for the same information (for example, month, day, and year) in the primary file.
Assume that FILEA has character fields Year, Month, and Day and needs to be joined to FILEB which has
the Date field in YYMMDD format. Assume that you have defined file JOINAB with the required format.
You can specify:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
The MAPFLD parameter defines the YYMMDD field as the concatenation of several fields from FILEA.
You do not need to specify field attributes (for example, length or type) for the YYMMDD field on the
MAPFLD parameter because the system calculates the attributes from the expression.
Handling missing records in secondary join files:
The system allows you to control whether to use defaults for missing records in secondary files (similar
to the JDFTVAL DDS keyword for a join logical file). You can also specify that only records with defaults
be processed when you use the Open Query File (OPNQRYF) command.
Example: Handling missing records in secondary join file
This example shows how to read records from the primary file that do not have a match in the secondary
file.
In Example 1: Dynamically joining database files on page 150, the JDFTVAL parameter is not specified,
so the only records read are the result of a successful join from FILEA to FILEB. If you want a list of the
records in FILEA that do not have a match in FILEB, you can specify *ONLYDFT on the JDFTVAL
parameter as shown in the this example:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA FILEB) FORMAT(FILEA) +
JFLD((CUST FILEB/CUST)) +
MAPFLD((CUST 'FILEA/CUST')) +
JDFTVAL(*ONLYDFT)
PGM(PGME) /* Created using file FILEA as input */
OPNID(FILEA)
FILE(FILEA)
JDFTVAL(*ONLYDFT) causes a record to be returned to the program only when there is no equivalent
record in the secondary file (FILEB).
Database programming
153
Because any values returned by the join operation for the fields in FILEB are defaults, it is normal to use
only the format for FILEA. The records that appear are those that do not have a match in FILEB. The
FORMAT parameter is required whenever the FILE parameter describes more than a single file, but the
file name specified can be one of the files specified on the FILE parameter. The program is created using
FILEA.
Conversely, you can also get a list of all the records where there is a record in FILEB that does not have a
match in FILEA. You can do this by making the secondary file the primary file in all the specifications.
You can specify:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEB) SHARE(*YES)
FILE(FILEB FILEA) FORMAT(FILEB) JFLD((CUST FILEA/CUST)) +
MAPFLD((CUST 'FILEB/CUST')) JDFTVAL(*ONLYDFT)
PGM(PGMF) /* Created using file FILEB as input */
OPNID(FILEB)
FILE(FILEB)
Note: The Override with Database File (OVRDBF) command in this example uses FILE(FILEB) because it
must specify the first file on the FILE parameter of the OPNQRYF command. The Close File
(CLOF) command also names FILEB. The JFLD and MAPFLD parameters are also changed. The
program is created using FILEB.
Optimizing performance:
By using the Open Query File (OPNQRYF) command, you can specify how the system performs the
selection and processing to improve performance.
Controlling how the system runs the Open Query File (OPNQRYF) command:
The performance optimization function of the Open Query File (OPNQRYF) command allows you to
specify how you are going to use the results of the query.
When you use the Open Query File (OPNQRYF) command, there are two steps where performance
considerations exist. The first step is during the actual processing of the OPNQRYF command itself. This
step decides if the OPNQRYF command is going to use an existing access path or build a new one for
this query request. The second step when performance considerations play a role is when the application
program is using the results of the OPNQRYF command to process the data.
For most batch type functions, you are usually only interested in the total time of both steps mentioned
in the preceding paragraph. Therefore, the default for the OPNQRYF command is OPTIMIZE(*ALLIO).
This means that the OPNQRYF command considers the total time it takes for both steps.
If you use the OPNQRYF command in an interactive environment, you might not be interested in
processing the entire file. You might want the first screen full of records to be displayed as quickly as
possible. For this reason, you want the first step to avoid building an access path, if possible. You can
specify OPTIMIZE(*FIRSTIO) in such a situation.
If you want to process the same results of the OPNQRYF command with multiple programs, you might
want the first step to make an efficient open data path (ODP). That is, you try to minimize the number of
records that must be read by the processing program in the second step by specifying
OPTIMIZE(*MINWAIT) on the OPNQRYF command.
If the KEYFLD or GRPFLD parameter on the OPNQRYF command requires that an access path be built
when there is no access path to share, the access path is built entirely regardless of the OPTIMIZE entry.
Optimization mainly affects selection processing.
154
Related concepts
Database performance and query optimization
Example 1: Controlling how the system runs the Open Query File (OPNQRYF) command:
This example shows how to optimize for the first set of records.
Assume that you have an interactive job in which the operator requests all records where the Code field is
equal to B. Your programs subfile contains 15 records per screen. You want to get the first screen of
results to the operator as quickly as possible. You can specify:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) QRYSLT('CODE = "B" ') +
SEQONLY(*YES 15) OPTIMIZE(*FIRSTIO)
PGM(PGMA)
OPNID(FILEA)
FILE(FILEA)
The system optimizes handling the query and fills the first buffer with records before completing the
entire query regardless of whether an access path already exists over the Code field.
Example 2: Controlling how the system runs the Open Query File (OPNQRYF) command:
This example shows how to minimize the number of records that multiple programs read.
Assume that you have multiple programs that will access the same file which is built by the Open Query
File (OPNQRYF) command. In this case, you will want to optimize the performance so that the
application programs read only the data they are interested in. This means that you want OPNQRYF to
perform the selection as efficiently as possible. You can specify:
OVRDBF
OPNQRYF
CALL
POSDBF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) QRYSLT('CODE *EQ "B"') +
KEYFLD(CUST) OPTIMIZE(*MINWAIT)
PGM(PGMA)
OPNID(FILEA) POSITION(*START)
PGM(PGMB)
OPNID(FILEA)
FILE(FILEA)
Description
CPI4301
CPI4302
CPI4303
CPI4304
CPI4305
CPI4306
CPI4307
Query
Query
Query
Query
Query
Query
Query
&2.
Query
CPI4011
running.
running.
running.
running.
running.
running.
running.
running.
Database programming
155
To stop these status messages from appearing, you can see the discussion about message handling in the
Control language (CL) topic.
When your job is running under debug (by using the Start Debug (STRDBG) command), or requested
with query options file option of DEBUG_MESSAGES *YES, messages are sent to your job log. These
messages describe the implementation method that is used to process the OPNQRYF request. These
messages provide information about the optimization processing that occurred. You can use these
messages as a tool for tuning the OPNQRYF request to achieve the best performance. Listed here are
these messages:
CPI4321
Access path built for file...
CPI4322
Access path built from keyed file...
CPI4324
Temporary file built from file...
CPI4325
Temporary file built for query
CPI4326
File processed in join position...
CPI4327
File processed in join position 1.
CPI4328
Access path of file that is used...
CPI4329
Arrival sequence that is used for file...
CPI432A
Query optimizer timed out...
CPI432C
All access paths considered for file...
CPI432E
Selection fields mapped to different attributes...
CPI432F
Access path suggestion for file...
CPI433B
Unable to update query options file.
CPI4330
&6 tasks used for parallel &10 scan of file &1.
CPI4332
&6 tasks used for parallel index that is created over file...
CPI4333
Hashing algorithm used to process join.
CPI4338
&1 access paths used for bitmap processing of file...
CPI4339
Query options retrieved file &2 in library &1.
156
CPI4341
Performing distributed query.
CPI4342
Performing distributed join for query.
CPI4345
Temporary distributed result file &4 built...
CPI4346
Optimizer debug messages for query join step &1 of &2 follow:
CPI4347
Query is processing in multiple steps.
Most of the messages provide a reason why the particular option was performed. The second level text
on each message gives an extended description of why the option was chosen. Some messages provide
suggestions to help improve the performance of the OPNQRYF request.
Related concepts
Control language
Open Query File (OPNQRYF) command: Performance considerations:
Here are the tips and techniques for optimizing the performance of the Open Query File (OPNQRYF)
command.
The best performance can occur when the OPNQRYF command uses an existing keyed sequence access
path. For example, if you want to select all the records where the Code field is equal to B and an access
path exists over the Code field, the system can use the access path to perform the selection (key
positioning selection) rather than read the records and select at run time (dynamic selection).
The OPNQRYF command cannot use an existing index when any of the following conditions are true:
v The key field in the access path is derived from a substring function.
v The key field in the access path is derived from a concatenation function.
v Both listed here are true of the sort sequence table associated with the query (specified on the SRTSEQ
parameter):
It is a shared-weight sequence table.
It does not match the sequence table associated with the access path (a sort sequence table or an
alternate collating sequence table).
v Both listed here are true of the sort sequence table associated with the query (specified on the SRTSEQ
parameter):
It is a unique-weight sequence table.
It does not match the sequence table associated with the access path (a sort sequence table or an
alternate collating sequence table) when either:
- Ordering is specified (KEYFLD parameter).
- Record selection exists (QRYSLT parameter) that does not use *EQ, *NE, *CT, %WLDCRD, or
%VALUES.
- Join selection exists (JFLD parameter) that does not use *EQ or *NE operators.
Part of the OPNQRYF processing is to determine what is the fastest approach to satisfying your request.
If the file you are using is large and most of the records have the Code field equal to B, it is faster to use
arrival sequence processing than to use an existing keyed sequence access path. Your program still sees
the same records. The OPNQRYF processing can only make this type of decision if an access path exists
Database programming
157
on the Code field. In general, if your request includes approximately 20% or more of the number of
records in the file, the OPNQRYF processing tends to ignore the existing access paths and read the file in
arrival sequence.
If no access path exists over the Code field, the program reads all of the records in the file and passes
only the selected records to your program. That is, the file is processed in arrival sequence.
The system can perform selection faster than your application program. If no appropriate keyed sequence
access path exists, either your program or the system makes the selection of the records you want to
process. Allowing the system to perform the selection process is considerably faster than passing all the
records to your application program.
This is especially true if you are opening a file for update operations because individual records must be
passed to your program, and locks are placed on every record read (in case your program needs to
update the record). By letting the system perform the record selection, the only records passed to your
program and locked are those that meet your selection values.
If you use the KEYFLD parameter to request a specific sequence for reading records, the fastest
performance results if an access path already exists that uses the same key specification or if a keyed
sequence access path exists that is similar to your specifications (such as a key that contains all the fields
you specified plus some additional fields on the end of the key). This is also true for the GRPFLD
parameter and on the to-fields of the JFLD parameter. If no such access path exists, the system builds an
access path and maintains it as long as the file is open in your job.
Processing all the records in a file by an access path that does not already exist is generally not as
efficient as using a full record sort, if the number of records to be arranged (not necessarily the total
number of records in the file) exceeds 1000 and is greater than 20% of the records in the file. While it is
generally faster to build the keyed sequence access path than to do the sort, faster processing allowed by
the use of arrival sequence processing normally favors sorting the data when looking at the total job time.
If a usable access path already exists, using the access path can be faster than sorting the data. You can
use the ALWCPYDTA(*OPTIMIZE) parameter of the Open Query File (OPNQRYF) command to allow the
system to use a full record sort if this is the fastest method of processing records.
If you do not intend to read all of the query records and if the OPTIMIZE parameter is *FIRSTIO or
*MINWAIT, you can specify a number to indicate how many records you intend to retrieve. If the
number of records is considerably less than the total number the query is expected to return, the system
might select a faster access method.
If you use the grouping function, faster performance is achieved if you specify selection before grouping
(QRYSLT parameter) instead of selection after grouping (GRPSLT parameter). Only use the GRPSLT
parameter for comparisons involving aggregate functions.
For most uses of the OPNQRYF command, new or existing access paths are used to access the data and
present it to your program. In some cases of the OPNQRYF command, the system must create a
temporary file. The rules for when a temporary file is created are complex, but the following cases are
typical in which this occurs:
v When you specify a dynamic join, and the KEYFLD parameter describes key fields from different
physical files.
v When you specify a dynamic join and the GRPFLD parameter describes fields from different physical
files.
v When you specify both the GRPFLD and KEYFLD parameters but they are not the same.
v When the fields specified on the KEYFLD parameter total more than 2000 bytes in length.
v When you specify a dynamic join and *MINWAIT for the OPTIMIZE parameter.
158
v When you specify a dynamic join using a join logical file and the join type (JDFTVAL) of the join
logical file does not match the join type of the dynamic join.
v When you specify a logical file and the format for the logical file refers to more than one physical file.
v When you specify an SQL view, the system might require a temporary file to contain the results of the
view.
v When the ALWCPYDTA(*OPTIMIZE) parameter is specified and using a temporary result would
improve the performance of the query.
When a dynamic join occurs (JDFTVAL(*NO)), the OPNQRYF command attempts to improve
performance by reordering the files and joining the file with the smallest number of selected records to
the file with the largest number of selected records. To prevent the OPNQRYF command from reordering
the files, specify JORDER(*FILE). This forces the OPNQRYF command to join the files in the order
specified on the FILE parameter.
Related concepts
Database performance and query optimization
Open Query File (OPNQRYF) command: Performance considerations for sort sequence tables:
Here are the tips and techniques for optimizing the performance of sort sequence tables.
Grouping, joining, and selection: Open Query File (OPNQRYF) command performance:
When using an existing index, the optimizer ensures that the attributes of the selection, join, and
grouping fields match the attributes of the keys in the existing index.
Also, the sort sequence table associated with the query must match the sequence table (a sort sequence
table or an alternate collating sequence table) associated with the key field of the existing index. If the
sequence tables do not match, the existing index cannot be used.
However, if the sort sequence table associated with the query is a unique-weight sequence table
(including *HEX), some additional optimization is possible. The optimizer acts as though no sort
sequence table is specified for any grouping fields or any selection or join predicates that use the
following operators or functions:
v *EQ
v *NE
v *CT
v %WLDCRD
v %VALUES
The advantage is that the optimizer is free to use any existing access path where the keys match the field
and the access path either:
v Does not contain a sequence table.
v Contains a unique-weight sequence table (the table does not have to match the unique-weight sort
sequence table associated with the query).
Ordering: Open Query File (OPNQRYF) command performance:
For ordering fields, the optimizer is not free to use any existing access path. The sort sequence tables
associated with the index and the query must match unless the optimizer chooses to do a sort to satisfy
the ordering request.
When a sort is used, the translation is performed during the sort, leaving the optimizer free to use any
existing access path that meets the selection criteria.
Database programming
159
160
v
v
v
v
- The OVRDBF command, used with the TOFILE parameter, describes the first file on the FILE
parameter of the OPNQRYF command.
- The FORMAT parameter identifies the file that contains the format used to create the program.
The FORMAT parameter is used to process a format from a different file (for example, for group
processing), but SHARE(*YES) was not requested on the OVRDBF command.
The file to be processed is at end of file. The normal use of the OPNQRYF command is to process a file
sequentially where you can only process the file once. At that point, the position of the file is at the
end of the file and you will not receive any records if you attempt to process it again. To process the
file again from the start, you must either run the OPNQRYF command again or reposition the file
before processing. You can reposition the file by using the Position Database File (POSDBF) command,
or through a high-level language program statement.
No records exist. This can be caused when you use the FORMAT keyword, but do not specify the
OVRDBF command.
Syntax errors. The system found an error in the specification of the OPNQRYF command.
Operation not valid. The definition of the query does not include the KEYFLD parameter, but the
high-level language program attempts to read the query file using a key field.
Get option not valid. The high-level language program attempted to read a record or set a record
position before the current record position, and the query file used either the group by option, the
unique key option, or the distinct option on the SQL statement.
Digits
Dec
A
B
C
6
3
6
2
0
2
The %MAX function returns the maximum value of either B * B or a small value. The small value must
have enough leading zeros so that it is less than any value calculated by B * B unless B is zero. In this
example, B has zero decimal positions so .1 can be used. The number of leading zeros should be 2 times
the number of decimals in B. For example, if B had 2 decimal positions, then .00001 should be used.
Specify the following MAPFLD definition:
MAPFLD((C '(A * B) / %MAX((B * B) .1)'))
The intent of the first multiplication is to produce a zero dividend if B is zero. This ensures a zero result
when the division occurs. Dividing by zero does not occur if B is zero because the .1 value will be the
value used as the divisor.
Usage notes for the Open Query File (OPNQRYF) command:
Database programming
161
You need to be aware of these considerations when using the Open Query File (OPNQRYF) command.
Command elements:
Here are the rules for field names and expressions specified on the Open Query File (OPNQRYF)
command parameters, as well as a wide range of built-in functions that the OPNQRYF command
supports.
Field names:
Field names specified on the Open Query File (OPNQRYF) command parameters must follow these rules.
The field name used as the first part of an element in the list specified on the MAPFLD parameter must
be a simple name, and the field names in the record format identified on the FORMAT parameter are
always treated as simple names. Any other field name specified on an OPNQRYF command parameter
(QRYSLT, KEYFLD, JFLD, GRPFLD, GRPSLT, or the field-definition expression part of the MAPFLD
parameter) is a qualified field name, specified as follows:
field-name
Specify a simple field name that identifies a field that is defined on the MAPFLD parameter, or
with a field name that is unique among all field names from all record formats included in the
list specified on the FILE parameter. This form is not allowed if there is no MAPFLD parameter
definition for the specified field name and the FILE parameter includes more than one record
format that contains a field with the specified name, even if the same file and record format is
specified more than once in the list on the FILE parameter.
For example, AMOUNT is valid if the field named AMOUNT is defined on the MAPFLD
parameter. It is also valid if AMOUNT is not defined on the MAPFLD parameter, as long as there
is only one field named AMOUNT in any record format specified on the FILE parameter.
file-name/field-name
Specify a field name that is qualified with the simple name of the file specified on the FILE
parameter whose record format contains the field, but only if the simple file name is unique
among all file names specified on the FILE parameter. This form is not allowed if the same
simple file name is specified more than once in the list specified for the FILE parameter, even if
different library, member, or record format names are used.
For example, WHS01/PARTNBR is valid if there is a field named PARTNBR in the record format
for file WHS01, and file name WHS01 is only specified once on the FILE parameter.
file-nbr/field-name
Specify a simple field name that is qualified with the number of the element in the FILE
parameter list for the record format that contains the field. The file-nbr qualifier must be specified
without leading zeros. This form is only required if the same simple file name is specified more
than once in the list specified on the FILE parameter.
For example, 2/BALDUE is valid if the second file record format in the list specified on the FILE
parameter contains a field named BALDUE.
*MAPFLD/field-name
Specify a simple field name that is qualified with the special value *MAPFLD if the field is
defined on the MAPFLD parameter. When the field is defined, this form has the same meaning as
specifying the simple field name with no qualifier. If the field is not defined on the MAPFLD
parameter, *MAPFLD cannot be specified.
For example, *MAPFLD/AVGBAL is valid if the AVGBAL field is specified as the first part of one
of the mapped field list elements specified on the MAPFLD parameter.
Expressions:
162
The expressions specified on the Open Query File (OPNQRYF) command parameters must follow these
conventions.
Expressions specified on the QRYSLT, GRPSLT, and MAPFLD parameters are similar to expressions
specified on other control language (CL) command parameters. Logical, relational, numeric, and string
operations are performed by using combinations of field values and constants. Symbolic and named
operators are supported, as well as many built-in functions, and parentheses are used to control the order
of evaluation.
There are also differences in the expressions specified on OPNQRYF parameters and on other CL
command parameters. Listed here are the ways that expressions on the QRYSLT, GRPSLT, and MAPFLD
parameters differ from normal CL expressions:
v The expression string must be enclosed in apostrophes if it contains embedded blanks or special
characters.
v The following differences affect numeric and string literals:
Character string constants are quoted by using single quotation marks or quotation marks.
The leading and trailing zeros of a numeric constant are significant parts of its attributes.
Floating-point constants (including the special values *INF and *NEGINF) are used in expressions.
v The following differences contrast CL variables with database fields:
No prefixed ampersand (&) is used in database field names.
Qualified field names are supported.
No logical field type exists for database fields.
Many additional data types are supported for database fields.
v The following CL operators are not supported on the OPNQRYF command:
*BCAT or | >
*TCAT or | <
v The following additional operators are supported beyond CL support:
// for remainder
** for exponentiation
*CT for contains (character scan)
*XOR or && for logical exclusive or
Operators
**
Database programming
163
Priority
Operators
*CAT, | |
*GT, *LT, *EQ, *GE, *LE, *NE, *NG, *NL, *CT, >, <, =, >=, <=, =, >, <
*AND, &
Except for operators and *NOT, the operators for priorities 1 through 4 are numeric operators, which
require numeric operands. The operators for priority 5 are string operators, which require operands to be
either character or DBCS strings. Priority 6 operators are called relational operators, which require at least
one operand that is a field name or a numeric or string expression (not a constant). The operators for
priorities 7 and 8, plus the and *NOT operators (priority 1), are logical operators. The operands in a
logical expression are relations (constructed by using a relational operator with appropriate operands)
and other logical expressions.
The operands in a string expression, including string operands for a built-in function, are a combination
of character fields and DBCS fields and constants. If both operands of such an expression are DBCS-only
fields or constants, the final result from evaluation of the expression is a DBCS-only field value. If the
operands are a combination of DBCS or character fields or constants, the result is a DBCS-open field
value. When DBCS fields are concatenated, the extraneous shift-in and shift-out characters between the
fields are removed.
The result produced by a + or - sign prefixed operator has the same attributes as the operand, unless the
operand of a - sign prefixed operator is a *BIN2, in which case the result is a *BIN4. The result of an **
operator (exponentiation) is a double-precision binary floating-point number (*FLT8), or a decimal
floating-point number (34 digits) if either operand is a decimal floating-point number.
For other numeric operators that require two operands, if either operand is a binary floating-point
number, the result is a double-precision binary floating-point number (*FLT8); if either operand is a
decimal floating-point number, the result is a decimal floating-point number. See the following table for
rules that involve decimal floating-point operands.
One operand
Result
Decimal floating-point(n)
*BIN2
Decimal floating-point(n)1
Decimal floating-point(n)1
*BIN4
Decimal floating-point(n)1
Decimal floating-point(n)1
*BIN8
Decimal floating-point(34)
Decimal(d<=16, f)
Decimal floating-point(n)1
Decimal(d>16, f)2
Decimal floating-point(34)
*FLT4
Decimal floating-point(n)1
Decimal floating-point(n)1
*FLT8
Decimal floating-point(n)1
Decimal floating-point(n)1
Decimal floating-point(m)1
Decimal floating-point(n)
Decimal floating-point(n)1
Decimal floating-point(n)
d is the total number of digits and f is the number of fractional digits of the decimal operand.
If both operands are fixed-point numbers, the system uses the information in the following table to
determine the number of total and fractional digits required to produce a packed decimal (*DEC) result.
Operation
MAX(d1-f1, d2-f2)+MAX(f1,f2)+1
MAX(f1, f2)
164
Operation
MAX(f1, f2)
d1+d2
f1+f2
31
31-(d1-f1+f2)
//
MIN(d1-f1,d2-f2)+MAX(f1,f2)
MAX(f1,f2)
Legend:
d1
f1
d2
f2
If both operands are zero-precision binary fields and/or integer constants, the result is a *BIN4, unless
the operator is a /. In that case, the result is the same as for a fixed-point result. If the total number of
digits required exceeds 31, the number of fraction digits is reduced enough to enable calculation of the
result with a total of 31 digits. If some fraction digits are dropped and the attributes of the end result of
the computation (the attributes specified on the MAPFLD parameter for the field) require greater
precision than that of the intermediate result, a warning message is sent to indicate that some precision
was lost in evaluating the expression.
When a numeric or string expression is specified on the MAPFLD parameter, the attributes of the final
result are used in one of the two ways. They are either used directly for the field value (if field-type
*CALC is specified and the field is not contained in the prototype record format identified on the
FORMAT parameter), or the final result is changed to match the attributes specified on the MAPFLD
parameter or contained in the field definition in the record format identified by the FORMAT parameter.
Both operands of a relational operator can be constants. The fields, constants, or expressions specified as
operands on the left and right side of a relational operator must be of the same type, either numeric or
string. Any combination of character and DBCS field operands are allowed except that a character field
cannot be related to a DBCS-only field.
There are two types of DBCS constants: DBCS-only and DBCS-open. A DBCS-only constant has only
DBCS data between its single quotation marks. This data must be enclosed in SO/SI characters. A
DBCS-open constant has a mixture of DBCS and alphameric data. An SO character (HEX 0E) indicates the
start of a group of DBCS characters and an SI character (HEX 0F) follows the last double-byte character
of the group.
If a numeric or string expression appears as a complex selection operand on the QRYSLT or GRPSLT
parameter, the attributes of the final result of the expression used for the selection operand are changed
to match the other relational operand.
It is not necessary for operands of a relational operator to have identical attributes. If the operands do not
have identical attributes, the system changes them to identical attributes (except for the *CT operator,
where the character string operands might be of different lengths), before performing the operation. This
change uses packed decimal format if both operands are fixed-point numeric operands, or floating-point
format if either operand is a floating-point number. The changes for fixed-point numeric operands align
their decimal points and pad them with zeros. Numeric type changes might truncate fractional digits if
more than 31 total digits are required for fixed-point numbers, or might drop some of the least significant
digits if more than 15 total digits are required for binary floating-point numbers. Character operands are
changed by padding the shorter operand with blanks.
Database programming
165
The *CT operator performs a scan of the character field or string expression (except for expressions made
up of a single character string literal) that must be specified as the left side of the relation, in order to
determine if it contains the character string, field, or expression value specified as the right side of the
relation. The second operand (the search value) must be no longer than the first operand (the base
string).
If the string is found, the relation is satisfied and the result is a logical value of true; otherwise, the
result is a logical false value. The following example illustrates this process:
v Field BASEFLD contains the value THIS IS A TEST.
v Field TESTFLD contains the value TE.
Expression
Result
BASEFLD *CT IS A
True
True
BASEFLD *CT X
False
False
True
Zero-length literal support changes the results of a comparison when used as the compare argument of
the *CT operator. A zero-length literal is denoted as a quoted string with nothing, not even a blank,
between the quotation marks ().
Consider this statement:
QRYSLT('field *CT ""')
With zero-length literal support, the statement returns records that contain anything. It is, in essence, a
wildcard comparison for any number of characters followed by any number of characters. It is equivalent
to the following expression:
'field = %WLDCRD("**")'
Before zero-length literal support was introduced, the argument () was interpreted as a single-byte
blank. The statement returned records that contained a single blank somewhere in the field. It was, in
essence, a wildcard comparison for any number of characters, followed by a blank, followed by any
number of characters. It was equivalent to the following expression:
'field = %WLDCRD("* *")'
To get the same result with the *CT operator, you must code the QRYSLT parameter to explicitly look for
the blank:
QRYSLT('field *CT " "')
Built-in functions:
These built-in functions are supported for an expression that is used to define a derived field on the
MAPFLD parameter or for a complex selection operand specified on the QRYSLT or GRPSLT parameter.
A numeric argument is a numeric field, a numeric constant or a numeric expression. A string argument is
a character field, a character string literal, or a string expression. Unless otherwise noted, all built-in
functions allow expressions, including other built-in functions, to be used as arguments.
For a field that appears in the record format identified by the FORMAT parameter, and that is also
defined by an expression on the MAPFLD parameter, the expression result is calculated by using the
attributes described in the following paragraphs. Then the resultant value is mapped to match the
attributes of the field.
166
%ABSVAL (numeric-argument)
%ABSVAL accepts a numeric argument and returns the absolute value of the argument. The
returned value has the same attributes as the argument, unless the argument is a *BIN2, in which
case the returned value is a *BIN4.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a packed decimal number (*DEC) with 8 digits and 0 precision (date
duration), 6 digits and 0 precision (time duration), or 20 digits and 6 precision (timestamp
duration).
%ACOS (numeric-argument)
%ACOS accepts a numeric argument and returns the arc cosine of the argument, in radians.
%ACOS and %COS are inverse operations.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8). The numeric
argument must not be a decimal floating-point number.
%AND (string-argument ...)
%AND accepts two or more character or hexadecimal string arguments and returns a string that
is the bit-wise AND (logical and) of the arguments. This function takes the first argument string,
ANDs it with the next string, and continues to AND each successive argument with the previous
result. If an argument is encountered that is shorter than the previous result, it is padded on the
right with blanks. The returned value is a string of type *HEX with the same length as the
longest argument. If any of the arguments are variable-length, the maximum length is used as the
length of the argument.
%ANTILOG (numeric-argument)
%ANTILOG accepts a numeric argument and returns the antilogarithm (base 10) of the argument.
%ANTILOG and %LOG are inverse operations.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8), or a decimal
floating-point number (34 digits) if the argument is decimal floating-point.
%ASIN (numeric-argument)
%ASIN accepts a numeric argument and returns the arc sine of the argument, in radians. %ASIN
and %SIN are inverse operations.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8). The numeric
argument must not be a decimal floating-point number.
%ATAN (numeric-argument)
%ATAN accepts a numeric argument and returns the arc tangent of the argument, in radians.
%ATAN and %TAN are inverse operations.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8). The numeric
argument must not be a decimal floating-point number.
%ATANH (numeric-argument)
%ATANH accepts a numeric argument and returns the hyperbolic arc tangent of the argument, in
radians. %ATANH and %TANH are inverse operations.
Database programming
167
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8). The numeric
argument must not be a decimal floating-point number.
%AVG (numeric-argument)
%AVG accepts a numeric argument and returns the average value of its argument for the group
of records defined on the GRPFLD parameter. The argument must be a field name or an
expression (not a literal).
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. If no records are selected, the result is the null value. Otherwise,
v If the argument is fixed-point, the result is a packed decimal number (*DEC) with 31 total
digits and the same number of integer digits as the argument.
v If the argument is binary floating-point, the result is a double-precision binary floating-point
number (*FLT8).
v If the argument is decimal floating-point, the result is a decimal floating-point number (34
digits).
v If the argument is date duration, time duration, or timestamp duration, the returned value is a
packed decimal number (*DEC) with 31 digits and 0 precision (date duration), 31 digits and 0
precision (time duration), or 31 digits and 6 precision (timestamp duration).
%AVG is an aggregate function that is used for a nongrouping field in a query that uses the
grouping function.
%CHAR (date/time-argument date/time-format)
%CHAR accepts a date/time argument and date/time format and returns the character
representation of the argument using the specified format. The date/time argument can be a date,
time, or timestamp field. The returned value is of type *CHAR and is tagged with the CCSID of
the current job.
The date/time format is optional. If specified, it must be one of the following formats:
EUR
European format
ISO
JIS
USA
%COS (numeric-argument)
%COS accepts a numeric argument and returns the cosine of the argument. The argument must
be specified in radians. %COS and %ACOS are inverse operations.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8). The numeric
argument must not be a decimal floating-point number.
%COSH (numeric-argument)
%COSH accepts a numeric argument and returns the hyperbolic cosine of the argument. The
argument must be specified in radians.
168
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8). The numeric
argument must not be a decimal floating-point number.
%COT (numeric-argument)
%COT accepts a numeric argument and returns the cotangent of the argument. The argument
must be specified in radians.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8). The numeric
argument must not be a decimal floating-point number.
%COUNT
%COUNT does not support any arguments. It returns the count of the number of records
contained in the group of records defined on the GRPFLD parameter. The returned value is a
4-byte binary number (*BIN4) with 10 total decimal digits and no fraction digits. %COUNT is an
aggregate function that applies only to a query that uses the grouping function.
%CURDATE
%CURDATE does not support any arguments. It obtains the current date based on a reading of
the time-of-day clock. The returned value is of type *DATE. The format and separator are derived
from the job attributes.
%CURSERVER
%CURSERVER does not support any arguments. If only non-distributed files are specified then it
obtains the current server name (or RDB name) of the local system. If distributed files are
specified then it obtains the current server name (or RDB name) of the COORDINATOR node.
The returned value is of type variable-length character (*VCHAR) with a maximum length of 18.
%CURTIME
%CURTIME does not support any arguments. It obtains the current time based on a reading of
the time-of-day clock. The returned value is of type *TIME. The format and separator are derived
from the job attributes.
%CURTIMESTP
%CURTIMESTP does not support any arguments. It obtains the current timestamp based on a
reading of the time-of-day clock. The returned value is of type *TIMESTP. The format and
separator will be derived from the job attributes.
%CURTIMEZONE
%CURTIMEZONE does not support any arguments. It obtains the current time zone. The
returned value is a packed decimal number (*DEC) with 6 digits and 0 precision.
%DATE (date/time-argument)
%DATE accepts a date/time argument and returns a date. The date/time argument can be a date
or timestamp field, a character or hexadecimal field containing the external form of a date, a date
literal, or a numeric field or literal value in the range 1 - 3,652,059. The returned value is of type
*DATE.
Example:
OPNQRYF
FILE(library/file)
QRYSLT(('%DATE(tstampfld) =
"1989-10-23"'))
%DAY (date/time-argument)
%DAY accepts a date/time argument and returns the day part of the value. The date/time
Database programming
169
argument can be a date or timestamp field, a date duration or timestamp duration (field or
literal), or a numeric field or literal. The returned value is of type *BIN4.
A numeric field argument must be defined as packed decimal (*DEC) with 8 digits and 0
precision for date duration or packed decimal (*DEC) with 20 digits and 6 precision for
timestamp duration. A numeric constant argument must have 8 digits followed by a decimal
point, or 14 digits followed by a decimal point and 6 digits.
%DAYS (date/time-argument)
%DAYS accepts a date/time argument and returns an integer representation of the date. The
date/time argument can be a date or timestamp field, a character or hexadecimal field containing
the external form of a date, or a date literal. The returned value is of type *BIN4.
%DIGITS (numeric-argument)
%DIGITS accepts a numeric argument and returns a character representation of its numeric value,
not including the sign or a decimal point. The result is tagged with the CCSID of the current job.
For example, %DIGITS (-1.5) returns the character string 15. The numeric argument must not be a
floating point number.
%DURDAY (integer-argument)
%DURDAY accepts an integer argument and returns a labeled duration of days. The integer
argument for this function can be a numeric expression, a field, or a literal.
This built-in function is allowed to stand by itself in the mapped-field-definition of the MAPFLD
parameter, and is allowed as part of an arithmetic (addition or subtraction) expression with a
date or timestamp field on the QRYSLT, GRPSLT, or MAPFLD parameters.
%DURHOUR (integer-argument)
%DURHOUR accepts an integer argument and returns a labeled duration of hours. The integer
argument for this function can be a numeric expression, a field, or a literal.
This built-in function is allowed to stand by itself in the mapped-field-definition on the MAPFLD
parameter, and is allowed as part of an arithmetic (addition or subtraction) expression with a
time or timestamp field on the QRYSLT, GRPSLT, or MAPFLD parameters.
%DURMICSEC (integer-argument)
%DURMICSEC accepts an integer argument and returns a labeled duration of microseconds. The
integer argument for this function can be a numeric expression, a field, or a literal.
This built-in function is allowed to stand by itself in the mapped-field-definition on the MAPFLD
parameter, and is allowed as part of an arithmetic (addition or subtraction) expression with a
timestamp field on the QRYSLT, GRPSLT, or MAPFLD parameters.
%DURMINUTE (integer-argument)
%DURMINUTE accepts an integer argument and returns a labeled duration of minutes. The
integer argument for this function can be a numeric expression, a field, or a literal.
This built-in function is allowed to stand by itself in the mapped-field-definition on the MAPFLD
parameter, and is allowed as part of an arithmetic (addition or subtraction) expression with a
time or timestamp field on the QRYSLT, GRPSLT, or MAPFLD parameters.
%DURMONTH (integer-argument)
%DURMONTH accepts an integer argument and returns a labeled duration of months. The
integer argument for this function can be a numeric expression, a field, or a literal.
This built-in function is allowed to stand by itself in the mapped-field-definition on the MAPFLD
parameter, and is allowed as part of an arithmetic (addition or subtraction) expression with a
date or timestamp field on the QRYSLT, GRPSLT, or MAPFLD parameters.
%DURSEC (integer-argument)
%DURSEC accepts an integer argument and returns a labeled duration of seconds. The integer
argument for this function can be a numeric expression, a field, or a literal.
170
This built-in function is allowed to stand by itself in the mapped-field-definition on the MAPFLD
parameter, and is allowed as part of an arithmetic (addition or subtraction) expression with a
time or timestamp field on the QRYSLT, GRPSLT, or MAPFLD parameters.
%DURYEAR (integer-argument)
%DURYEAR accepts an integer argument and returns a labeled duration of years. The integer
argument for this function can be a numeric expression, a field, or a literal.
This built-in function is allowed to stand by itself in the mapped-field-definition value on the
MAPFLD parameter, and is allowed as part of an arithmetic (addition or subtraction) expression
with a date or timestamp field on the QRYSLT, GRPSLT, or MAPFLD parameters.
Example:
OPNQRYF
FILE((library/file))
QRYSLT('startfld > %CURDATE + oneyear *AND
endfld
< %CURDATE + %DURYEAR(2)')
MAPFLD((oneyear '%DURYEAR(1)'))
%EXP (numeric-argument)
%EXP accepts a numeric argument and returns a value that is the base of the natural logarithm
(e) raised to a power specified by the argument. %EXP and %LN are inverse operations.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8), or a decimal
floating-point number (34 digits) if the argument is decimal floating-point.
%HASH (expression-argument)
%HASH accepts a valid expression and returns a 4-byte binary number (*BIN4) with 10 total
decimal digits and no fraction digits. The returned value will be the partition number of the
record selected.
A valid expression cannot include aggregate functions such as %COUNT, %AVG, %MIN, %MAX,
%SUM, and %STDDEV as operands to %HASH.
Use the %HASH function to determine what the partitions are if the partitioning key is composed
of EMPNO and LASTNAME. The following example returns the partition number for every row
in EMPLOYEE.
Example:
OPNQRYF
FILE((CORPDATA/EMPLOYEE))
FORMAT(FNAME)
MAPFLD((HASH '%HASH((1/EMPNO) (1/LN))'))
%HEX (hexadecimal-argument)
%HEX accepts an argument and returns the hexadecimal equivalent of the arguments value. The
hexadecimal argument can be of any type. The returned value is of type *CHAR, and is tagged
with the CCSID of the current job.
%HOUR (date/time-argument)
%HOUR accepts a date/time argument and returns the hour part of the value. The date/time
argument can be a time or timestamp field, a time duration or timestamp duration (either field or
literal), or a numeric field or literal. The returned value is of type *BIN4.
A numeric field argument must be defined as packed decimal (*DEC) with 6 digits and 0
precision for time duration or packed decimal (*DEC) with 20 digits and 6 precision for
timestamp duration. A numeric constant argument must have 6 digits followed by a decimal
point, or 14 digits followed by a decimal point and 6 digits.
Example:
Database programming
171
Example:
OPNQRYF
FILE(library/file)
QRYSLT(('%HOUR(timefld2) = 12'))
%LEN (length-argument)
%LEN accepts one argument and returns the number of bytes used to represent the value unless
the value is a graphic field type. If the value is a graphic field type, the number of graphic
characters is returned. The length argument can be of any type. The returned value is of type
*BIN4.
Example:
OPNQRYF
FILE(library/file)
QRYSLT('%LEN(varlenfld) <= 30')
Argument Type
Result Length in Bytes
----------------------------------------Character
1-32766
Hex
1-32766
DBCS-only
4-32766
DBCS-either
4-32766
DBCS-open
4-32766
DBCS-graphic
1-16383
Variable Character
0-32740
Variable Hex
0-32740
Variable DBCS-only
0-32740
Variable DBCS-either
0-32740
Variable DBCS-open
0-32740
Variable DBCS-graphic
0-16370
Date
4
Time
3
Timestamp
10
Binary *BIN4
2
Binary *BIN8
4
Binary floating point *FLT4
4
Binary floating point *FLT8
8
Decimal floating point (16 digits)
8
Decimal floating point (34 digits)
16
Packed decimal (p,s)
INTEGER(p/2)+1, (1-16)
Zoned decimal (p,s)
p (1-31)
-------------------------------------------p=precision, s=scale
String notes: The %LEN function returns the length of the value as it is stored in the data space.
v For fixed-length fields, the length is always the same as the declared size of the field, not the
length of the actual data in the field.
v For variable-length fields, the length is the length of the actual data in the field, including
trailing blanks.
For example, assume FIXED10 is a *CHAR(10) field, and VAR10 is a *VCHAR(10) field. The
following example shows results of the %LEN function:
%LEN Statement
-------------%LEN(fixed10)
%LEN(fixed10)
%LEN(var10)
%LEN(var10)
%LEN(var10)
%LEN(var10)
Field Data
Result
------------ -----'1234567890' 10
'12345'
10
'1234567890' 10
'12345'
5
'12345 '
7
''
0
%LN (numeric-argument)
%LN accepts a numeric argument and returns the natural logarithm of the argument. %LN and
%EXP are inverse operations.
172
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8), or a decimal
floating-point number (34 digits) if the argument is decimal floating-point.
%LOG (numeric-argument)
%LOG accepts a numeric argument and returns the common logarithm (base 10) of the argument.
%LOG and %ANTILOG are inverse operations.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8), or a decimal
floating-point number (34 digits) if the argument is decimal floating-point.
%MAX (numeric-or-string-or-date/time-argument ...)
%MAX accepts one or more character-string, DBCS-string, numeric, or date/time arguments, and
returns the largest value from the list. Date/time arguments are arguments of type *DATE,
*TIME, or *TIMESTP, or arguments that are date, time, or timestamp durations. String arguments
must be no longer than 256 bytes.
If only one argument is specified, this function returns the maximum value of its argument for
the group of records defined on the GRPFLD parameter, and the returned value has the same
attributes as the argument. If no records are selected, the result is the null value. If the single
argument is a date duration, time duration, or timestamp duration, then the returned value is a
packed decimal number (*DEC) with 8 digits and 0 precision (date duration), 6 digits and 0
precision (time duration), or 20 digits and 6 precision (timestamp duration). When a single
argument is used, it must be a field name or an expression (not a literal). %MAX with only one
argument is an aggregate function that is used for a nongrouping field in a query that uses the
grouping function.
If multiple arguments are specified, %MAX returns the maximum value of all the arguments. All
arguments must be either character-string, DBCS-string, numeric, or date/time values. This
function calculates the maximum value of the first two arguments, and then continues to
determine the maximum value of the previous result and the next successive argument. The final
result is determined according to the following value conversion rules.
If an argument has different attributes than the previous result, the two values are converted to
identical attributes and the operation continues. This conversion uses packed decimal if both
values are fixed-point numeric values, uses decimal floating point if either value is decimal
floating-point, or uses binary floating point if either value is binary floating-point. The conversion
for fixed-point numeric values aligns the decimal points and pads the values with zeros. Numeric
type changes might truncate fractional digits if more than 31 total digits are required for
fixed-point numbers, or drop some of the least significant digits if more than 15 total digits are
required for binary floating-point numbers. Character values are changed by padding the shorter
field with blanks.
%MICSEC (date/time-argument)
%MICSEC accepts a date/time argument and returns the microsecond part of the value. The
date/time argument can be a timestamp (field or literal), a timestamp duration (field or literal), a
character field that contains the external form of a timestamp, or a numeric field or literal. The
returned value is of type *BIN4. A numeric field argument must be defined as packed decimal
(*DEC) with 20 digits and 6 precision for timestamp duration. A numeric constant argument must
be 14 digits followed by a decimal point and 6 digits.
%MIN (numeric-or-string-or-date/time-argument ...)
%MIN accepts one or more character-string, DBCS-string, numeric, or date/time arguments, and
returns the smallest value from the list. Date/time arguments are arguments of type *DATE,
*TIME, or *TIMESTP, or arguments that are date, time, or timestamp durations. String arguments
must be no longer than 256 bytes.
Database programming
173
If only one argument is specified, this function returns the minimum value of its argument for
the group of records defined on the GRPFLD parameter, and the returned value has the same
attributes as the argument. If no records are selected, the result is the null value. If the single
argument is a date duration, time duration, or timestamp duration, then the returned value is a
packed decimal number (*DEC) with 8 digits and 0 precision (date duration), 6 digits and 0
precision (time duration), or 20 digits and 6 precision (timestamp duration). When a single
argument is used, it must be a field name or an expression (not a literal). %MIN with only one
argument is an aggregate function that is used for a nongrouping field in a query that uses the
grouping function.
If multiple arguments are specified, %MIN returns the minimum value of all the arguments. All
arguments must be either character-string, DBCS-string, numeric, or date/time values. This
function calculates the minimum value of the first two arguments, and then continues to
determine the minimum value of the previous result and the next successive argument. The final
result is determined by the value change rules described below.
If an argument has different attributes than the previous one, the two values are changed to
identical attributes and the operation continues. This change uses packed decimal numbers if
both values are fixed-point numeric values, uses decimal floating-point numbers if either value is
a decimal floating-point number, or uses binary floating-point numbers if either value is a binary
floating-point number. The change for fixed-point numeric values aligns the decimal points and
pads with zeros. Numeric type change might truncate fractional digits if more than 31 total digits
are required for fixed-point numbers, or might drop some of the least significant digits if more
than 15 total digits are required for binary floating-point numbers. Character values are changed
by padding the shorter field with blanks.
%MINUTE (date/time-argument)
%MINUTE accepts a date/time argument and returns the minute part of the value. The
date/time argument can be a time or timestamp field, a time duration or timestamp duration
(either field or literal), or a numeric field or literal. The returned value is of type *BIN4.
A numeric field argument must be defined as packed decimal (*DEC) with 6 digits and 0
precision for time duration or packed decimal (*DEC) with 20 digits and 6 precision for
timestamp duration. A numeric constant argument must have 6 digits followed by a decimal
point, or 14 digits followed by a decimal point and 6 digits.
%MONTH (date/time-argument)
%MONTH accepts a date/time argument and returns the month part of the value. The date/time
argument can be a date or timestamp field, a date duration or timestamp duration (field or
literal), or a numeric field or literal. The returned value is of type *BIN4.
A numeric field argument must be defined as packed decimal (*DEC) with 8 digits and 0
precision for date duration or packed decimal (*DEC) with 20 digits and 6 precision for
timestamp duration. A numeric constant argument must have 8 digits followed by a decimal
point, or 14 digits followed by a decimal point and 6 digits.
%NODENAME (integer-argument)
%NODENAME accepts an integer-argument which is used to identify a file that has been
specified on the FILE parameter. The argument must be greater than 0 and less than or equal to
the number of files specified on the file parameter. The %NODENAME function returns the RDB
name for the record retrieved. The returned value is of type *VCHAR of length 18.
Find the node name for every record of the EMPLOYEE table.
Example:
OPNQRYF
FILE((CORPDATA/EMPLOYEE))
FORMAT(FNAME)
MAPFLD((NODENAME '%NODENAME(1)'))
174
Join the EMPLOYEE and DEPARTMENT tables, select the employee number (EMPNO) and
determine the node from which each record involved in the join originated.
Example:
OPNQRYF
FILE((CORPDATA/EMPLOYEE) (CORPDATA/DEPARTMENT))
FORMAT(FNAME)
JFLD((EMPLOYEE/DEPTNO DEPARTMENT/DEPTNO *EQ))
MAPFLD((EMPNO 'EMPLOYEE/EMPNO')
(NODENAME1 '%NODENAME(1)')
(NODENAME1 '%NODENAME(2)'))
Join the EMPLOYEE and DEPARTMENT tables, select all records of the result where the records
of the two tables are on the same node.
Example:
OPNQRYF
FILE((CORPDATA/EMPLOYEE) (CORPDATA/DEPARTMENT))
FORMAT(FNAME)
JFLD((1/NODENAME1 2/NODENAME2 *EQ))
MAPFLD((NODENAME1 '%NODENAME(1)')
(NODENAME2 '%NODENAME(2)'))
%NODENUMBER (integer-argument)
%NODENUMBER accepts an integer-argument which is used to identify a file that has been
specified on the FILE parameter. The argument must be greater than zero and less than or equal
to the number of files specified on the file parameter. The %NODENUMBER function returns a
4-byte binary number (*BIN4) with 10 total decimal digits and no fraction digits. The returned
value will be the node number of the record selected.
If the argument identifies a non-distributed file, the value zero is returned.
For OPNQRYF the node number from the secondary file where the outer or exception join is
performed will be returned.
If CORPDATA.EMPLOYEE is a distributed file, then the node number for each record and the
employee name will returned.
Example:
OPNQRYF
FILE((CORPDATA/EMPLOYEE))
FORMAT(FNAME)
MAPFLD((NODENAME '%NODENUMBER(1)')
(LNAME '1/LASTNAME'))
The above example selects records from the file where either field FLD1 or field FLD2 contains a
non-null value that is greater than zero. If both FLD1 and FLD2 were null, the %NONNULL
function specified in this example would return 0 because of the constant 0 passed as the third
argument. If any field is DBCS-graphic, all fields must be DBCS-graphic.
%NOT (string-argument)
%NOT accepts a character or hexadecimal string argument and returns a string that is the
bit-wise NOT (logical not) of the argument. The returned value is a string of type *HEX with the
same length as the argument.
Database programming
175
Select the employee number (EMPNO) from the EMPLOYEE table for all records where the
partition number is equal to 100.
Example:
OPNQRYF
FILE((EMPLOYEE))
QRYSLT('%PARTITION(1) *EQ 100')
Join the EMPLOYEE and DEPARTMENT tables, select all records of the result where the records
of the two tables have the same partition number
Example:
OPNQRYF
FILE((CORPDATA/EMPLOYEE) (CORPDATA/DEPARTMENT))
FORMAT(FNAME)
JFLD((1/PART1 2/PART2 *EQ))
MAPFLD((PART1 '%PARTITION(1)')
(PART2 '%PARTITION(2)'))
%SECOND (date/time-argument)
%SECOND accepts a date/time argument and returns the seconds part of the value. The
date/time argument can be a time or timestamp field, a time duration or timestamp duration
(either field or literal), or a numeric field or literal. The returned value is of type *BIN4.
A numeric field argument must be defined as packed decimal (*DEC) with 6 digits and 0
precision for time duration or packed decimal (*DEC) with 20 digits and 6 precision for
timestamp duration. A numeric constant argument must have 6 digits followed by a decimal
point, or 14 digits followed by a decimal point and 6 digits.
%SIN (numeric-argument)
%SIN accepts a numeric argument and returns the sine of the argument. The argument must be
specified in radians. %SIN and %ASIN are inverse operations.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8). The numeric
argument must not be a decimal floating-point number.
176
%SINH (numeric-argument)
%SINH accepts a numeric argument and returns the hyperbolic sine of the argument. The
argument must be specified in radians.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8). The numeric
argument must not be a decimal floating-point number.
%SQRT (numeric-argument)
%SQRT accepts a numeric argument and returns the square root of the argument.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8), or a decimal
floating-point number with the same number of digits as the argument if the argument is decimal
floating-point.
%SST (string-argument start-position-expression <length-expression>)
%SST and %SUBSTRING accept a character, hexadecimal, DBCS, or graphic string, a starting
position expression, and an optional length expression as arguments. They return a substring of
the string argument that is of the same type and CCSID as the string argument and has length
equal to the value specified by the length-expression.
Single-byte substringing is done when these functions (%SST and %SUBSTRING) are used for
DBCS data. The shift-out and shift-in characters might be lost, which produces unusual results.
The result of the DBCS substring operation is the DBCS-open type.
The string argument can be a fixed- or variable-length character, hexadecimal, DBCS, or graphic
field or an expression which evaluates to a fixed- or variable-length character, hexadecimal,
DBCS, or graphic string.
The values derived from expressions for the second and third arguments must be valid integers.
The second argument must have a value between 1 and the length attribute (or maximum length
of a variable-length field) of the first argument, and the third argument must have a value
between 1 and the length attribute (or maximum length of a variable-length field) of the first
argument.
If an argument is DBCS-graphic, the second and third arguments must also be specified as
DBCS-graphic characters, not bytes.
If an expression is given for the second or third arguments, the expression must be enclosed in
parentheses.
If the expressions evaluate to variable-length results, no validation of the range of these
expressions is guaranteed and errors might occur during input/output processing.
The maximum value allowed for the third argument (length) is 32766 except for DBCS-graphic,
which is 16383. However, if the third operand is represented by an expression, this causes the
result to be variable-length. Thus, the value of the expression cannot exceed 32740 except for
DBCS-graphic, which cannot exceed 16370.
The user can omit the third argument. If the third argument is not specified and the first
argument is:
v fixed-length, the default value for the third argument is LENGTH(argument_1) value_for_argument_2 + 1
v variable-length, the default value for the third argument is the maximum of 0 and
LENGTH(argument_1) - value_for_argument_2 + 1
v variable-length with a length less than the value for argument_2, the default value for the third
argument is zero and the result is the empty string.
Example:
Database programming
177
OPNQRYF
FILE(library/file)
QRYSLT('field1 =
%SST(field2 (numfld1+3)
(numfld1+numfld2))')
%STDDEV (numeric-argument)
%STDDEV accepts a numeric argument and returns the standard deviation of its argument for
the group of records defined by the GRPFLD parameter. The argument must be a field name or
an expression (not a literal). If no records are selected, the result is the null value. Otherwise, the
returned value is a double-precision binary floating-point number (*FLT8), or a decimal
floating-point number (34 digits) if the argument is decimal floating-point. %STDDEV is an
aggregate function that is used for a nongrouping field in a query that uses the grouping
function.
%STRIP (string-argument <strip-character><strip-function>)
%STRIP accepts a character-, DBCS-, or graphic-string argument, an optional strip character, and
an optional strip function as arguments. It returns a result string with the strip character removed
from the string argument as specified by the strip function.
The string argument can be a literal, a fixed or variable-length character, hexadecimal, DBCS, or
graphic field, or an expression which evaluates to a fixed- or variable-length character,
hexadecimal, DBCS, or graphic string.
The strip character must be a single character, enclosed in apostrophes, with a data type
compatible to the source string. The default is a single SBCS space for character data, DBCS-open,
and DBCS-either, a single DBCS space for DBCS-only data, and a single graphic space for graphic
data.
The strip function can be one of three functions:
*LEAD
Remove leading strip character(s)
*TRAIL
Remove trailing strip character(s)
*BOTH
Remove both leading and trailing strip character(s)
The default strip function is *BOTH.
Example:
OPNQRYF
FILE(library/file)
QRYSLT('%STRIP(fld '.' *TRAIL) = 'Mr')
178
v If the argument is a binary number with zero-precision, the returned value is *BIN4.
v If the argument is a binary number with nonzero precision or a fixed-point number, the
returned value is a packed decimal number (*DEC) with 31 total digits and as many fractional
digits as the argument.
v If the argument is of type date duration, time duration, or timestamp duration, the returned
value is a double-precision binary floating-point number (*FLT8).
%SUM is an aggregate function that is used for a nongrouping field in a query that uses the
grouping function.
%TAN (numeric-argument)
%TAN accepts a numeric argument and returns the tangent of the argument. The argument must
be specified in radians. %TAN and %ATAN are inverse operations.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The return value is a double-precision binary floating-point number (*FLT8). The numeric
argument must not be a decimal floating-point number.
%TANH (numeric-argument)
%TAN accepts a numeric argument and returns the hyperbolic tangent of the argument. The
argument must be specified in radians. %TANH and %ATANH are inverse operations.
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. Arguments of these types can be specified either as fields or literal values.
The returned value is a double-precision binary floating-point number (*FLT8). The numeric
argument must not be a decimal floating-point number.
%TIME (date/time-argument)
%TIME accepts a date/time argument and returns a time. The date/time argument can be a time
or timestamp field, a character or hexadecimal field containing the external form of a time, or a
time literal. The returned value is of type *TIME.
%TIMESTP (date/time-argument date/time-argument)
%TIMESTP accepts one or two date/time arguments and returns a timestamp.
v If only one date/time argument is specified, it must be a timestamp (field or literal), or a
character or hexadecimal field containing the external form of a timestamp.
v If both arguments are specified,
1. The first date/time argument must be a date (field or literal), or a character or hexadecimal
field containing the external form of a date.
2. The second date/time argument must be a time (field or literal), or a character or
hexadecimal field containing the external form of a time.
The returned value is of type *TIMESTP.
%USER
%USER does not support any arguments. It returns the user profile name of the job in which the
query is running. The returned value is of type variable-length character (*VCHAR) with a
maximum length of 18.
Example:
OPNQRYF
FILE(library/file)
QRYSLT('field = %USER')
%VAR (numeric-argument)
%VAR accepts a numeric argument and returns the variance of its argument for the group of
records defined by the GRPFLD parameter. The argument must be a field name or an expression
(not a literal).
Database programming
179
The following argument types are treated as numeric values: date duration, time duration, and
timestamp duration. If no records are selected, the result is the null value. Otherwise, the
returned value is a double-precision binary floating-point number (*FLT8), or a decimal
floating-point number (34 digits) if the argument is decimal floating-point. %VAR is an aggregate
function that is used for a nongrouping field in a query that uses the grouping function.
%XLATE (string-argument qualified-table)
%XLATE accepts a character-string argument and the name of a table object (*TBL), and returns a
string that is the value of the first argument translated by using the contents of the table. The
returned value is a string with the same length and CCSID as the first argument.
The second argument must be a simple or qualified table object name. If no library name is
specified, *LIBL is used to find the table.
%XOR (string-argument...)
%XOR accepts two or more character-string arguments and returns a string that is the bit-wise
XOR (logical exclusive or) of the arguments. This function takes the first argument string, XORs
it with the next string, and then continues to XOR each successive argument with the previous
result. If an argument is encountered that is longer than the previous result, the previous result is
padded with blanks before the XOR operation. If any of the arguments is variable-length, the
maximum length is used as the length of the argument. The final result is a string of type *HEX
with the same length as the longest argument.
%YEAR
%YEAR accepts a date/time argument and returns the year part of the value. The date/time
argument can be a date or timestamp field, a date duration or timestamp duration (field or
literal), or a numeric field or literal. The returned value is of type *BIN4.
A numeric field argument must be defined as packed decimal (*DEC) with 8 digits and 0
precision for date duration or packed decimal (*DEC) with 20 digits and 6 precision for
timestamp duration. A numeric constant argument must have 8 digits followed by a decimal
point, or 14 digits followed by a decimal point and 6 digits.
Restricted built-in functions:
Some built-in functions are restricted in the way certain relational operators are specified on the QRYSLT
and GRPSLT parameters.
The following built-in function is supported only as the second operand of the equal or not-equal
relational operators specified on the QRYSLT and GRPSLT parameters:
%NULL
%NULL accepts no arguments. It is used to select or omit records based on whether a field in the
record contains a null value.
Example:
OPNQRYF
FILE(library/file)
QRYSLT('charfld = %NULL')
This query would select all the records where charfld contains the null value.
The following built-in functions are supported only as the second operand of the equal relational
operator specified on the QRYSLT and GRPSLT parameters:
%RANGE (low-value high-value)
%RANGE is used to identify the lower and upper boundaries for the value of a field or
expression. %RANGE must be specified as the right side of a relation whose operator is equal.
The low-value and high-value argument must be field names, character strings, or numeric
180
literals, to match the type of field or expression specified as left side of the relation. For example,
to select only records where the numeric field NBRFLD has a value ranging from 10 through 20,
specify as follows:
'nbrfld = %RANGE(10 20)'
If the low-value argument is greater than the high-value argument, the relation produces a logical
value of false.
%VALUES (allowed-value...)
%VALUES is used to identify a list of allowed values for a field or expression. %VALUES must
be specified as the right side of a relation whose operator is equal. The allowed-value arguments
must be character string or numeric literals, to match the type of the field or expression specified
as the left side of the relation. For example, to select only records where the second character of
field CHARFLD has a value that is one of the values A, E, I, O, or U, specify as follows:
'%SST(charfld 2 1) =
181
To select only records where the character field CHARFLD starts with the string ABC, followed
by one or more other characters and then followed by the string XYZ (but not necessarily at the
end of the field), specify the following.
'charfld = %WLDCRD(''ABC_*XYZ*'')'
To select only records where the second character of field CHARFLD is an asterisk (*), the last
character is an underline (_), and the letter M appears somewhere in between, specify as
follows:
'charfld = %WLDCRD(''#*.M._'' ''#.'')'
Data type considerations:
Here are the rules that govern the comparison and arithmetic of date, time, and timestamp values and
the use of large object and DATALINK data types on the Open Query File (OPNQRYF) command.
Comparing date, time, and timestamp using the Open Query File (OPNQRYF) command:
A date, time, or timestamp value can be compared either with another value of the same data type or
with a string representation of that data type.
All comparisons are chronological, which means the farther a time is from January 1, 0001, the greater the
value of that time.
Comparisons involving time values and string representations of time values always include seconds. If
the string representation omits seconds, zero seconds are implied.
Comparisons involving timestamp values are chronological without regard to representations that might
be considered equivalent. Thus, the following predicate is true:
TIMESTAMP (1990-02-23-00.00.00) > 1990-02-22-24.00.00
When a character, DBCS-open, or DBCS-either field or constant is represented as a date, time, or
timestamp, the following rules apply:
Date: The length of the field or literal must be at least 8 if the date format is *ISO, *USA, *EUR, *JIS,
*YMD, *MDY, or *DMY. If the date format is *JUL (yyddd), the length of the variable must be at least 6
(includes the separator between yy and ddd). The field or literal can be padded with blanks.
Time: For all of the time formats (*USA, *ISO, *EUR, *JIS, *HMS), the length of the field or literal must be
at least 4. The field or literal can be padded with blanks.
Timestamp: For the timestamp format (yyyy-mm-dd-hh.mm.ss.uuuuuu), the length of the field or literal
must be at least 16. The field or literal can be padded with blanks.
Performing date, time, and timestamp arithmetic using the Open Query File (OPNQRYF) command:
Date, time, and timestamp values can be incremented, decremented, and subtracted. These operations
might involve decimal numbers called durations.
Durations:
A duration is a number that represents an interval of time.
182
Date duration
A date duration represents a number of years, months, and days, expressed as a DECIMAL(8,0) number.
To be properly interpreted, the number must have the format yyyymmdd, where yyyy represents the
number of years, mm the number of months, and dd the number of days. The result of subtracting one
date value from another, as in the expression HIREDATE - BRTHDATE, is a date duration.
Labeled duration
A labeled duration represents a specific unit of time as expressed by a number (which can be the result of
an expression) used as an operand for one of the seven duration built-in functions: %DURYEAR,
%DURMONTH, %DURDAY, %DURHOUR, %DURMINUTE, %DURSEC, or %DURMICSEC. The
functions are for the duration of year, month, day, hour, minute, second, and microsecond, respectively.
The number specified is converted as if it were assigned to a DECIMAL(15,0) number. A labeled duration
can only be used as an operand of an arithmetic operator when the other operand is a value of data type
*DATE, *TIME, or *TIMESTP. Thus, the expression HIREDATE + %DURMONTH(2) + %DURDAY(14) is
valid, whereas the expression HIREDATE + (%DURMONTH(2) + %DURDAY(14)) is not. In both of these
expressions, the labeled durations are %DURMONTH(2) and %DURDAY(14).
Time duration
A time duration represents a number of hours, minutes, and seconds, expressed as a DECIMAL(6,0)
number. To be properly interpreted, the number must have the format hhmmss, where hh represents the
number of hours, mm the number of minutes, and ss the number of seconds. The result of subtracting one
time value from another is a time duration.
Timestamp duration
A timestamp duration represents a number of years, months, days, hours, minutes, seconds, and
microseconds, expressed as a DECIMAL(20,6) number. To be properly interpreted, the number must have
the format yyyymmddhhmmsszzzzzz, where yyyy, mm, dd, hh, mm, ss, and zzzzzz represent, respectively, the
number of years, months, days, hours, minutes, seconds, and microseconds. The result of subtracting one
timestamp value from another is a timestamp duration.
Rules for date, time, and timestamp arithmetic:
The only arithmetic operations that can be performed on date and time values are addition and
subtraction. If a date or time value is the operand of addition, the other operand must be a duration.
The specific rules governing the use of the addition operator with date and time values follow:
v If one operand is a date, the other operand must be a date duration or a labeled duration of years,
months, or days.
v If one operand is a time, the other operand must be a time duration or a labeled duration of hours,
minutes, or seconds.
v If one operand is a timestamp, the other operand must be a duration. Any type of duration is valid.
The rules for the use of the subtraction operator on date and time values are not the same as those for
addition because a date or time value cannot be subtracted from a duration, and because the operation of
subtracting two date and time values is not the same as the operation of subtracting a duration from a
date or time value. The specific rules governing the use of the subtraction operator with date and time
values follow:
v If the first operand is a date, the second operand must be a date, a date duration, a string
representation of a date, or a labeled duration of years, months, or days.
v If the second operand is a date, the first operand must be a date or a string representation of a date.
Database programming
183
v If the first operand is a time, the second operand must be a time, a time duration, a string
representation of a time, or a labeled duration of hours, minutes, or seconds.
v If the second operand is a time, the first operand must be a time or string representation of a time.
v If the first operand is a timestamp, the second operand must be a timestamp, a string representation of
a timestamp, or a duration.
v If the second operand is a timestamp, the first operand must be a timestamp or a string representation
of a timestamp.
Subtracting dates:
The result of subtracting one date (DATE2) from another (DATE1) is a date duration that specifies the
number of years, months, and days between the two dates.
The data type of the result is DECIMAL(8,0). If DATE1 is greater than or equal to DATE2, DATE2 is
subtracted from DATE1. If DATE1 is less than DATE2, however, DATE1 is subtracted from DATE2, and
the sign of the result is made negative. The following procedural description clarifies the steps involved
in the operation RESULT = DATE1 - DATE2.
If %DAY(DATE2) <= %DAY(DATE1) ;
then %DAY(RESULT) = %DAY(DATE1) - %DAY(DATE2).
If %DAY(DATE2) > %DAY(DATE1) ;
then %DAY(RESULT) = N + %DAY(DATE1) - %DAY(DATE2) ;
where N = the last day of %MONTH(DATE2). ;
%MONTH(DATE2) is then incremented by 1.
If %MONTH(DATE2) <= %MONTH(DATE1) ;
then %MONTH(RESULT) = %MONTH(DATE1) - %MONTH(DATE2).
If %MONTH(DATE2) > %MONTH(DATE1) ;
then %MONTH(RESULT) = 12 + %MONTH(DATE1) - %MONTH(DATE2). ;
%YEAR(DATE2) is then incremented by 1.
%YEAR(RESULT) = %YEAR(DATE1) - %YEAR(DATE2).
For example, the result of %DATE(3/15/2000) - 12/31/1999 is 215 (or, a duration of 0 years, 2 months,
and 15 days).
Incrementing and decrementing dates:
The result of adding a duration to a date or subtracting a duration from a date is itself a date.
(For the purposes of this operation, a month denotes the equivalent of a calendar page. Adding months
to a date, then, is like turning the pages of a calendar, starting with the page on which the date appears.)
The result must fall between the dates January 1, 0001, and December 31, 9999, inclusive. If a duration of
years is added or subtracted, only the year portion of the date is affected. The month is unchanged, as is
the day unless the result would be February 29 of a year that is not a leap year. In this case, the day is
changed to 28.
Similarly, if a duration of months is added or subtracted, only months and, if necessary, years are
affected. The day portion of the date is unchanged unless the result would not be valid (September 31,
for example). In this case, the day is set to the last day of the month.
Adding or subtracting a duration of days, of course, affects the day portion of the date, and potentially
the month and year.
184
Date durations, whether positive or negative, can also be added to and subtracted from dates. As with
labeled durations, the result is a valid date.
When a positive date duration is added to a date, or a negative date duration is subtracted from a date,
the date is incremented by the specified number of years, months, and days, in that order. Thus, DATE1
+ X, where X is a positive DECIMAL(8,0) number, is equivalent to the expression: DATE1 +
%DURYEAR(%YEAR(X)) + %DURMONTH(%MONTH(X)) + %DURDAY(%DAY(X))
When a positive date duration is subtracted from a date, or a negative date duration is added to a date,
the date is decremented by the specified number of days, months, and years, in that order. Thus, DATE1
- X, where X is a positive DECIMAL(8,0) number, is equivalent to the expression: DATE1 %DURDAY(%DAY(X)) - %DURMONTH(%MONTH(X)) - %DURYEAR(%YEAR(X))
When adding durations to dates, adding one month to a given date gives the same date one month later
unless that date does not exist in the later month. In that case, the date is set to that of the last day of the
later month. For example, January 28 plus one month gives February 28; and one month added to
January 29, 30, or 31 results in either February 28 or, for a leap year, February 29.
Note: If one or more months are added to a given date and then the same number of months is
subtracted from the result, the final date is not necessarily the same as the original date.
Subtracting times:
The result of subtracting one time (TIME2) from another (TIME1) is a time duration that specifies the
number of hours, minutes, and seconds between the two times.
The data type of the result is DECIMAL(6,0). If TIME1 is greater than or equal to TIME2, TIME2 is
subtracted from TIME1. If TIME1 is less than TIME2, however, TIME1 is subtracted from TIME2, and the
sign of the result is made negative. The following procedural description clarifies the steps involved in
the operation RESULT = TIME1 - TIME2.
If %SECOND(TIME2) <= %SECOND(TIME1) ;
then %SECOND(RESULT) = %SECOND(TIME1) - %SECOND(TIME2).
If %SECOND(TIME2) > %SECOND(TIME1) ;
then %SECOND(RESULT) = 60 + %SECOND(TIME1) - %SECOND(TIME2). ;
%MINUTE(TIME2) is then incremented by 1.
If %MINUTE(TIME2) <= %MINUTE(TIME1) ;
then %MINUTE(RESULT) = %MINUTE(TIME1) - %MINUTE(TIME2).
If %MINUTE(TIME2) > %MINUTE(TIME1) ;
then %MINUTE(RESULT) = 60 + %MINUTE(TIME1) - %MINUTE(TIME2). ;
%HOUR(TIME2) is then incremented by 1.
%HOUR(RESULT) = %HOUR(TIME1) - %HOUR(TIME2).
For example, the result of %TIME(11:02:26) - 00:32:56 is 102930 (a duration of 10 hours, 29 minutes, and
30 seconds).
Incrementing and decrementing times:
The result of adding a duration to a time or subtracting a duration from a time is itself a time. Any
overflow or underflow of hours is discarded, thereby ensuring that the result is always a time.
If a duration of hours is added or subtracted, only the hours portion of the time is affected. The minutes
and seconds are unchanged.
Database programming
185
Similarly, if a duration of minutes is added or subtracted, only minutes and, if necessary, hours are
affected. The seconds portion of the time is unchanged.
Adding or subtracting a duration of seconds, of course, affects the seconds portion of the time, and
potentially the minutes and hours.
Time durations, whether positive or negative, also can be added to and subtracted from times. The result
is a time that has been incremented or decremented by the specified number of hours, minutes, and
seconds, in that order.TIME1 + X, where X is a DECIMAL(6,0) number, is equivalent to the expression:
TIME1 + %DURHOUR(%HOUR(X)) + %DURMINUTE(%MINUTE(X)) + %DURSEC(%SECOND(X))
Subtracting timestamps:
The result of subtracting one timestamp (TS2) from another (TS1) is a timestamp duration that specifies
the number of years, months, days, hours, minutes, seconds, and microseconds between the two
timestamps.
The data type of the result is DECIMAL(20,6). If TS1 is greater than or equal to TS2, TS2 is subtracted
from TS1. If TS1 is less than TS2, however, TS1 is subtracted from TS2 and the sign of the result is made
negative. The following procedural description clarifies the steps involved in the operation RESULT = TS1
- TS2:
If %MICSEC(TS2) <= %MICSEC(TS1) ;
then %MICSEC(RESULT) = %MICSEC(TS1) - ;
%MICSEC(TS2).
If %MICSEC(TS2) > %MICSEC(TS1) ;
then %MICSEC(RESULT) = 1000000 + ;
%MICSEC(TS1) - %MICSEC(TS2) ;
and %SECOND(TS2) is incremented by 1.
The seconds and minutes part of the timestamps are subtracted as specified in the rules for subtracting
times:
If %HOUR(TS2) <= %HOUR(TS1) ;
then %HOUR(RESULT) = %HOUR(TS1) - %HOUR(TS2).
If %HOUR(TS2) > %HOUR(TS1) ;
then %HOUR(RESULT) = 24 + %HOUR(TS1) - %HOUR(TS2) ;
and %DAY(TS2) is incremented by 1.
The date part of the timestamp is subtracted as specified in the rules for subtracting dates.
Incrementing and decrementing timestamps:
The result of adding a duration to a timestamp or subtracting a duration from a timestamp is itself a
timestamp.
Date and time arithmetic is performed as previously defined, except that an overflow or underflow of
hours is carried into the date part of the result, which must be within the range of valid dates.
Microseconds overflow into seconds.
BLOB, CLOB, DBCLOB, and XML considerations:
186
|
|
|
Fields of large object data types (BLOB, CLOB, or DBCLOB), or fields of the XML data type cannot be
directly accessed from an open query file. Also, they are not allowed on some parameters of the Open
Query File (OPNQRYF) command.
|
|
|
|
|
Fields that contain any of the large object data types (BLOB, CLOB, or DBCLOB) or the XML data type
can only be read by using the Copy From Query File (CPYFRMQRYF) command or SQL. The
CPYFRMQRYF command must be used to access large object fields from an open query file. A field of
data type BLOB, CLOB, DBCLOB, or XML cannot be specified on these OPNQRYF parameters: KEYFLD,
UNIQUEKEY, JFLD, and GRPFLD. An XML field cannot be specified on the MAPFLD parameter.
DATALINK considerations:
|
|
|
Fields of type DATALINK or XML cannot be directly referenced in selection, grouping, ordering, or join
operations. If a DATALINK field appears in that format, it is returned in it the unprocessed form as it
exists in the data space.
DDM file considerations:
The Open Query File (OPNQRYF) command can process distributed data management (DDM) files.
However, there are some restrictions.
All DDM files identified on the FILE parameter must exist on the same IBM System i or System/38 target
system. The Open Query File (OPNQRYF) command that specifies group processing and uses a DDM file
requires that both the source and target system be the same type (either both System/38 or both System i
platforms).
Input and output considerations:
Here are the input and output considerations for using the OPTION parameter of the Open Query File
(OPNQRYF) command and for field usage in an open query file.
Using the Open Query File (OPNQRYF) command for more than just input:
You can use the OPTION parameter of the Open Query File (OPNQRYF) command to specify the type of
processing for your query file.
The default is OPTION(*INP); that is, the file is opened for input only. You can also use other OPTION
values of the OPNQRYF command and a high-level language program to add, update, or delete records
through the open query file.
However, if you specify the UNIQUEKEY, GRPFLD, or GRPSLT parameter, use one of the aggregate
functions, or specify multiple files on the FILE parameter, your use of the file is restricted to input only.
A join logical file is limited to input-only processing. A view is limited to input-only processing, if group,
join, union, distinct processing, or a user-defined table function is specified in the definition of the view.
If the query optimizer needs to create a temporary file to implement the query, then the use of the file is
restricted to input only.
If you want to change a field value from the current value to a different value in some of the records in a
file, you can use a combination of the OPNQRYF command and a specific high-level language program.
For example, assume that you want to change all the records where the Flda field is equal to ABC so that
the Flda field is equal to XYZ. You can specify:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) OPTION(*ALL) QRYSLT('FLDA *EQ "ABC" ')
PGM(PGMA)
OPNID(FILEA)
FILE(FILEA)
Database programming
187
Program PGMA processes all records it can read, but the query selection restricts these to records where
the Flda field is equal to ABC. The program changes the field value in each record to XYZ and updates
the record.
You can also delete records in a database file using the OPNQRYF command. For example, assume that
you have a field in your record that, if equal to X, means the record should be deleted. Your program can
be written to delete any records it reads and use the OPNQRYF command to select those to be deleted
such as:
OVRDBF
OPNQRYF
CALL
CLOF
DLTOVR
FILE(FILEA) SHARE(*YES)
FILE(FILEA) OPTION(*ALL) QRYSLT('DLTCOD *EQ "X" ')
PGM(PGMB)
OPNID(FILEA)
FILE(FILEA)
You can also add records by using the OPNQRYF command. However, if the query specifications include
selection values, your program can be prevented from reading the added records because of the selection
values.
Field usage attribute:
Here are the rules that govern the field usage attribute (input-only or both input and output) in an open
query file.
Fields contained in a record format, identified on the FILE parameter, and defined (in the DDS used to
create the file) with a usage value of N (neither input nor output) cannot be specified on any parameter
of the Open Query File (OPNQRYF) command. Only fields defined as either I (input-only) or B (both
input and output) usage can be specified. Any fields with usage defined as N in the record format
identified on the FORMAT parameter are ignored by the OPNQRYF command.
Fields in the open query file records normally have the same usage attribute (input-only or both input
and output) as the fields in the record format identified on the FORMAT parameter, with the exceptions
noted later in this topic. If the file is opened for any option (OPTION parameter) that includes output or
update and any usage, and if any B (both input and output) field in the record format identified on the
FORMAT parameter is changed to I (input only) in the open query file record format, then an
information message is sent by the OPNQRYF command.
If you request join processing or group processing, or if you specify UNIQUEKEY processing, all fields in
the query records are given input-only use. Any mapping from an input-only field from the file being
processed (identified on the FILE parameter) is given input-only use in the open query file record format.
Fields defined using the MAPFLD parameter are normally given input-only use in the open query file. A
field defined on the MAPFLD parameter is given a value that matches the use of its constituent field if
all of the following conditions are true:
v Input-only is not required because of any of the conditions previously described in this topic.
v The field-definition expression specified on the MAPFLD parameter is a field name (no operators or
built-in functions).
v The field used in the field-definition expression exists in one of the files, members, or record formats
specified on the FILE parameter (not in another field defined using the MAPFLD parameter).
v The base field and the mapped field are compatible field types (the mapping does not mix numeric
and character field types, unless the mapping is between zoned and character fields of the same
length).
v If the base field is binary with nonzero decimal precision, the mapped field must also be binary and
have the same precision.
Open data path considerations:
188
An open data path (ODP) is a control block created when a file is opened. An ODP contains information
about the merged file attributes and information returned by input or output operations.
The file, library, and file member names used by ODP are the same as the first file and file member
names specified on the FILE parameter, unless an override forces the use of a different file or file member
name. The record format name of the open query file is the same as that specified on the FORMAT
parameter.
The Open Query File (OPNQRYF) command always opens a file with an ODP that is shared, as if
SHARE(*YES) were specified for the file. If the file, library, or file member name specified in the
high-level language (HLL) program differs from the name of the open query file, an override command
must be used to specify the correct file, library, and member names to allow the HLL program to share
the open query file ODP. If the first, or the only, member queried has an attribute of SHARE(*NO),
SHARE(*YES) must be specified in an override to enable an HLL program to share the query file ODP.
If the OPNQRYF command is scoped to the job, any subsequent open, other than a query open, of the
same file can share the ODP whether scoped to an activation group or the job. If the OPNQRYF
command is scoped to an activation group, any subsequent open, other than a query open, of the same
file can share the ODP if it is also scoped to the same activation group.
Files shared in a job:
To use the open data path that is built by the Open Query File (OPNQRYF) command, your program
must share the query file.
If your program does not open the query file as shared, it does a full open of the file that it was
originally compiled to use (not the query open data path built by the OPNQRYF command).
Your program will share the query open data path, depending on the following conditions:
v Your application program must open the file as shared. Your program meets this condition when the
first or only member queried (as specified on the FILE parameter) has an attribute of SHARE(*YES). If
the first or only member has an attribute of SHARE(*NO), you must specify SHARE(*YES) in an
Override with Database File (OVRDBF) command before calling your program.
v The file opened by your application program must have the same name as the file opened by the
OPNQRYF command. Your program meets this condition when the file specified in your program has
the same file and member name as the first or only member queried (as specified on the FILE
parameter). If the first or only member has a different name, then you must specify an Override with
Database File (OVRDBF) command of the name of the file your program was compiled against to the
name of the first or only member queried.
v Your program must be running in the same activation group to which the query open data path (ODP)
is scoped. If the query ODP is scoped to the job, your program can run in any activation group within
the job.
The OPNQRYF command never shares an existing open data path in the job or activation group. A
request to open a query file fails with an error message if the open data path has the same library, file,
and member name that is in the open request, and if either of the following is true:
v OPNSCOPE(*ACTGRPDFN) or OPNSCOPE(*ACTGRP) is specified for the OPNQRYF command, and
the open data path is scoped to the same activation group or job from which the OPNQRYF command
is run.
v OPNSCOPE(*JOB) is specified for the OPNQRYF command, and the open data path is scoped to the
same job from which the OPNQRYF command is run.
Subsequent shared opens adhere to the same open options (such as SEQONLY) that were in effect when
the OPNQRYF command was run.
Database programming
189
Related concepts
Sharing database files in the same job or activation group on page 109
By default, the database management system allows one file to be read and changed by many users at
the same time. You can also share a file in the same job or activation group by specifying the SHARE
parameter.
Checking if the record format description changed:
If record format level checking is indicated, the format level number of the open query file record format
(identified on the FORMAT parameter) is checked against the record format your program was compiled
against. This occurs when your program shares the previously opened query file.
Your programs shared open is checked for record-format level if the following conditions are met:
v The first or only file queried (as specified on the FILE parameter) must have the LVLCHK(*YES)
attribute.
v There must not be an override of the first or only file queried to LVLCHK(*NO).
Copying from an open query file:
You can use the Copy from Query File (CPYFRMQRYF) command to copy from an open query file to
another file or to print a formatted listing of the records.
Any open query file, except those using distributed data management (DDM) files, specified with the
input, update, or all operation value on the FILE parameter of the Open Query File (OPNQRYF)
command can be copied using the CPYFRMQRYF command. The CPYFRMQRYF command cannot be
used to copy to logical files.
Although the CPYFRMQRYF command uses the open data path of the open query file, it does not open
the file. Consequently, you do not have to specify SHARE(*YES) for the database file you are copying.
Related concepts
Database file management
Example 1: Copying from an open query file:
This example shows how to build a file with a subset of records using the Open Query File (OPNQRYF)
and Copy from Query File (CPYFRMQRYF) commands.
Assume that you want to create a file from the CUSTOMER/ADDRESS file that contains only records
where the value of the STATE field is Texas. You can specify as follows:
OPNQRYF FILE(CUSTOMER/ADDRESS) QRYSLT('STATE *EQ "TEXAS"')
CPYFRMQRYF FROMOPNID(ADDRESS) TOFILE(TEXAS/ADDRESS) CRTFILE(*YES)
190
This example shows how to copy a subset of records to a diskette using the Open Query File (OPNQRYF)
and Copy from Query File (CPYFRMQRYF) commands.
Assume that you want to copy all records from FILEB where the value of FIELDB is 10 to a diskette. You
can specify:
OPNQRYF FILE(FILEB) QRYSLT('FIELDB *EQ "10"') OPNID(MYID)
CPYFRMQRYF FROMOPNID(MYID) TOFILE(DISK1)
FILEB
Cust
Amt
JOINAB
Cust
Name
Amt
The join field is Cust, which exists in both files. To join the files and save a copy of the results in a new
physical file MYLIB/FILEC, you can specify:
OPNQRYF FILE(FILEA FILEB) FORMAT(JOINAB) +
JFLD((FILEA/CUST FILEB/CUST)) +
MAPFLD((CUST 'FILEA/CUST')) OPNID(QRYFILE)
CPYFRMQRYF FROMOPNID(QRYFILE) TOFILE(MYLIB/FILEC) CRTFILE(*YES)
The file MYLIB/FILEC will be created by the CPYFRMQRYF command. The file will have file attributes
like those of FILEA although some file attributes might be changed. The format of the file will be like
JOINAB. The file will contain the data from the join of FILEA and FILEB using the Cust field. File FILEC
in library MYLIB can be processed like any other physical file with control language (CL) commands,
such as the Display Physical File Member (DSPPFM) command and utilities, such as Query.
Related concepts
Database file management
Override considerations:
Overrides can change the name of a file, library, and member that should be processed by an open query
file. However, any parameters other than TOFILE, MBR, LVLCHK, INHWRT, or SEQONLY that are
specified on an Override with Database File (OVRDBF) command are ignored by the Open Query File
(OPNQRYF) command.
If a name change override applies to the first or only member queried, any additional overrides must be
against the new name, not the name specified for the FILE parameter on the OPNQRYF command.
Program considerations:
You need to consider these rules and techniques when running the Open Query File (OPNQRYF)
command from a command line or when writing CL or other high-level language programs that use the
OPNQRYF command.
v If you run the OPNQRYF command from a command entry line with the OPNSCOPE(*ACTGRPDFN)
or TYPE(*NORMAL) parameter option, error messages that occur after the OPNQRYF command
successfully runs will not close the file. Such messages would have closed the file prior to Version 2
Release 3 when TYPE(*NORMAL) was used. The system automatically runs the Reclaim Resources
(RCLRSC) command if an error message occurs, except for message CPF0001, which is sent when the
Database programming
191
system detects an error in the command. However, the RCLRSC command only closes files opened
from the default activation group at a higher level in the call stack than the level at which the RCLRSC
command was run.
v After running a program that uses the OPNQRYF command for sequential processing, the file position
is normally at the end of the file. If you want to run the same program or a different program with the
same files, you must position the file or close the file and open it with the same OPNQRYF command.
You can position the file with the Position Database File (POSDBF) command. In some cases, a
high-level language program statement can be used.
Considerations for writing a high-level language program:
Here are the considerations for writing a high-level language program that processes a database file using
the Open Query File (OPNQRYF) command.
If you omit the FORMAT parameter, your high-level language program is coded as if you were directly
accessing the database file. Selection or sequencing occurs external to your program, and the program
receives the selected records in the order you specified. The program does not receive records that are
omitted by your selection values. This same function occurs if you process through a logical file with
select/omit values.
If you use the FORMAT parameter, your program specifies the same file name used on the FORMAT
parameter. The program is written as if this file contained actual data.
If you read the file sequentially, your high-level language can automatically specify that the key fields are
ignored. Normally you write the program as if it were reading records in arrival sequence. If the
KEYFLD parameter is used on the Open Query File (OPNQRYF) command, you receive a diagnostic
message, which can be ignored.
If you process the file randomly by keys, your high-level language probably requires a key specification.
If you have selection values, it can prevent your program from accessing a record that exists in the
database. A Record not found condition can occur on a random read whether the OPNQRYF command
was used or whether a logical file created using DDS select/omit logic was used.
In some cases, you can monitor exceptions caused by mapping errors such as arithmetic overflow, but it
is better to define the attributes of all fields to correctly handle the results.
Related tasks
Creating an open query file using an existing record format on page 124
The Open Query File (OPNQRYF) command does the record selection, and your program processes only
the records that meet the selection values. You can use this approach to select a set of records, return
records in a different sequence than they are stored, or both.
CL program coding with the Open Query File (OPNQRYF) command:
When you use the Open Query File (OPNQRYF) command, follow these rules to prevent coding errors.
v Specify selection fields from a database file without an ampersand (&). Fields declared in the control
language (CL) program with DCL or DCLF require the ampersand.
v Enclose fields defined in the CL program with DCL or DCLF within single quotation marks (&testfld,
for example).
v Enclose all parameter comparisons within quotation marks when compared to character fields, single
quotation marks when compared to numeric fields.
In the following example, the fields INVCUS and INVPRD are defined as character data:
QRYSLT('INVCUS *EQ "' *CAT &K1CUST *CAT '" *AND +
INVPRD *GE "' *CAT &LPRD *CAT '" *AND +
INVPRD *LE "' *CAT &HPRD *CAT '"')
192
If the fields are defined numeric data, the QRYSLT parameter can look like this:
QRYSLT('INVCUS *EQ ' *CAT &K1CUST *CAT ' *AND +
INVPRD *GE ' *CAT &LPRD *CAT ' *AND +
INVPRD *LE ' *CAT &HPRD *CAT ' ')
Only a read operation, force-end-of-data operation, high-level language positioning operation, or specific
CL command to change the file position can change the file position. Add, update, and delete operations
do not change the file position. After a read operation, the file is positioned to the new record. This
record is then returned to your program. After the read operation is completed, the file is positioned at
the record just returned to your program. If the member is open for input, a force-end-of-data operation
positions the file after the last record in the file (*END) and sends the end-of-file message to your
program.
Database programming
193
For sequential read operations, the current file position is used to locate the next or previous record on
the access path. For read-by-key or read-by-relative-record-number operations, the file position is not
used. If POSITION(*NONE) is specified at open time, no starting file position is set. In this case, you
must establish a file position in your program, if you are going to read sequentially.
If end-of-file delay was specified for the file on an OVRDBF command, the file is not positioned to
*START or *END when the program reads the last record. The file remains positioned at the last record
read. A file with end-of-file delay processing specified is positioned to *START or *END only when a
force-end-of-data (FEOD) occurs or a controlled job end occurs.
You can also use the POSDBF command to set or change the current position in your file for files opened
using either the Open Database File (OPNDBF) command or the Open Query File (OPNQRYF) command.
Related concepts
Control language
Waiting for more records when end of file is reached on page 197
End-of-file delay is a method of continuing to read sequentially from a database file (logical or physical)
after an end-of-file condition occurs.
Related reference
Override with Database File (OVRDBF) command
194
Deleted records between the current file position and the previous active record are skipped. (The
READP statement in the RPG language and the READ PRIOR statement in the COBOL language are
examples of this operation.)
Reading first operation:
This operation positions the file to the first active record in the arrival sequence access path and gets that
record.
Reading last operation:
This operation positions the file to the last active record in the arrival sequence access path and gets that
record.
Reading same operation:
This operation gets the record that is identified by the current position in the file. The file position is not
changed.
Reading by relative record number operation:
This operation positions the file to the record that is identified by the relative record number in the
arrival sequence access path and gets that record.
The relative record number must identify an active record and must be less than or equal to the largest
active relative record number in the member. This operation also reads the record in the arrival sequence
access path identified by the current file position plus or minus a specified number of records. (The
CHAIN statement in the RPG language and the READ statement in the COBOL language are examples of
this operation.) Special consideration should be given to creating or changing a file to reuse deleted
records if the file is processed by relative record processing.
Related concepts
Reusing deleted records on page 101
Sometimes you might want to reuse deleted records for your database files. In this case, you can use the
REUSEDLT parameter.
Reading database records using a keyed sequence access path:
These read operations can be used with a keyed sequence access path to get database records.
When a keyed sequence access path is used, a read operation cannot position to the storage occupied by
a deleted record.
Note: The system performs the read operations based on the statements that you specify using your
high-level language. Your high-level language might not allow all of the following operations. See
your high-level language topic collection to determine which operations are allowed by the
language.
Reading next operation:
This operation gets the next record on the keyed sequence access path.
If a record format name is specified, this operation gets the next record in the keyed sequence access path
that matches the record format. The current position in the file is used to locate the next record. (The
READ statement in the RPG language and the READ NEXT statement in the COBOL language are
examples of this operation.)
Database programming
195
196
the keyed sequence access path that is contained in the physical record, which was identified by the
relative record number. This operation also gets the record in the keyed sequence access path identified
by the current file position plus or minus some number of records. (The CHAIN statement in the RPG
language and the READ statement in the COBOL language are examples of this operation.)
Reading when logical file shares an access path with more keys operation:
When the First-In First-Out (FIFO), Last-In First-Out (LIFO), or First-Changed First-Out (FCFO) keyword
is not specified in the data description specifications (DDS) for a logical file, the logical file can implicitly
share an access path that has more keys than the logical file being created.
This sharing of a partial set of keys from an existing access path can lead to perceived problems for
database read operations that use these partially shared keyed sequence access paths. The problems
might appear to be:
v Records that should be read, are never returned to your program
v Records are returned to your program multiple times
What is actually happening is that your program or another currently active program is updating the
physical file fields that are keys within the partially shared keyed sequence access path, but that are not
actual keys for the logical file that is being used by your program (the fields being updated are beyond
the number of keys known to the logical file being used by your program). The updating of the actual
key fields for a logical file by your program or another program has always yielded the above results.
The difference with partially shared keyed sequence access paths is that the updating of the physical file
fields that are keys beyond the number of keys known to the logical file can cause the same
consequences.
If these consequences caused by partially shared keyed sequence access paths are not acceptable, the
FIFO, LIFO, or FCFO keyword can be added to the DDS for the logical file, and the logical file created
again.
Waiting for more records when end of file is reached:
End-of-file delay is a method of continuing to read sequentially from a database file (logical or physical)
after an end-of-file condition occurs.
When an end-of-file condition occurs on a file being read sequentially (for example, next/previous
record) and you have specified an end-of-file delay time (EOFDLY parameter on the Override with
Database File (OVRDBF) command), the system waits for the time you specified.
At the end of the delay time, another read is done to determine if any new records were added to the
file. If records were added, normal record processing is done until an end-of-file condition occurs again.
If records were not added to the file, the system waits again for the time specified. Special consideration
should be taken when using end-of-file delay on a logical file with select/omit specifications, opened so
that the keyed sequence access path is not used. In this case, after end-of-file is reached, the system
retrieves only those records added to a based-on physical file that meet the select/omit specifications of
the logical file.
Also, special consideration should be taken when using end-of-file delay on a file with a keyed sequence
access path, opened so that the keyed sequence access path is used. In this case, after end-of-file is
reached, the system retrieves only those records added to the file or those records updated in the file that
meet the specification of the read operation using the keyed sequence access path.
For example, end-of-file delay is used on a keyed file that has a numeric key field in ascending order. An
application program reads the records in the file using the keyed sequence access path. The application
program performs a read next operation and gets a record that has a key value of 99. The application
program performs another read next and no more records are found in the file, so the system attempts to
Database programming
197
read the file again after the specified end-of-file delay time. If a record is added to the file or a record is
updated, and the record has a key value less than 99, the system does not retrieve the record. If a record
is added to the file or a record is updated and the record has a key value greater than or equal to 99, the
system retrieves the record.
For end-of-file delay times equal to or greater than 10 seconds, the job is eligible to be removed from
main storage during the wait time. If you do not want the job eligible to be moved from main storage,
specify PURGE(*NO) on the Create Class (CRTCLS) command for the CLASS the job is using.
To indicate which jobs have an end-of-file delay in progress, the status field of the Work with Active Jobs
(WRKACTJOB) display shows an end-of-file wait or end-of-file activity level for jobs that are waiting for
a record.
If a job uses end-of-file-delay and commitment control, it can hold its record locks for a longer period of
time. This increases the chances that some other job can try to access those same records and be locked
out. For that reason, be careful when using end-of-file-delay and commitment control in the same job.
If a file is shared, the OVRDBF command specifying an end-of-file delay must be requested before the
first open of the file because overrides are ignored that are specified after the shared file is opened.
There are several ways to end a job that is waiting for more records because of an end-of-file-delay
specified on the OVRDBF command:
v Write a record to the file with the end-of-file-delay that will be recognized by the application program
as a last record. The application program can then specify a force-end-of-data (FEOD) operation. An
FEOD operation allows the program to complete normal end-of-file processing.
v Do a controlled end of a job by specifying OPTION(*CNTRLD) on the End Job (ENDJOB) command,
with a DELAY parameter value time greater than the EOFDLY time. The DELAY parameter time
specified must allow time for the EOFDLY time to run out, time to process any new records that have
been put in the file, and any end-of-file processing required in your application. After new records are
processed, the system signals end of file, and a normal end-of-file condition occurs.
v Specify OPTION(*IMMED) on the ENDJOB command. No end-of-file processing is done.
v If the job is interactive, press the System Request key to end the last request.
The following example shows an end-of-file delay operation:
198
The actual processing of the EOFDLY parameter is more complex than shown because it is possible to
force a true end-of-file if OPTION(*CNTRLD) on the ENDJOB command is used with a long delay time.
The job does not become active whenever a new record is added to the file. The job becomes active after
the specified end-of-file delay time ends. When the job becomes active, the system checks for any new
records. If new records were added, the application program gets control and processes all new records,
then waits again. Because of this, the job takes on the characteristic of a batch job when it is processing.
For example, it normally processes a batch of requests. When the batch is completed, the job becomes
inactive. If the delay is small, you can cause excessive system overhead because of the internal processing
required to start the job and check for new records. Normally, only a small amount of overhead is used
for a job waiting during end-of-file delay.
Note: When the job is inactive (waiting) it is in a long-wait status, which means it was released from an
activity level. After the long-wait status is satisfied, the system reschedules the job in an activity
level.
Related concepts
Work management
Releasing locked records:
Database programming
199
The system automatically releases a locked record when the record is updated or deleted, or when you
read another record in the file. However, you might want to release a locked record without performing
these operations.
Some high-level languages support an operation to release a locked record. See your high-level language
topic collection for more information about releasing record locks.
Note: The rules for locking are different if your job is running under commitment control.
Related concepts
Commitment control
200
Related concepts
Commitment control
Triggering automatic events in your database on page 270
A trigger is a set of actions that run automatically when a specified change or read operation is performed
on a specified database file. You can define a set of trigger actions in any high-level language that is
supported on the i5/OS operating system.
Ensuring data integrity with referential constraints on page 258
You use referential constraints to enforce the referential integrity of your database. Referential integrity
encompasses all of the mechanisms and techniques that you can use to ensure that your database
contains only valid data.
Database programming
201
Related concepts
Reusing deleted records on page 101
Sometimes you might want to reuse deleted records for your database files. In this case, you can use the
REUSEDLT parameter.
Triggering automatic events in your database on page 270
A trigger is a set of actions that run automatically when a specified change or read operation is performed
on a specified database file. You can define a set of trigger actions in any high-level language that is
supported on the i5/OS operating system.
Ensuring data integrity with referential constraints on page 258
You use referential constraints to enforce the referential integrity of your database. Referential integrity
encompasses all of the mechanisms and techniques that you can use to ensure that your database
contains only valid data.
Identifying which record format to add in a file with multiple formats:
If your application uses a file name instead of a record format name for records to be added to the
database, and if the file used is a logical file with more than one record format, you need to write a
format selector program to determine where a record should be placed in the database.
A format selector can be a control language (CL) program or a high-level language program. It must be
used if all of the following conditions are true:
v The logical file is not a join and not a view logical file.
v The logical file is based on multiple physical files.
v The program uses a file name instead of a record format name on the add operation.
If you do not write a format selector program for this situation, your program ends with an error when it
tries to add a record to the database.
Note: A format selector program cannot be used to select a member if a file has multiple members; it can
only select a record format.
When an application program wants to add a record to the database file, the system calls the format
selector program. The format selector program examines the record and specifies the record format to be
used. The system then adds the record to the database file using the specified record format name.
The following example shows the programming statements for a format selector program written in the
RPG/400 language:
CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments+++...
+++*
C
*ENTRY
PLIST
202
C
PARM
RECORD 80
C* The length of field RECORD must equal the length of
C* the longest record expected.
C
PARM
FORMAT 10
C
MOVELRECORD
BYTE
1
C
BYTE
IFEQ 'A'
C
MOVEL'HDR'
FORMAT
C
ELSE
C
MOVEL'DTL'
FORMAT
C
END
The format selector receives the record in the first parameter; therefore, this field must be declared to be
the length of the longest record expected by the format selector. The format selector can access any
portion of the record to determine the record format name. In this example, the format selector checks the
first character in the record for the character A. If the first character is A, the format selector moves the
record format name HDR into the second parameter (FORMAT). If the character is not A, the format
selector moves the record format name DTL into the second parameter.
The format selector uses the second parameter, which is a 10-character field, to pass the record format
name to the system. When the system knows the name of the record format, it adds the record to the
database.
You do not need a format selector if:
v You are doing update operations only. For update operations, your program already retrieved the
record, and the system knows which physical file the record came from.
v Your application program specifies the record format name instead of a file name for an add or delete
operation.
v All the records used by your application program are contained in one physical file.
To create the format selector, you use the create program command for the language in which you wrote
the program. You cannot specify USRPRF(*OWNER) on the create command. The format selector must
run under the users user profile not the owners user profile.
In addition, for security and integrity and because performance would be severely affected, you must not
have any calls or input/output operations within the format selector.
The name of the format selector is specified on the FMTSLR parameter of the Create Logical File
(CRTLF), Change Logical File (CHGLF), or Override with Database File (OVRDBF) command. The format
selector program does not have to exist when the file is created, but it must exist when the application
program is run.
Related concepts
Controlling how records are added to a logical file with multiple formats on page 43
To add a record to a multiple-format logical file, you need to identify the member of the based-on
physical file to which you want the record to be written.
Related tasks
Creating a logical file on page 39
You can create a logical file using data description specifications (DDS).
Using the force-end-of-data operation:
The force-end-of-data (FEOD) operation allows you to force all changes that were made to a file by your
program to auxiliary storage. It also allows you to position the read operation to either the beginning or
the end of a file if the file is open for input operations.
Normally, the system determines when to force changes to auxiliary storage. However, you can use the
FEOD operation to ensure that all changes are forced to auxiliary storage.
Database programming
203
*START sets the beginning or starting position in the database file member currently open to just before
the first record in the member (the first sequential read operation reads the first record in the current
member). If MBR(*ALL) processing is in effect for the Override with Database File (OVRDBF) command,
a read previous operation gets the last record in the previous member. If a read previous operation is
done and the previous member does not exist, the end of file message (CPF5001) is sent. *END sets the
position in the database file member currently open to just after the last record in the member (a read
previous operation reads the last record in the current member). If MBR(*ALL) processing is in effect for
the OVRDBF command, a read next operation gets the first record in the next member. If a read next
operation is done and the next member does not exist, the end of file message (CPF5001) occurs.
If the file has a delete trigger, the force-end-of-data operation is not allowed. If the file is part of a
referential parent relationship, the FEOD operation is not allowed.
See your high-level language topic collection for more information about the FEOD operation (some
high-level languages do not support the FEOD operation).
Related concepts
Triggering automatic events in your database on page 270
A trigger is a set of actions that run automatically when a specified change or read operation is performed
on a specified database file. You can define a set of trigger actions in any high-level language that is
supported on the i5/OS operating system.
Ensuring data integrity with referential constraints on page 258
You use referential constraints to enforce the referential integrity of your database. Referential integrity
encompasses all of the mechanisms and techniques that you can use to ensure that your database
contains only valid data.
204
The system does not allow you to retrieve the data for a deleted record. You can, however, write a new
record to the position (relative record number) associated with a deleted record. The write operation
replaces the deleted record with a new record. See your high-level language topic collection for more
details about how to write a record to a specific position (relative record number) in the file.
To write a record to the relative record number of a deleted record, that relative record number must exist
in the physical file member. You can delete a record in the file using the delete operation in your
high-level language. You can also delete records in your file using the Initialize Physical File Member
(INZPFM) command. The INZPFM command can initialize the entire physical file member to deleted
records.
If the file from which you are deleting has a delete trigger associated with it, the trigger program is
called before or after deleting the record.
If the file is part of a referential constraint relationship, record deletion might be affected.
Related concepts
Reorganizing a physical file member on page 212
You can reorganize a physical file member to change the manner in which records are stored on the
i5/OS operating system.
Reusing deleted records on page 101
Sometimes you might want to reuse deleted records for your database files. In this case, you can use the
REUSEDLT parameter.
Initializing data in a physical file member on page 211
To use relative record processing in a program, a database file must contain a number of record positions
equal to the highest relative record number used in the program. Programs using relative-record-number
processing sometimes require that you initialize these records.
Triggering automatic events in your database on page 270
A trigger is a set of actions that run automatically when a specified change or read operation is performed
on a specified database file. You can define a set of trigger actions in any high-level language that is
supported on the i5/OS operating system.
Ensuring data integrity with referential constraints on page 258
You use referential constraints to enforce the referential integrity of your database. Referential integrity
encompasses all of the mechanisms and techniques that you can use to ensure that your database
contains only valid data.
205
The RCLRSC command releases all locks (except, under commitment control, locks on records that
were changed but not yet committed), forces all changes to auxiliary storage, then destroys the ODP
for that file. You can use the RCLRSC command to allow a calling program to close the files of a called
program. (For example, if the called program returns to the calling program without closing its files,
the calling program can then close the files of the called program.) However, the normal way of closing
files in a program is with the high-level language close operation or through the CLOF command. For
more information about resource reclamation in the integrated language environment, see the ILE
Concepts book.
If a job ends normally (for example, a user signs off) and all the files associated with that job were not
closed, the system automatically closes all the remaining open files associated with that job, forces all
changes to auxiliary storage, and releases all record locks for those files. If a job ends abnormally, the
system also closes all files associated with that job, releases all record locks for those files, and forces all
changes to auxiliary storage.
When a process is trying to lock a file that is held by another process, the Close database file exit
program is called. This exit is called in the process that is holding the lock.
Related concepts
Sharing database files in the same job or activation group on page 109
By default, the database management system allows one file to be read and changed by many users at
the same time. You can also share a file in the same job or activation group by specifying the SHARE
parameter.
Control language
ILE Concepts PDF
Related reference
Close File (CLOF) command
Reclaim Resources (RCLRSC) command
206
Description
CPF5001
CPF5006
CPF5007
CPF5018
CPF5025
CPF5026
CPF5027
CPF5028
CPF5029
CPF502B
CPF502D
CPF5030
CPF5031
CPF5032
CPF5033
CPF5034
CPF503A
CPF5040
CPF5072
CPF5079
CPF5084
CPF5085
CPF5090
CPF5097
You can display the full description of these messages using the Display Message Description
(DSPMSGD) command.
Database programming
207
Related concepts
Monitoring for messages in a CL program or procedure
Control language
Related reference
Display Message Description (DSPMSGD) command
Copying a file
You can copy a file using System i Navigator or the Copy File (CPYF) command.
Moving a file
You can move a database file from one library to another using System i Navigator or the Move Object
(MOVOBJ) command.
208
5. Right-click the table that you want to move, and click Cut.
6. Right-click the schema to which you want to move the table, and click Paste. Or drag the table to
another schema on the same system or a different system.
Note: Moving a table to a new location does not always remove it from the source system. For example,
if you have read authority but not delete authority to the source table, the table is moved to the
target system; however, it is not deleted from the source system, causing two instances of the table
to exist.
Distributed data management (DDM) is used by System i Navigator to actually move the table. The move
operation is performed by using DDM over TCP/IP. TCP/IP must be enabled between the source and
target systems in a way as they are known to System i Access.
Database programming
209
add a member to the newly created file.) You can specify a different member name using the MBR
parameter on the create database file commands. If you do not want a member added when the file is
created, specify *NONE on the MBR parameter.
v Specifically. After the file is created, you can add a member using the Add Physical File Member
(ADDPFM) or Add Logical File Member (ADDLFM) command.
v The Copy File (CPYF) command. If the member you are copying does not exist in the file being copied
to, the member is added to the file by the CPYF command.
Related reference
Create Physical File (CRTPF) command
Create Logical File (CRTLF) command
Add Physical File Member (ADDPFM) command
Copy File (CPYF) command
Changing member attributes:
You can use the Change Physical File Member (CHGPFM) or Change Logical File Member (CHGLFM)
command to change certain attributes of a physical or a logical file member.
For a physical file member, you can change the following parameters: SRCTYPE (the members source
type), EXPDATE (the members expiration date), SHARE (whether the member can be shared within a
job), and TEXT (the text description of the member). For a logical file member you can change the
SHARE and TEXT parameters.
Note: You can use the Change Physical File (CHGPF) and Change Logical File (CHGLF) commands to
change many other file attributes. For example, to change the maximum size allowed for each
member in the file, you can use the SIZE parameter on the CHGPF command.
Related reference
Change Physical File Member (CHGPFM) command
Change Logical File Member (CHGLFM) command
Change Physical File (CHGPF) command
Change Logical File (CHGLF) command
Renaming members:
You can use the Rename Member (RNMM) command to change the name of an existing member in a
physical or logical file; however, the file name is not changed.
Related reference
Rename Member (RNMM) command
Removing members:
You can use the Remove Member (RMVM) command to remove a member and its contents from a
database file.
After the member is removed, it can no longer be used by the system. This is different from just clearing
or deleting the data from the member. If the member still exists, programs can continue to use (for
example, add data to) the member.
Related reference
Remove Member (RMVM) command
210
If the physical file members are associated with referential constraints, the operations on these members
might be affected.
Related concepts
Ensuring data integrity with referential constraints on page 258
You use referential constraints to enforce the referential integrity of your database. Referential integrity
encompasses all of the mechanisms and techniques that you can use to ensure that your database
contains only valid data.
Initializing data in a physical file member:
To use relative record processing in a program, a database file must contain a number of record positions
equal to the highest relative record number used in the program. Programs using relative-record-number
processing sometimes require that you initialize these records.
You can use the Initialize Physical File Member (INZPFM) command to initialize members with one of
two types of records:
v Default records
v Deleted records
You specify which type of record you want using the RECORDS parameter on the INZPFM command.
If you initialize records using default records, the fields in each new record are initialized to the default
field values defined when the file was created. If no default field value was defined, then numeric fields
are filled with zeros and character fields are filled with blanks.
Variable-length character fields have a zero-length default value. The default value for null-capable fields
is the null value. The default value for dates, times, and timestamps is the current date, time, or
timestamp if no default value is defined. Program-described files have a default value of all blanks.
Note: You can initialize one default record if the UNIQUE keyword is specified in DDS for the physical
file member or any associated logical file members. Otherwise, you would create a series of
duplicate key records.
If the records are initialized to the default records, you can read a record by relative record number and
change the data.
If the records are initialized to deleted records, you can change the data by adding a record using a
relative record number of one of the deleted records. (You cannot add a record using a relative record
number that was not deleted.)
Deleted records cannot be read; they only hold a place in the member. A deleted record can be changed
by writing a new record over the deleted record.
Related concepts
Deleting database records on page 204
The delete operation allows you to delete an existing database record.
Related reference
Initialize Physical File Member (INZPFM) command
Clearing data from a physical file member:
You can remove data from a physical file member using the Clear Physical File Member (CLRPFM)
command. After the clear operation is complete, the member description remains, but the data is
removed.
Database programming
211
Related reference
Clear Physical File Member (CLRPFM) command
Reorganizing a physical file member:
You can reorganize a physical file member to change the manner in which records are stored on the
i5/OS operating system.
Reorganizing a table using System i Navigator:
Reorganizing a table restores the table to its ideal physical organization. That is, the rows of the table are
laid out on pages and ordered by their key values in some frequently used indexes. You can reorganize a
table by compressing out deleted records, by key, or by a selected index from System i Navigator.
To
1.
2.
3.
4. Click Tables.
5. Right-click the table that you want to reorganize, and click Data Reorganize.
6. To specify how to reorganize the rows in the table, select one of the following options.
v By compressing out deleted rows without preserving the arrival row sequence: specify that valid
rows at the end of the table are moved to deleted rows until no deleted rows remain.
v By compressing out deleted rows and preserving the arrival row sequence: specify that all valid
rows after the first deleted row in the table are moved forward in the table to compress out any
deleted rows.
v By table key: specify that the rows of the table are rearranged by the key values of the tables access
path. The table must have a primary key or must be a keyed physical file.
v By a selected index from library: specify that the rows of the table are rearranged by the key values
of an index or keyed logical file that is built over the specified table. You can select only an existing
index. Your list of indexes is determined by the library you select.
7. Optional: To control the performance and concurrency of the reorganize operation, select any of the
following options:
v Specify which partition of a partitioned file (or which member of a multiple member physical file)
should be reorganized.
v Specify whether the reorganize operation can be suspended and subsequently restarted.
If you do not specify that the reorganize operation can be suspended, the table will be allocated
exclusively for the duration of the reorganize operation and can only be suspended by ending the
job immediately.
If you specify that the reorganize can be suspended:
The file must be journaled since the rows are moved under commitment control to ensure that
no rows are lost if the reorganize operation is suspended.
You can also specify whether other users can read the table or change the table during the
reorganize operation. Locks are acquired for short periods of time on rows that are moved
during the reorganize. If concurrent jobs also acquire locks on rows, record lock time-outs might
occur. You can change the record lock wait time for the file, or you can use the Override with
Database File (OVRDBF) command to specify an appropriate record wait time.
v Specify how indexes are maintained:
If you specify that the reorganize operation can be suspended, you can also specify that all
indexes should be maintained during the reorganize operation. No index rebuilds are necessary.
212
Otherwise, you can specify that indexes be rebuilt synchronously or asynchronously. You can see
the progress of asynchronously built indexes by using the Edit Rebuild of Access Paths
(EDTRBDAP) command.
Related concepts
Locking records on page 105
DB2 for i has built-in integrity for records.
Reorganizing a physical file member using the Reorganize Physical File Member (RGZPFM) command:
You can specify several key options when you reorganize a physical file member using the Reorganize
Physical File Member (RGZPFM) command.
You can use the RGZPFM command to:
v Remove deleted records to make the space occupied by them available.
v Reorganize the records of a physical file member in the order in which you normally access them
sequentially, thereby minimizing the time required to retrieve records. You can do this by using the
KEYFILE parameter. This might be advantageous for members that are primarily accessed in an order
other than arrival sequence. You can reorganize a physical file member using either of the following
key fields:
Key fields of the physical file member
Key fields of a logical file member that is based on the physical file
Note: Key fields are defined at the file level.
v Reorganize a source file member, insert new source sequence numbers, and reset the source date fields
(using the SRCOPT and SRCSEQ parameters on the RGZPFM command).
v If you specify that the reorganize operation cannot be canceled, reclaim space in the variable portion of
the member that was previously used by variable-length fields in the physical file format and that has
become fragmented.
Related reference
Reorganize Physical File Member (RGZPFM) command
Usage notes: Reorganizing a physical file member on page 214
Here is a list of considerations for reorganizing a physical file member.
Example: Reorganizing a physical file member:
The example shows how to reorganize a physical file member with the Reorganize Physical File Member
(RGZPFM) command.
For example, the following RGZPFM command reorganizes the first member of a physical file using an
access path of a logical file member:
RGZPFM
FILE(DSTPRODLB/ORDHDRP)
KEYFILE(DSTPRODLB/ORDFILL
ORDFILL)
Physical file member ORDHDRP has an arrival sequence access path. You reorganize it using the access
path of logical file member ORDFILL. Assume that the key field is the Order field. The following tables
show how records are arranged.
This table shows the original physical file member ORDHDRP. Record 3 is deleted before the RGZPFM
command is run.
Relative record number
Cust
Order
Ordate. . .
1
2
41394
28674
41882
32133
072480. . .
060280. . .
Database programming
213
Cust
Order
Ordate. . .
3
4
deleted
56325
record
38694
062780. . .
This table shows the physical file member ORDHDRP after you reorganize it using the Order field as the
key field in ascending sequence.
Relative record Number
Cust
Order
Ordate. . .
1
2
3
28674
56325
41394
32133
38694
41882
060280. . .
062780. . .
072480. . .
214
v ALWCANCEL(*YES): The data rows are moved within the physical file member so that a full copy of
the data is not required. The physical file must be journaled, however, so storage is necessary for the
journal entries. You can use the journal receiver threshold to minimize the amount of storage used in a
specific journal receiver.
This option can be canceled (suspended) and restarted. It can run in parallel if the DB2 Symmetric
Multiprocessing option is installed. To control the amount of resources used by the reorganize
operation, you might want to change the query attributes by using the Change Query Attributes
(CHGQRYA) CL command or by using the Change Query Attributes function from System i Navigator.
This option requires exclusive use for only a few seconds after the reorganize operation is complete to
return storage to the system. If the exclusive lock cannot be acquired, a warning message is sent to the
job log indicating that space cannot be recovered. To recover the space, you can start the reorganization
again when no concurrent users are accessing the file member. The reorganize operation then
immediately attempts to recover the space before starting the reorganization. If concurrent data
changes have occurred since the initial reorganize operation, only a portion of the space might be
recovered.
If LOCK(*EXCLRD) or LOCK(*SHRUPD) is specified, the result of the reorganize operation is not
guaranteed to be exact, because concurrent users might be locking rows or changing rows in the file
member.
The type of reorganize operation that you decide to use depends on several factors. For example, is your
goal to recover space, or is the sequence of the rows important? Is it important that the reorganize
operation can be canceled (suspended)? Is it important to allow concurrent access to the physical file
member? Use the following table to determine which option is most appropriate based on these factors.
The shaded entries (which are also identified by an asterisk) are the characteristics of a key file option
that make its choice particularly desirable.
ALWCANCEL(*NO)
ALWCANCEL(*YES)
KEYFILE(*NONE)
KEYFILE(*FILE or
keyfile)
KEYFILE
(*RPLDLTRCD)
KEYFILE(*NONE)
KEYFILE(*FILE or
keyfile)
No
No
Yes*
Yes*
Yes*
Concurrent access
No
No
Yes*
Yes*
Yes*
Parallel processing
Non-parallel
performance
Very fast
Fast
Very fast*
Temporary storage
Slower*
Slowest*
Journal receiver
storage*
Journal receiver
storage*
LIFO KEYFILE
index processing
N/A
Duplicates reversed
N/A*
N/A*
Duplicate ordering
preserved*
Index processing
(non-KEYFILE)
Synchronous or
asynchronous
rebuilds*
Synchronous or
asynchronous
rebuilds*
Maintain indexes or
synchronous or
asynchronous
rebuilds*
Maintain indexes or
synchronous or
asynchronous
rebuilds*
Maintain indexes or
synchronous or
asynchronous
rebuilds*
Yes*
Yes*
Only if
LOCK(*EXCL) and
not restarted
Only if
LOCK(*EXCL) and
not restarted
Only if
LOCK(*EXCL) and
not restarted
Amount of CPU
and I/O used
Smallest*
Next smallest*
Smallest
More
Most
Variable lengths
segment reorganize
Good*
Good*
Worse
Worse
Worse
Allows referential
integrity parents
and FILE LINK
CONTROL
DataLinks
Yes*
Yes*
No
No
No
Database programming
215
ALWCANCEL(*NO)
KEYFILE(*NONE)
ALWCANCEL(*YES)
KEYFILE(*FILE or
keyfile)
KEYFILE
(*RPLDLTRCD)
KEYFILE(*NONE)
KEYFILE(*FILE or
keyfile)
Yes*
No
No
No
Replication cost
Minimal (one
journal entry)*
More (journal
entries for all rows
moved)
Most (journal
entries for all rows
moved)
Most (journal
entries for all rows
moved)
Minimal (one
journal entry)*
216
Related concepts
Reusing deleted records on page 101
Sometimes you might want to reuse deleted records for your database files. In this case, you can use the
REUSEDLT parameter.
Displaying records in a physical file member:
You can display records in a physical file member using the Display Physical File Member (DSPPFM)
command.
The DSPPFM command can be used to display the data in the physical file member by arrival sequence.
The DSPPFM command can be used for:
v Problem analysis
v Debugging
v Record inquiry
You can display source files or data files, whether they are keyed or arrival sequence. Records are
displayed in arrival sequence, even if the file is a keyed file. You can page through the file, locate a
particular record by record number, or shift the display to the right or left to see other parts of the
records. You can also press a function key to show either character data or hexadecimal data on the
display.
If you have Query installed, you can use the Start Query (STRQRY) command to select and display
records, too.
If you have the SQL language installed, you can use the Start SQL (STRSQL) command to interactively
select and display records.
Related reference
Display Physical File Member (DSPPFM) command
Database programming
217
Related concepts
Control language
Related reference
Retrieve Member Description (RTVMBRD) command
Related reference
Display File Description (DSPFD) command
Displaying the description of the fields in a file:
You can use the Display File Field Description (DSPFFD) command to display field information for both
database and device files. The information can be displayed, printed, or written to a database output file
(OUTFILE).
218
Related reference
Display File Field Description (DSPFFD) command
Displaying the relationships between files on the system:
You can use the Display Database Relations (DSPDBR) command to display the relationships between
database files on the system. The information can be displayed, printed, or written to a database output
file (OUTFILE).
You can use the DSPDBR command to display the following information about the organization of your
database:
v A list of database files (physical and logical) that use a specific record format.
v A list of database files (physical and logical) that depend on the specified file for data sharing.
v A list of members (physical and logical) that depend on the specified member for sharing data or
sharing an access path.
v A list of physical files that are dependent files in a referential constraint relationship with this file.
For example, to display a list of all database files associated with physical file ORDHDRP, with the record
format ORDHDR, type the following DSPDBR command:
DSPDBR FILE(DSTPRODLB/ORDHDRP) RCDFMT(ORDHDR)
Note: See the DSPDBR command description in the Control language (CL) topic for details of this
display.
This display presents header information when a record format name is specified on the RCDFMT
parameter, and presents information about which files are using the specified record format.
If a member name is specified on the MBR parameter of the DSPDBR command, the dependent members
are shown.
If the DSPDBR command is specified with the default MBR(*NONE) parameter value, the dependent
data files are shown. To display the shared access paths, you must specify a member name.
The DSPDBR command output identifies the type of sharing involved. If the results of the command are
displayed, the name of the type of sharing is displayed. If the results of the command are written to a
database file, the code for the type of sharing (shown below) is placed in the WHTYPE field in the
records of the output file.
Type
Code
Description
Constraint
Data
I
O
SQL View
219
Related concepts
Control language
Related reference
Display Database Relations (DSPDBR) command
Displaying the files used by programs:
You can use the Display Program Reference (DSPPGMREF) command to determine which files, data
areas, and other programs are used by a program. This information is available for compiled programs
only and can be displayed, printed, or written to a database output file (OUTFILE).
When a program is created, the information about certain objects used in the program is stored. This
information is then available for use with the DSPPGMREF command.
The following table shows the objects for which the high-level languages and utilities save information.
Language or utility
Files
Programs
Data areas
See Notes
CL
COBOL/400
CSP
DFU
FORTRAN/400
ILE C/C++
ILE COBOL
ILE RPG
PL/I
RPG/400
SQL
Notes:
Yes
Yes
Yes
Yes
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
N/A
No
No
Yes
Yes
Yes
Yes
N/A
Yes
No
No
N/A
N/A
N/A
Yes
Yes
N/A
Yes
N/A
1
2
3
2
2
4
1. All system commands that refer to files, programs, or data areas specify in the command definition that the
information should be stored when the command is compiled in a control language (CL) program. If a variable
is used, the name of the variable is used as the object name (for example, &FILE); If an expression is used, the
name of the object is stored as *EXPR. User-defined commands can also store the information for files, programs,
or data areas specified on the command. See the description of the FILE, PGM, and DTAARA parameters on the
PARM or ELEM command statements in the Control language (CL) topic.
2. The program name is stored only when a literal is used for the program name (this is a static call, for example,
CALL 'PGM1'), not when a COBOL/400 identifier is used for the program name (this is a dynamic call, for
example, CALL PGM1).
3. CSP programs also save information for an object of type *MSGF, *CSPMAP, and *CSPTBL.
4. The use of the local data area is not stored.
The stored file information contains an entry (a number) for the type of use. In the database file output of
the DSPPGMREF command (built when using the OUTFILE parameter), this is specified as:
Code
Meaning
Input
Output
Update
Unspecified
220
Combinations of codes are also used. For example, a file coded as a 7 would be used for input, output,
and update.
Related concepts
Control language
Related reference
Display Program Reference (DSPPGMREF) command
Displaying the system cross-reference files:
You can use the database files that are managed by the system to determine basic attribute and database
file requirements. To display the fields in these files, use the Display File Field Description (DSPFFD)
command.
The system manages eight database files that contain the following information:
v Basic database file attribute information (QSYS/QADBXREF)
v Cross-reference information (QSYS/QADBFDEP) about all the database files on the system (except
those database files that are in the QTEMP library)
v
v
v
v
221
See the Control language (CL) topic for a list of commands that allow output files and the names of the
model files supplied for those commands.
Note: All system-supplied model files are located in the QSYS library.
You can display the fields contained in the record formats of the system-supplied model files using the
Display File Field Descriptions (DSPFFD) command.
Related concepts
Control language
Related reference
Display File Field Description (DSPFFD) command
Display Journal (DSPJRN) command
Display Problems (DSPPRB) command
Example: A command output file:
This example shows how to write the output from a control language (CL) command directly to a
database file.
You can use the Display Program References (DSPPGMREF) command to collect information for all
compiled programs in all libraries and place the output in a database file named DBROUT:
DSPPGMREF
PGM(*ALL/*ALL)
OUTPUT(*OUTFILE)
OUTFILE(DSTPRODLB/DBROUT)
You can use Query to process the output file. Another way to process the output file is to create a logical
file to select information from the file. The following example shows the DDS for such a logical file.
Records are selected based on the file name.
|...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
A* Logical file DBROUTL for query
A
A
R DBROUTL
PFILE(DBROUT)
A
S WHFNAM
VALUES('ORDHDRL' 'ORDFILL')
A
FILE(LIBA/*ALL) TYPE(*ACCPTH)
OUTFILE(LIBB/ABC)
OUTPUT(*OUTFILE) +
The file ABC is created in library LIBB and is externally described with the same field descriptions as in
the system-supplied file QSYS/QAFDACCP. The ABC file then contains a record for each key field in
each file found in library LIBA that has an access path.
If the DSPFD command is coded as:
DSPFD
the file DEF is created in library LIBB and is externally described with the same field descriptions as exist
in QSYS/QAFDPHY. The DEF file then contains a record for each physical file found in library LIBX.
222
You can display the field names of each model file supplied by IBM using the DSPFFD command. For
example, to display the field description for the access path model file (*ACCPTH specified on the TYPE
parameter), specify as follows:
DSPFFD
QSYS/QAFDACCP
Related concepts
Control language
Related reference
Display File Description (DSPFD) command
Output files for the Display Journal (DSPJRN) command:
The Display Journal (DSPJRN) command provides unique output files.
Related concepts
Control language
Related reference
Display Journal (DSPJRN) command
Output files for the Display Problems (DSPPRB) command:
The Display Problems (DSPPRB) command provides unique output files, depending on the type of
record.
The output files depend on the following types of record:
v Basic problem data record (*BASIC). This includes problem type, status, machine type/model/serial
number, product ID, contact information, and tracking data.
v Point of failure, isolation, or answer FRU records (*CAUSE). Answer FRUs are used if they are
available. If answer FRUs are not available, isolation FRUs are used if they are available. If answer
FRUs and isolation FRUs are not available, then point of failure FRUs are used.
v PTF fix records (*FIX).
v User-entered text (note records) (*USRTXT).
v Supporting data identifier records (*SPTDTA).
The records in all five output files have a problem identifier so that the cause, fix, user text information,
and supporting data can be correlated with the basic problem data. Only one type of data can be written
to a particular output file. The cause, fix, user text, and supporting data output files can have multiple
records for a particular problem.
Related concepts
Control language
Related reference
Display Problems (DSPPRB) command
Database programming
223
When a program that uses externally described data is compiled, the compiler copies the file descriptions
of the files into the compiled program. When you run the program, the system can verify that the record
formats the program was compiled with are the same as the record formats currently defined for the file.
The default is to do level checking. The system assigns a unique level identifier for each record format
when the file it is associated with is created. The system uses the information in the record format
description to determine the level identifier. This information includes the total length of the record
format, the record format name, the number and order of fields defined, the data type, the size of the
fields, the field names, the number of decimal positions in the field, and whether the field allows the null
value. Changes to this information in a record format cause the level identifier to change.
The following DDS information has no effect on the level identifier and, therefore, can be changed
without recompiling the program that uses the file:
v TEXT keyword
v COLHDG keyword
v CHECK keyword
v EDTCDE keyword
v EDTWRD keyword
v REF keyword
v
v
v
v
v
REFFLD keyword
CMP, RANGE, and VALUES keywords
TRNTBL keyword
REFSHIFT keyword
DFT keyword
v CCSID keyword
v Join specifications and join keywords
v Key fields
v Access path keywords
v Select/omit fields
Keep in mind that even though changing key fields or select/omit fields does not cause a level check, the
change might cause unexpected results in programs using the new access path. For example, changing
the key field from the customer number to the customer name changes the order in which the records are
retrieved, and might cause unexpected problems in the programs processing the file.
If level checking is specified (or defaulted to), the level identifier of the file to be used is compared to the
level identifier of the file in your program when the file is opened. If the identifiers differ, a message is
sent to the program to identify the changed condition and the changes might affect your program. You
can compile your program again so that the changes are included.
An alternative is to display the file description to determine if the changes affect your program. You can
use the Display File Field Description (DSPFFD) command to display the description or, if you have
source entry utility (SEU), you can display the source file containing the DDS for the file.
The format level identifier defined in the file can be displayed by the Display File Description (DSPFD)
command. When you are displaying the level identifier, remember that the record format identifier is
compared, rather than the file identifier.
Not every change in a file necessarily affects your program. For example, if you add a field to the end of
a file and your program does not use the new field, you do not have to recompile your program. If the
changes do not affect your program, you can use the Change Physical File (CHGPF) or the Change
224
Logical File (CHGLF) command with LVLCHK(*NO) specified to turn off level checking for the file, or
you can enter an Override with Database File (OVRDBF) command with LVLCHK(*NO) specified so that
you can run your program without level checking.
Keep in mind that level checking is the preferred method of operating. The use of LVLCHK(*YES) is a
good database integrity practice. The results produced by LVLCHK(*NO) cannot always be predicted.
Related reference
Display File Field Description (DSPFFD) command
Display File Description (DSPFD) command
Change Physical File (CHGPF) command
Change Logical File (CHGLF) command
Override with Database File (OVRDBF) command
FILEB does not have a member. (The old file FILEA is in library LIBA and has one member MBRA.)
2. Copy the member of the old physical file to the new physical file:
CPYF
FROMFILE(LIBA/FILEA) TOFILE(LIBA/FILEB)
FROMMBR(*ALL) TOMBR(*FROMMBR)
MBROPT(*ADD) FMTOPT(*MAP)
The member in the new physical file is automatically named the same as the member in the old
physical file because FROMMBR(*ALL) and TOMBR(*FROMMBR) are specified. The FMTOPT
parameter specifies to copy (*MAP) the data in the fields by field name.
3. Describe a new logical file (FILEC) that looks like the original physical file (the logical file record
format does not include the new physical file field). Specify FILEB for the PFILE keyword. (When a
level check is done, the level identifier in the logical file and the level identifier in the program match
because FILEA and FILEC have the same format.)
4. Create the new logical file:
CRTLF FILE(LIBA/FILEC)...
b. Delete the old physical file and rename the logical file to the name of the old physical file so the
file name in the program does not have to be overridden.
Database programming
225
DLTF FILE(LIBA/FILEA)
RNMOBJ
OBJ(LIBA/FILEC) OBJTYPE(*FILE)
NEWOBJ(FILEA)
The following tables illustrate the relationship of the record formats used in the three files.
Table 47. FILEA (old physical file)
FLDA
FLDB
FLDC
FLDD
FILEC shares the record format of FILEA. FLDB1 is not used in the record format for the logical file.
Table 49. FILEC (logical file)
FLDA
FLDB
FLDC
FLDD
When you make changes to a physical file, which causes you to create the file again, all logical files
referring to it must first be deleted before you can delete and create a new physical file. After the
physical file is re-created, you can re-create or restore the logical files referring to it.
Example 1: Changing a physical file description and attributes:
This example shows how to create a new physical file with the same name in a different library.
1. Create a new physical file with a different record format in a library different from the library the old
physical file is in. The name of the new file should be the same as the name of the old file. (The old
physical file FILEPFC is in library LIBB and has two members, MBRC1 and MBRC2.)
CRTPF FILE(NEWLIB/FILEPFC) MAXMBRS(2)...
2. Copy the members of the old physical file to the new physical file. The members in the new physical
file are automatically named the same as the members in the old physical file because
TOMBR(*FROMMBR) and FROMMBR(*ALL) are specified.
CPYF
FROMFILE(LIBB/FILEPFC) TOFILE(NEWLIB/FILEPFC)
FROMMBR(*ALL) TOMBR(*FROMMBR)
FMTOPT(*MAP *DROP) MBROPT(*ADD)
3. Describe and create a new logical file in a library different from the library the old logical file is in.
The new logical file name should be the same as the old logical file name. You can use the FORMAT
keyword to use the same record formats as in the current logical file if no changes need to be made to
the record formats. You can also use the Create Duplicate Object (CRTDUPOBJ) command to create
another logical file from the old logical file FILELFC in library LIBB.
CRTLF FILE(NEWLIB/FILELFC)
5. Move the newly created files to the original library by using the following commands:
MOVOBJ OBJ(NEWLIB/FILELFC) OBJTYPE(*FILE) TOLIB(LIBB)
MOVOBJ OBJ(NEWLIB/FILEPFC) OBJTYPE(*FILE) TOLIB(LIBB)
226
To create new versions of files in the same library, follow these steps:
1. Create a new physical file with a different record format in the same library the old physical file is in.
The names of the old and new files should be different. (The old physical file FILEPFA is in library
LIBA and has two members MBRA1 and MBRA2.)
CRTPF FILE(LIBA/FILEPFB) MAXMBRS(2)...
2. Copy the members of the old physical file to the new physical file.
CPYF
FROMFILE(LIBA/FILEPFA) TOFILE(LIBA/FILEPFB)
FROMMBR(*ALL) TOMBR(*FROMMBR)
FMTOPT(*MAP *DROP) MBROPT(*REPLACE)
3. Create a new logical file in the same library as the old logical file is in. The names of the old and new
files should be different. (You can use the FORMAT keyword to use the same record formats as are in
the current logical file if no changes need be made to the record formats.) The PFILE keyword must
refer to the new physical file created in step 1. The old logical file FILELFA is in library LIBA.
CRTLF FILE(LIBA/FILELFB)
5. Rename the new logical file to the name of the old logical file. (If you also decide to rename the
physical file, be sure to change the DDS for logical file so that the PFILE keyword refers to the new
physical file name.)
RNMOBJ(LIBA/FILELFB) OBJTYPE(*FILE) NEWOBJ(FILELFA)
6. If the logical file member should be renamed, and assume that the default was used on the Create
Logical File (CRTLF) command, issue the following command:
RNMM FILE(LIBA/FILELFA) MBR(FILELFB) NEWMBR(FILELFA)
You can use the Change Physical File (CHGPF) command to change some of the attributes of a physical
file and its members.
Related concepts
Control language
Database programming
227
Related reference
Change Logical File (CHGLF) command
Create Logical File (CRTLF) command
228
Related concepts
Journal management
Working with journals:
You can work with journals using CL commands or System i Navigator functions.
The following CL commands can be used to work with journals:
v To recover a damaged or unusable database file member that contains journaled changes, use the
Apply Journaled Changes (APYJRNCHG) and Remove Journaled Changes (RMVJRNCHG) commands.
v To apply the changes that were recorded in a journal receiver to the designated physical file member,
use the APYJRNCHG command. However, depending on the type of damage to the physical file and
the amount of activity since the file was last saved, removing changes from the file using the
RMVJRNCHG command can be easier.
v To convert journal entries to a database file, use the Display Journal (DSPJRN) command. Use this file
for activity reports, audit trails, security, and program debugging.
Related concepts
Journal management
Control language
Related reference
Apply Journaled Changes (APYJRNCHG) command
Removed Journaled Changes (RMVJRNCHG) command
Display Journal (DSPJRN) command
Creating a journal using System i Navigator:
Creating a journal causes a new instance of a journal on your system. You must start journaling the table
to a journal before it begins journaling information.
To
1.
2.
3.
4. Right-click the schema in which you want to create the journal, and click New Journal.
5. In the New Journal window, specify a journal name in the Name field.
6. Optional: In the Description field, specify a description for the journal.
7. Select a library in which to store the journal receivers.
8. Click OK to create the journal.
You can now create the journal using the default values. You can edit the journal default values by
clicking Advanced. To create the journal using the default values, click OK.
To edit the journal default values, first create the journal and then follow these steps:
1. In the New Journal window, click Advanced.
2. In the Journal message queue field, select the journal message queue. The default is the System
Operator message queue. You can specify another message queue. However, if the message queue
that you specify is not available when the message is sent, the message is sent to the System
Operator message queue.
3. Specify the library in which to store the journal message queue.
4. Optional: In the Description field, edit or specify a description.
Database programming
229
230
The journal and journal receiver are created or changed with the values that you specify on the Advanced
Journal Attributes or the Journal Properties window. If you do not specify any values, the journal and
journal receiver are created with the default values.
For journals:
v The journal is created in the library in focus.
v The storage space for the journal is allocated from the same auxiliary storage pool (ASP) as the storage
space of the journals librarys ASP. This value cannot be changed.
v The message queue associated with the journal is the System Operator message queue.
v The swapping of journal receivers is set so that the system automatically does the swapping.
v The journal receivers are not automatically deleted by the system during swap processing.
v The fixed portion of journal entries are not minimized, but the internal journal entries are removed.
v The public authority for the journal is taken from the default public authority for the library.
v No default text description is created for the journal.
For journal receivers:
v The storage space for the journal receiver is allocated from the same auxiliary storage pool (ASP) as the
storage space of the journal receivers librarys ASP. This value cannot be changed.
v The storage space threshold for the journal receiver is set at 500 megabyte (MB).
v The public authority for the journal receiver is taken from the default public authority for the library.
v A default text description is created for the journal receiver.
Adding a remote journal using System i Navigator:
Remote journals allow you to replicate journal information to a separate system. A remote journal is
associated with an existing journal. The journal on the source system can be either a local journal or
another remote journal.
To
1.
2.
3.
4. Click Journals.
5. Right-click the journal to which you want to add a remote journal, and click Properties.
6. In the Journal Properties window, click Remote Journals.
7. In the Remote Journals window, to add (that is, to associate) a remote journal to this journal, click
Add.
a. In the Add a Remote Journal window, click the arrow in the Relational database name field to
display a list of relational database (RDB) directory entries.
b. Select the journal type (Type 1 or Type 2).
c. To associate the remote journal receivers on the target system with a library different from that
used on the source system, select Redirect receiver.
d. In the Target receiver schema field, specify the library on the target system where the remote
journal receivers are to be located.
8. Click OK to close the Add a Remote Journal window.
The remote journal type influences the redirection capabilities, journal receiver restore operations, and
remote journal association characteristics.
Database programming
231
Limited redirection (Type 1) If the remote journal being added is Type 1, the journal library name be
redirected to a single different library from that of the local journal. All Type 1 remote journals associated
with a given local journal must reside in the same library. A Type 1 remote journal cannot be added to a
Type 2 remote journal.
Flexible redirection (Type 2) If the remote journal being added is Type 2, you can specify a redirected
library that is the same as or different from the redirected library specified on previous additions of Type
2 remote journals. Subsequent additions of Type 2 remote journals can specify a different library
redirection from what was specified on any previously added remote journal.
After you have added a remote journal, you must activate it.
Note: This task assumes that you have an RDB directory entry and that you have a user profile on the
target system.
Removing a remote journal using System i Navigator:
Removing a remote journal disassociates it from the journal on the source system; it does not delete the
journal or the journal receivers. You must deactivate a remote journal before you can remove it.
Activating a remote journal using System i Navigator:
After you add a remote journal, you must activate it.
To activate a remote journal, follow these steps:
1. From System i Navigator, expand your system Databases.
2. Expand the database that you want to work with.
3. Expand Schemas and the schema that contains the journal that has the associated remote journal you
want to activate.
4. Click Journals.
5. Right-click the journal that has the associated remote journal you want to activate, and click
Properties.
6. In the Journal Properties window, click Remote Journals.
7. In the Remote Journals window, select the remote journal in the list of remote journals, and then click
Activate to activate the selected remote journal.
8. In the Activate window, select the delivery mode, the starting receiver, and the processing mode for
the activate request.
9. Click OK to close the Activate window.
Notes:
v Activating a remote journal for the first time creates one or more journal receivers on the target
system.
v Activating the remote journal establishes the connection between the source and remote
journals so that journal entry replication can begin.
v The remote journal must not be active before you can activate it. Also, the remote journal that
you are activating must not be replicating journal entries to other remote journals.
Deactivating a remote journal using System i Navigator:
When you deactivate a remote journal, the collection of data is stopped.
If you are deactivating a synchronously maintained journal, the remote journal function is ended
immediately, regardless of whether an immediate or controlled end is requested. If the remote journal is
232
in the catch-up phase of processing, the remote journal function is ended immediately, regardless of
whether an immediate or controlled end is requested. (Catch-up processing refers to the process of
replicating journal entries that existed in the journal receivers of the source journal before the remote
journal was activated.) Remote journals are in catch-up if they have a delivery mode of asynchronous
pending or synchronous pending.
Controlled
Deactivates the remote journal function in a controlled manner. This means that the system should
replicate all journal entries already queued to be sent from the source system to the target system
before deactivating the remote journal. Until all queued entries have been replicated, the remote
journal will be in a state of inactive pending. While in a state of inactive pending, the Remote
Journals window provides inactive pending information. When all queued entries have been sent to
the target system, the system sends a message to the journal message queue, indicating that the
remote journal function has been ended.
Immediately
Deactivates the remote journal function immediately. This means that the system should not continue
to replicate any journal entries that are already queued before deactivating the remote journal.
Displaying journal information for a table using System i Navigator:
You can get journal information for a table from System i Navigator.
To
1.
2.
3.
233
QRCLxxxxx
QRCYxxxxx
QRECOVERY
QRPLOBJ
v QRPLxxxxx
v QSPL
v QSPLyyyy
v
v
v
v
QSYS
QSYSxxxxx
QSYS2
QSYS2xxxxx
v
v
v
v
v
QTEMP
SYSIBxxxxx
SYSIBM
SYSIBMADM
SYSPROC
v SYSTOOLS
To start journaling changes to a library, use the Start Journal Library (STRJRNLIB) command. When the
STRJRNLIB command is used, the library must exist and you must have the appropriate authority to the
journal. Authority to the journal is not required later when files are implicitly journaled.
When you start journaling changes to a library by using the STRJRNLIB command, you can specify
whether database files that are created, moved, or restored into the library should inherit the journaling
state of the library and which journaling attributes they should have. Based on the inheritance rules that
you defined using the INHRULES parameter, files that are created, moved, or restored into the journaled
library can automatically start journaling to the same journal as the library.
234
Journal entries for libraries and for files that were created, moved, or restored into the libraries and that
started journaling because of the library journaling inheritance can be applied by the Apply Journaled
Changes (APYJRNCHG) command or the Apply Journaled Changes Extend (APYJRNCHGX) command.
Note: If a journaled library contains a data area named QDFTJRN, no files that are created, moved, or
restored into the library can inherit the journaling state of the library. Instead, files that are created,
moved, or restored into the library automatically start journaling based on the rules defined in the
QDFTJRN data area.
To end journaling changes to a library, use the End Journal Library (ENDJRNLIB) command. When
journaling is ended, the inheritance rules that were previously defined for the library are not deleted.
Related concepts
Automatically starting journaling
Implicit physical file journaling on page 38
A physical file can be journaled automatically when it is created.
Journaling libraries
Related reference
Start Journal Library (STRJRNLIB) command
End Journal Library (ENDJRNLIB) command
Change Journaled Object (CHGJRNOBJ) command
Apply Journaled Changes (APYJRNCHG) command
Apply Journaled Changes Extend (APYJRNCHGX) command
Starting or ending journaling for tables (files) using System i Navigator:
After you create a journal, you must start it for a table (file). If you want to delete a journal, you must
end it.
To
1.
2.
3.
start or end journaling for a table using System i Navigator, follow these steps:
From System i Navigator, expand your system Databases.
Expand the database that you want to work with.
Expand Schemas and the schema that contains the journal that you want to edit.
4. Click Journals.
5. Right-click the journal that you want to edit, and click Start or End Table Journaling. The Start/End
Journaling window opens.
v To start journaling for a table, select the table that you want to journal from the Tables list, and
then click Add. Or you can drag a table from the Tables list to the Tables to journal list.
v To end journaling for a table, select the table that you no longer want to journal from the Tables
already journaled list, and then click Remove.
v To end journaling for all the tables at once, click Select all to select all the tables listed in the Tables
already journaled list, and then click Remove.
6. Click OK to close the Start/End Journaling window.
You can also start or end journaling for a table by following these steps:
1. Right-click the table for which you want to start or end journaling, and click Journaling.
2. To end journaling for the table, click End. To start journaling for the table, continue with the following
steps:
a. Select a journal to associate with the table. You can also browse for the journal.
b. Select a library in which the journal is located. This field is automatically completed when you
select a journal from Browse.
Database programming
235
c. To journal before images, select the Journal images before change check box.
d. To omit open and close entries from being journaled, clear the Include open and close entries
check box.
e. Click Start to start journaling for the table.
Ensuring data integrity with commitment control:
Commitment control allows you to define and process a number of changes to database files in a single
unit (transaction).
Commitment control ensures that complex application transactions are logically synchronized, even if the
job or system ends. Two-phase commitment control ensures that committable resources, such as database
files on multiple systems, remain synchronized.
You implement commitment control in your database by executing commit and rollback operations.
Using SQL, you use the COMMIT and ROLLBACK statements.
Related concepts
Commitment control
Related reference
COMMIT
ROLLBACK
Transactions:
A transaction is a group of changes that appear as a single change, such as the transfer of funds from a
savings account to a checking account.
Transactions can be classified into the following categories:
v Inquiries in which no file changes occur.
v Simple transactions in which one file is changed each time you press the Enter key.
v Complex transactions in which two or more files are changed each time you press the Enter key.
v Complex transactions in which one or more files are changed each time you press the Enter key. These
changes represent only part of a logical group of transactions.
Revisions made to files during transaction processing are journaled when using commitment control.
If the system or job ends abnormally, journaling alone can ensure that, at most, only the very last record
change is lost. However, if the system or job ends abnormally during a complex transaction, the files
reflect an incomplete logical transaction. For example, the job might have updated a record in file A, but
before it updates a corresponding record in file B, the job ended abnormally. In this case, the logical
transaction consists of two updates, but only one update had completed before the job ended abnormally.
Benefits of using commitment control:
Recovering a complex application requires detailed application knowledge. Programs cannot be restarted.
In this case, commitment control helps solve these problems.
Sometimes record changes might have to be made with an application program or data file utility to
reverse the files to just before the last complex transaction began. This task becomes more complex if
multiple users are accessing the files at the same time. In this case, commitment control can help.
Commitment control locks records from other users during a complex transaction. This ensures that other
users do not use the records until the transaction is complete. At the end of the transaction, the program
issues the commit operation, freeing the records. However, if the system ends abnormally before
236
performing the commit operation, all record changes for that job since the last time a commit operation
occurred are rolled back. Any affected records that are still locked are then unlocked. In other words,
database changes roll back to a clean transaction boundary.
Usage notes: Commitment control:
The commit and rollback operations are available in several programming languages that are supported
on the i5/OS operating system, including RPG, COBOL, PL/I, SQL, and CL.
You can open logical files for output under commitment control when underlying physical files are
journaled to different journals. Commitment control can also be used in a batch environment.
However, the checks for violations are deferred if a record change affects underlying physical files that
are journaled to the same journal. If the record change affects underlying physical files that are not
journaled to the same journal, and it causes a duplicate key or referential constraint violation, an error
will occur during the input/output operation. For example, assume physical file A with a unique key is
journaled to journal X, while physical file B with a unique key is journaled to journal Y. Logical file C is
created over physical files A and B and opened under commitment control. A delete operation performed
using logical file C removes a record from physical file A with key K. It is possible to add a record back
to physical file A with key K before the transaction is committed. However, an attempt to add a record to
physical file B with key K, before the transaction is committed, will fail since physical files A and B are
journaled to different journals.
Just as it provides assistance in interactive transaction recovery, commitment control can also help in
batch job recovery.
Related concepts
Commitment control
Database programming
237
Related concepts
Backup and recovery
Restoring access paths:
The system has the ability to restore access paths. It usually restores an access path faster than it rebuilds
an access path.
The system can restore access paths if:
v They were previously saved.
v All the physical files on which they depend are restored at the same time.
For example, assume that a logical file is built over a physical file that contains 500 000 records. You have
determined through the Display Object Description (DSPOBJD) command that the size of the logical file
is about 15 megabytes.
In this example, it takes about 50 minutes to rebuild the access path for the logical file. It takes about 1
minute to restore the same access path from a tape. (This assumes that the system builds approximately
10 000 index entries per minute.)
After restoring the access path, you might need to update the file by applying the latest journal changes.
For example, the system applies approximately 80 000 to 100 000 journal entries to the file per hour. This
assumes that each of the physical files to which entries are being applied has only one access path built
over it. This rate drops proportionally for each access path of *IMMED maintenance that is present over
the physical file. Even with this additional recovery time, you usually find that it is faster to restore
access paths than to rebuild them.
Related concepts
Journal management
Journaling access paths:
Journaling access paths can reduce recovery time by reducing the number of access paths that need to be
rebuilt after an abnormal system end. It is suggested that you journal access paths because larger access
paths require more time to rebuild.
When you journal database files, you record images of changes to the file in the journal. The system uses
these record images to recover the file after an abnormal system end.
After an abnormal end, the system might find that access paths are not synchronized with the data in the
file. If an access path does not synchronize with its data, the system rebuilds the access path to ensure
that the two are synchronized and usable.
When journaling access paths, the system records images of the access path in the journal to provide
known synchronization points between the access path and its data. By having that information in the
journal, the system recovers both the data files and the access paths. The system then synchronizes the
two. In such cases, you avoid the lengthy time to rebuild access paths.
In addition, other system recovery functions work with journaling access paths. For example, the system
has a number of options to reduce recovery time from the failure and replacement of a disk unit. These
options include user auxiliary storage pools and checksum protection. These options further reduce the
chances that the entire system must reload because of the disk failure. However, you might still need to
rebuild access paths when the system is started following replacement of the failed disk. By using access
path journaling and some of the recovery options, you reduce your chances of having to reload the entire
system and having to rebuild access paths.
238
Before journaling an access path, you must journal the physical files that are associated with the access
path. In addition, you must use the same journal for the access path and its associated physical files. It is
easy to start journaling access paths:
v You can use the system-managed access-path protection (SMAPP) facility.
v You can manage the journaling environment yourself with the Start Journal Access Path (STRJRNAP)
command.
To start journaling the access path for the specified file, use the STRJRNAP command. You can
journal access paths that have a maintenance attribute of immediate (*IMMED) or delayed (*DLY).
After you start journaling, the system protects the access path until the access path is deleted or
until you run the End Journal Access Path (ENDJRNAP) command for that access path.
Access path journaling minimizes additional output operations. For example, the system will write the
journal data for the changed record and the changed access path in the same output operation. However,
you should seriously consider isolating your journal receivers in user auxiliary storage pools when you
start journaling your access paths. Placing journal receivers in their own user auxiliary storage pool
provides the best journaling performance, while helping to protect them from a disk failure.
Related concepts
Journal management
Related reference
Start Journal Access Path (STRJRNAP) command
System-managed access-path protection:
System-managed access-path protection (SMAPP) provides automatic protection for access paths. With
SMAPP support, you do not have to use the journaling commands, such as the Start Journal Access Path
(STRJRNAP) command, to get the benefits of access path journaling.
SMAPP support recovers access paths after an abnormal system end rather than rebuilding them during
IPL. The shipped system automatically turns on SMAPP support. The system sets SMAPP support to a
value of 70 minutes.
The system determines which access paths to protect based on:
v Target access path recovery times provided by the user, or
v A system-provided default time.
You specify target access path recovery times as a system-wide value or on an auxiliary storage pool
(ASP) basis. Access paths already in a user-defined journal are ineligible for SMAPP protection because
they are already protected.
Related concepts
Journal management
Rebuilding access paths:
Rebuilding a database access path might take as much as one minute for every 10 000 records. But some
factors might affect the time estimate for rebuilding access paths.
The following factors affect the time estimate for rebuilding access paths:
v Storage pool size. You can improve the rebuild time by running the job in a larger storage pool.
v The system model. The speed of the processing unit is a key factor.
v Key length. A large key length slows rebuilding the access path because the access path constructs and
stores more key information.
v Select/omit values. Select/omit processing slows the rebuilding of an access path because the system
compares each record to see if it meets the select/omit values.
Database programming
239
v Record length. A large record length slows the rebuilding of an access path because the system looks at
more data.
v Storage device that contains the data. The relative speed of the storage device that contains the actual
data and the device that stores the access path affects the time needed to rebuild an access path.
v The order of the records in the file. The system tries to rebuild an access path so that it can find
information quickly when using that access path. The order of the records in a file has a small affect on
how fast the system builds the access path while trying to maintain an efficient access path.
Controlling when access paths are rebuilt:
If the system ends abnormally, it automatically lists the files that require access path recovery during the
next initial program load (IPL). You can control when access paths are rebuilt.
You can decide whether to rebuild the access path:
v During the IPL
v After the IPL
v When you first use the file.
You can also:
v Change the scheduling order in which the access paths are rebuilt
v Hold rebuilding of an access path indefinitely
v Continue the IPL process while access paths with a sequence value that is less than or equal to the *IPL
threshold value are rebuilding.
v Control the rebuilding of access paths after the system has completed the IPL process by using the Edit
Rebuild of Access Paths (EDTRBDAP) command.
The IPL threshold value determines which access paths to rebuild during the IPL. All access paths with a
sequence value that is less than or equal to the IPL threshold value rebuild during the IPL. Changing the
IPL threshold value to 99 means that all access paths with a sequence value of 1 through 99 rebuild
during the IPL. Changing the IPL threshold value to 0 means that no access paths rebuild until after the
system completes its IPL, except those access paths that were being journaled and those access paths for
system files.
The access path recovery value for a file is determined by the value you specified for the RECOVER
parameter on the create and change file commands. The default recovery value for *IPL (rebuild during
IPL) is 25 and the default value for AFTIPL (rebuild after IPL) is 75; therefore, RECOVER(*IPL) will show
as 25. The initial IPL threshold value is 50; this allows the parameters to affect when the access path is
rebuilt. You can override this value on the Edit Rebuild of Access Paths display.
If a file is not needed immediately after IPL time, specify that the file can be rebuilt at a later time. This
should reduce the number of access paths that need to be rebuilt at IPL, allowing the system to complete
its IPL much faster.
For example, you can specify that all files that must have their access paths rebuilt should rebuild the
access paths when the file is first used. In this case, no access paths are rebuilt at IPL. You can control the
order in which the access paths are rebuilt by running only those programs that use the files you want to
rebuild first. This method shortens the IPL time and can make the first of several applications available
faster. However, the overall time to rebuild access paths probably is longer. (Other work might be
running when the access paths are being rebuilt, and there might be less main storage available to rebuild
the access paths).
240
Related reference
Edit Rebuild of Access Paths (EDTRBDAP) command
Designing files to reduce access path rebuilding time:
File design can help reduce access path recovery time.
For example, you might divide a large master file into a history file and a transaction file. The system
uses the transaction file for adding new data. The system uses the history file for inquiry only. On a daily
basis, you might merge the transaction data into the history file, then clear the transaction file for the
next days data. With this design, you shorten the time to rebuild access paths.
However, if the system abnormally ended during the day, the access path to the smaller transaction file
might need to be rebuilt. Still, the access path to the large history file, being read-only for most of the
day, would rarely be unsynchronized with its data. Therefore, you reduce the chance of rebuilding this
access path.
Consider the trade-off between using a file design to reduce access path rebuilding time and using
system-supplied functions like access path journaling. The above file design might require a more
complex application design. After evaluating your situation, you might decide to use system-supplied
functions like journaling your access paths rather than design applications that are more complex.
Other methods to avoid rebuilding access paths:
If you do not journal access paths or use system-managed access-path protection (SMAPP), consider other
system functions that reduce the chances of rebuilding access paths.
The system uses a file synchronization indicator to determine if an access path needs to be rebuilt.
Normally, the synchronization indicator is on, indicating the synchronization of the access path and its
associated data. When a job changes a file that affects an access path, the system turns off the
synchronization indicator in the file. If the system ends abnormally, it must rebuild any access path
whose file has its synchronization indicator off.
You need to periodically synchronize the data with its access path to reduce the number of access paths
you must rebuild. There are several methods to synchronize a file with its access path:
v Full file close. The last full (that is, not shared) system-wide close performed against a file will
synchronize the access path and the data.
v Force access path. Specify the force-access-path (FRCACCPTH) parameter on the create, change, or
override database file commands.
v Force write ratio of 2 or greater. Specify the force-write-ratio (FRCRATIO) parameter on the create,
change, or override database file commands.
v Force end of data. Running the force-end-of-data operation in your program can synchronize the files
data and its access path. (Some high-level languages do not have a force-end-of-data operation. See
your high-level language topic collection for further details.)
Performing one of the methods mentioned previously synchronizes the access path and the data.
However, the next change to the data in the file can turn the synchronization indicator off again.
Note that each of the methods can be costly in terms of performance; therefore, use them with caution.
Consider journaling access paths along with saving access paths or using SMAPP as the primary means
of protecting access paths.
Database programming
241
Grant authority
Revoke authority
Start journal physical file
Start journal access path
End journal physical file
242
Related concepts
Journal management
Database file recovery after the IPL:
This recovery of database files runs after the initial program load (IPL) is completed. Interactive and
batch jobs can continue with the recovery.
The database file recovery after the IPL consists of the following actions:
v The access paths for immediate or delayed maintenance files that specify recovery after IPL are rebuilt.
v The system history log receives messages that indicate the success or failure of the rebuild operations.
v After IPL completion, use the Edit Rebuilt of Access Paths (EDTRBDAP) command to order the
rebuilding of access paths.
v After IPL completion, the Edit Check Pending Constraints (EDTCPCST) command displays a list of the
physical file constraints in check pending. This command specifies the verification sequence of the
check pending constraints.
Note: If you are not using journaling for a file, records might or might not exist after IPL recovery:
v For added records, if after the IPL recovery the Nth record added exists, then all records added
preceding N also exist.
v For updated and deleted records, if the update or delete operation on the Nth record is present
after the IPL recovery, there is no guarantee that the records updated or deleted prior to the Nth
record are also present in the database.
v For REUSEFLT(*YES), records added are treated as updates, and these records might not exist
after IPL recovery.
Related reference
Edit Rebuild of Access Paths (EDTRBDAP) command
Edit Check Pending Constraints (EDTCPCST) command
Effects of the storage pool paging option on database recovery:
The shared pool paging option controls whether the system dynamically adjusts the paging characteristics
of the storage pool for optimum performance.
v The system does not dynamically adjust paging characteristics for a paging option of *FIXED.
v The system dynamically adjusts paging characteristics for a paging option of *CALC.
v You can also control the paging characteristics through an application programming interface. For more
information, see Change Pool Tuning Information API (QWCCHGTN) in the Application programming
interfaces (APIs) topic.
A shared pool paging option other than *FIXED can have an impact on data loss for nonjournaled
physical files in a system failure. When you do not journal physical files, data loss from a system failure,
where memory is not saved, can increase for *CALC or USRDFN paging options. You can write file
changes to auxiliary storage less frequently for these options. There is a risk of data loss for nonjournaled
files with the *FIXED option, but the risk can be higher for *CALC or user-defined (USRDFN) paging
options. For more information about the paging option, see Automatically tune performance of the
Performance topic.
Database programming
243
Related concepts
Adjusting performance automatically
Application programming interfaces
Performance
Related reference
Change Pool Tuning Information (QWCCHGTN) API
Database file recovery options table:
The table outlines the recovery options for database files.
RECOVER parameter specified
Access path/ Maintenance
*NO
*AFTIPL
*IPL
v No database recovery at
IPL
v Not applicable; no
recovery is done for
rebuild maintenance
v Not applicable; no
recovery is done for
rebuild maintenance
v Not applicable; no
recovery is done for an
arrival sequence access
path
v Not applicable; no
recovery is done for an
arrival sequence access
path
v File available
immediately
v Access path rebuilt first
time file opened
v No database recovery at
IPL
v File available
immediately
244
v When you save an object to a save file, you can prevent the system from updating the date and time of
the save operation by specifying UPDHST(*NO) on the save command.
v When you restore an object, the system always updates the object description with the date and time of
the restore operation. Display the object description and other save/restore related information by
using the Display Object Description (DSPOBJD) command with DETAIL(*FULL).
v To display the objects in a save file, use the Display Save File (DSPSAVF) command.
v To display the objects on the media, specify DATA(SAVRST) on the Display Diskette (DSPDKT) or
Display Tape (DSPTAP) command.
v To display the last save/restore date for a database file, type: DSPFD FILE(file-name) TYPE(*MBR).
Also consider automatically writing records to auxiliary storage.
Database programming
245
When records are first placed in a source file, the date field is all zoned decimal zeros (unless DDS is
used with the DFT keyword specified). If you use SEU, the date field changes in a record when you
change the record. For more information about how to update source files, see the ADTS for AS/400:
Source Entry Utility manual, SC09-2605. This manual is available from the IBM Publications Center
a printed hardcopy that you can order or in an online format that you can download at no charge.
as
246
The following example is about copying a generic member name from one file to another. All members
starting with PAY are copied. If the corresponding members do not exist, they are added; if they do exist,
all records are replaced.
CPYSRCF FROMFILE(LIB1/QCLSRC) TOFILE(LIB2/QCLSRC) +
FROMMBR(PAY*)
The following example is about copying the member PAY1 to the printer file QSYSPRT (the default for
*PRINT). A format similar to the one used by service entry utility (SEU) is used to print the source
statements.
CPYSRCF FROMFILE(QCLSRC) TOFILE(*PRINT) FROMMBR(PAY1)
When you copy from a device source file to a database source file, sequence numbers are added and
dates are initialized to zeros. Sequence numbers start at 1.00 and are increased by 1.00. If the file being
copied has more than 9999 records, then the sequence number is wrapped back to 1.00 and continues to
be increased unless the SRCOPT and SRCSEQ parameters are specified.
When you are copying from a database source file to a device source file, the date and sequence number
fields are removed.
Loading and unloading data from systems other than System i:
You can use the Copy From Import File (CPYFRMIMPF) and Copy To Import File (CPYTOIMPF)
commands to import (load) or export (unload) data from and to systems other than System i.
To import database data from a system other than System i into an externally described DB2 for i
database file with the CPYFRMIMPF and CPYTOIMPF commands, follow these steps:
1. Create an import file for the data that you want to copy. The import file can be a database source file
or an externally-described database file that has 1 field. The field must have a data type of
CHARACTER, IGC OPEN, IGC EITHER, IGC ONLY, or UCS-2.
2. Send the data to the import file (or, the from file). The system performs any required
ASCII-to-EBCDIC conversion during this process. You can send the data in several ways:
Database programming
247
248
2. Give the source member the same name as the object to be created.
For example, to create the control language (CL) program PGMA using the command defaults, you can
type:
CRTCLPGM PGM(PGMA)
The system would expect the source for PGMA to be in the PGMA member in the QCLSRC source file.
The library containing the QCLSRC file would be determined by the library list.
As another example, the following Create Physical File (CRTPF) command creates the file DSTREF using
the database source file FRSOURCE. The source member is named DSTREF. Because the SRCMBR
parameter is not specified, the system assumes that the member name, DSTREF, is the same as the name
of the object being created.
CRTPF FILE (QGPL/DSTREF) SRCFILE(QGPL/FRSOURCE)
Related concepts
IBM-supplied source files on page 16
For your convenience, the i5/OS licensed program and other licensed programs provide a database
source file for each type of source.
Creating an object from source statements in a batch job:
If your create command is contained in a batch job, you can use an inline data file as the source file for
the command.
However, inline data files used as a source file should not exceed 10,000 records. The inline data file can
be either named or unnamed. Named inline data files have a unique file name that is specified on the
//DATA command. For more information about inline data files, see the Database file management topic.
Unnamed inline data files are files without unique file names; they are all named QINLINE. The
following is an example of an inline data file used as a source file:
//BCHJOB
CRTPF FILE(DSTPRODLB/ORD199) SRCFILE(QINLINE)
//DATA FILETYPE(*SRC)
.
. (source statements)
.
//
//ENDBCHJOB
In this example, no file name was specified on the //DATA command. An unnamed spooled file was
created when the job was processed by the spooling reader. The CRTPF command must specify QINLINE
as the source file name to access the unnamed file. The //DATA command also specifies that the inline
file is a source file (*SRC specified for the FILETYPE parameter).
If you specify a file name on the //DATA command, you must specify the same name on the SRCFILE
parameter on the CRTPF command. For example:
//BCHJOB
CRTPF FILE(DSTPRODLB/ORD199) SRCFILE(ORD199)
//DATA FILE(ORD199) FILETYPE(*SRC)
.
. (source statements)
.
//
//ENDBCHJOB
If a program uses an inline file, the system searches for the first inline file of the specified name. If that
file cannot be found, the program uses the first file that is unnamed (QINLINE).
Database programming
249
If you do not specify a source file name on a create command, an IBM-supplied source file is assumed to
contain the needed source data. For example, if you are creating a control language (CL) program but
you did not specify a source file name, the IBM-supplied source file QCLSRC is used. You must have
placed the source data in QCLSRC.
If a source file is a database file, you can specify a source member that contains the needed source data.
If you do not specify a source member, the source data must be in a member that has the same name as
the object being created.
Related concepts
Database file management
Determining which source file member was used to create an object:
When an object is created from source, the information about the source file, library, and member is held
in the object. The date and time when the source member was last changed before object creation is also
saved in the object.
The information in the object can be displayed with the Display Object Description (DSPOBJD) command
and specifying DETAIL(*SERVICE).
This information can help you in determining which source member was used and if the existing source
member was changed since the object was created.
You can also ensure that the source used to create an object is the same as the source that is currently in
the source member using the following commands:
v The Display File Description (DSPFD) command using TYPE(*MBR). This display shows both date and
time for the source member. The Last source update date/time value should be used to compare to
the Source file date/time value displayed from the DSPOBJD command.
v The Display Object Description (DSPOBJD) command using DETAIL(*SERVICE). This display shows
the date and time of the source member used to create the object.
Note: If you are using the data written to output files to determine if the source and object dates are the
same, then you can compare the ODSRCD (source date) and ODSRCT (source time) fields from the
output file of the DSPOBJD DETAIL(*SERVICE) command to the MBUPDD (member update date)
and MBUPDT (member update time) fields from the output file of the DSPFD TYPE(*MBR)
command.
Related reference
Display Object Description (DSPOBJD) command
Display File Description (DSPFD) command
250
If your source file is on a diskette, you can copy it to a database file, change it using SEU, and copy it
back to a diskette. If you do not use SEU, you must delete the old source file and create a new source
file.
If you change a source file, the object previously created from the source file does not match the current
source. The old object must be deleted and then created again using the changed source file. For example,
if you change the source file FRSOURCE created in the Creating an object using a source file on page
248, you must delete the file DSTREF that was created from the original source file, and create it again
using the new source file so that DSTREF matches the changed FRSOURCE source file.
Reorganizing source file member data:
You usually do not need to reorganize a source file member if it uses an arrival sequence access path. You
must specify several parameters to assign unique sequence numbers.
To assign unique sequence numbers to all the records, specify the following parameters on the
Reorganize Physical File Member (RGZPFM) command:
v KEYFILE(*NONE), so that the records are not reorganized
v SRCOPT(*SEQNBR), so that the sequence numbers are changed
v SRCSEQ with a fractional value such as .10 or .01, so that all the sequence numbers are unique
Note: Deleted records, if they exist, will be compressed out.
A source file with an arrival sequence access path can be reorganized by sequence number if a logical file
for which a keyed sequence access path is specified is created over the physical file.
Related reference
Reorganize Physical File Member (RGZPFM) command
Determining when a source statement was changed:
Each source record contains a date field that is automatically updated by the source entry utility (SEU) if
a change is made to the statement. You can use this date field to determine when a statement was last
changed.
Most high-level language compilers print these dates on the compiler lists. The Copy File (CPYF) and
Copy Source File (CPYSRCF) commands also print these dates.
Each source member description contains two date and time fields. The first date/time field reflects
changes to the member any time it is closed after being updated.
The second date/time field reflects any changes to the member. This includes all changes caused by SEU,
commands (such as CRYF and CPYSRCF), authorization changes, and changes to the file status. For
example, the FRCRATIO parameter on the Change Physical File (CHGPF) command changes the member
status. This date/time field is used by the Save Changed Objects (SAVCHGOBJ) command to determine
if the member should be saved. Both date/time fields can be displayed with the Display File Description
(DSPFD) command specifying TYPE(*MBR). There are two changed date/times shown with source
members:
v Last source update date/time. This value reflects any change to the source data records in the
member. When a source update occurs, the Last change date/time value is also updated, although
there might be a 1- or 2-second difference in that date/time value.
v Last change date/time. This value reflects any changes to the member. This includes all changes
caused by SEU, commands (such as CPYF and CPYSRCF), authorization changes, or changes to file
status. For example, the FRCRATIO parameter on the CHGPF command changes the member status,
and therefore, is reflected in the Last change date/time value.
Database programming
251
252
|
|
The referential constraints, whether they are participating as a parent or a dependent, and whether
the constraints are defined or established.
v Constraint names must be unique in a library.
v Constraints cannot be added to files in the QTEMP library.
v Referential constraints must have the parent and dependent file in the same auxiliary storage pool
(ASP).
Related concepts
DB2 for i5/OS SQL reference
SQL programming
Getting started with System i Navigator
Related reference
Add Physical File Constraint (ADDPFCST) command
CREATE TABLE
ALTER TABLE
Database programming
253
Related concepts
DB2 for i5/OS SQL reference
Getting started with System i Navigator
SQL programming
Related reference
Remove Physical File Constraint (RMVPFCST) command
Opt
_
_
_
_
_
_
_
_
_
Constraint
File
DEPTCST
EMPDIV7
ACCTCST
EMPDIV7
STAT84
EMPDIV7
FENSTER
REVSCHED
IRSSTAT3
REVSCHED
IFRNUMBERO > REVSCHED
EVALDATE
QUOTOSCHEM
STKOPT
CANSCRONN9
CHKDEPT
EMPDIV2
Library
EPPROD
EPPROD
EPPROD
EPPROD
EPPROD
EPPROD
EPPROD
EPPROD
EPPROD
Type
*REFCST
*REFCST
*REFCST
*REFCST
*UNQCST
*UNQCST
*REFCST
*PRIKEY
*CHKCST
State
EST/ENB
EST/ENB
DEF/ENB
EST/DSB
Check
Pending
No
Yes
No
Yes
EST/ENB
No
EST/ENB
No
The display lists the constraint names, the file name, and the library name. In addition, the following
information is displayed:
v The Type column identifies the constraint as referential, check, unique, or primary key.
v The State column indicates whether the constraint is defined or established and whether it is enabled
or disabled. The State column only applies to referential and check constraints.
v The Check Pending column contains the check pending status of the constraint. Unique and primary
key constraints do not have a state because they are always established and enabled.
For each of the listed constraints, you can perform the following actions:
v To change a referential or check constraint to any of its permissible states, select Change (option 2). For
example, you can enable a constraint that is currently disabled. This option performs the same
functions as the Change Physical File Constraint (CHGPFCST) command.
v To remove a constraint, select Remove (option 4). This option performs the same functions as the
Remove Physical File Constraint (RMVPFCST) command.
254
v To display the records that are in check pending state, select Display (option 6). This option performs
the same functions as the Display Check Pending Constraint (DSPCPCST) command. The DSPCPCST
command applies only to referential and check constraints.
Working with constraints that are in check pending status:
When you add a referential or check constraint to a physical file, the system automatically checks all the
records in the file to ensure that they meet the constraint definition. If the constraint is not valid or if it
cannot be verified, the system places it in check pending status.
This check is also performed when the system is being restored.
To work with the constraints that are in check pending status, follow these steps:
1. Make the constraint inactive by running the Change Physical File Constraint (CHGPFCST) command
and specifying *DISABLED on the Constraint state parameter.
2. Display the list of records that caused the constraint to be marked as check pending by running the
Display Check Pending Constraints (DSPCPCST) command.
Note: The length of time that this command runs depends on the number of records the file contains.
3. Schedule the verification of the constraints that are in check pending status by running the Edit Check
Pending Constraints (EDTCPCST) command.
4. Make the constraint active by running the CHGPFCST command again and specify *ENABLED on the
Constraint state parameter.
Related reference
Change Physical File Constraint (CHGPFCST) command
Display Check Pending Constraint (DSPCPCST) command
Edit Check Pending Constraints (EDTCPCST) command
Displaying records that put a constraint in check pending status:
You can use the Display Check Pending Constraint (DSPCPCST) command to display the records that put
a constraint in check pending status.
It is often useful to examine the records that do not conform to the rules of your constraint. You can then
change either the record or the constraint as necessary.
Note: Before you perform the following step, you should run the Change Physical File Constraint
(CHGPFCST) command to disable the constraint.
To display or print the list of records that have caused a constraint to be placed in check pending status,
run the DSPCPCST command.
Related reference
Display Check Pending Constraint (DSPCPCST) command
Change Physical File Constraint (CHGPFCST) command
Processing constraints that are in check pending status:
It might take a long time for the system to validate constraints that are created for large files. You can list
the constraints that are in check pending status and schedule them for verification as required.
To display and edit the list of constraints that are in check pending status, follow these steps:
1. Run the Edit Check Pending Constraints (EDTCPCST) command.
2. Check the status of the constraint you want to process.
Database programming
255
3. If the constraint is in a status other than RUN or READY, change the *HLD value in the Seq field to a
value between 1 and 99.
4. Press Enter.
Edit Check Pending Constraints
Type sequence, press Enter.
Sequence:
1-99, *HLD
Seq
1
1
*HLD
*HLD
*HLD
*HLD
Status
RUN
READY
CHKPND
CHKPND
CHKPND
CHKPND
------------Constraints----------Cst
File
Library
EMP1
DEP
EPPROD
CONST
>
DEP
EPPROD
FORTH
>
STYBAK
EPPROD
CST88
STYBAK
EPPROD
CS317
STYBAK
EPPROD
KSTAN
STYBAK
EPPROD
Verify
Elapsed
Time
Time
00:01:00 00:00:50
00:02:00 00:00:00
00:03:00 00:00:00
00:10:00 00:00:00
00:20:00 00:00:00
02:30:00 00:00:00
Bottom
F3=Exit F5=Refresh F12=Cancel F13=Repeat all F15=Sort by
F16=Repeat position to F17=Position to F22=Display constraint name
Unique constraints
Unique constraints act as controls in a database to ensure that rows are unique.
For example, you can specify a customer identification number as a unique constraint in your database. If
anyone attempts to create a new customer with the same customer number, an error message is sent to
the database administrator.
Unique constraints identify a field or set of fields in a database file whose values must be unique across
records in the file. The field must be in ascending order, and can be null-capable.
256
A file can have multiple unique constraints, but you cannot duplicate unique constraints. The same key
fields, regardless of order, constitute a duplicate constraint.
A unique constraint can be used as the parent key when adding a referential constraint.
Check constraints
You use check constraints to maintain limits on field values so that they conform to your database
requirements.
Check constraints ensure data validity during insert or update operations by checking the data against a
check constraint expression that you define.
For example, you can create a check constraint on a field and define that the values that are inserted into
the field must be between 1 and 100. If a value does not fall within the range, the insert or update
operation against your database is not processed.
Check constraints are much like referential constraints in terms of their states:
v Defined and enabled. The constraint definition has been added to the file, and the constraint will be
enforced after the constraint is established.
v Defined and disabled . The constraint definition has been added to the file, but the constraint will not
be enforced.
v Established and enabled. The constraint has been added to the file and all of the pieces of the file are
there for enforcement.
v Established and disabled. The constraint has been added to the file and all of the pieces of the file are
there for enforcement, but the constraint will not be enforced.
A check constraint, like a referential constraint, can have a check pending status. If the data in any field
violates the check constraint expression, then the constraint is in check pending status. For the insertion
or update of a record, if the data violates the check constraint expression, then the insert or update
operation is not allowed.
A check constraint that contains one or more Large Object (LOB) fields is restricted to a narrower range
of operations than a check constraint without LOB fields. When the check constraint includes one or
more LOB fields, the LOB fields can only be involved in direct comparisons to:
v Other LOB fields of the same type and same maximum length.
v Literal values.
v The null value.
Operations known as derived operations, such as the Substring or Concat operations, are not allowed
against LOB fields in a check constraint. The diagnostic message CPD32E6 will be sent when you try to
add a check constraint that attempts a derived operation against a LOB field.
Database programming
257
258
If a primary key constraint already exists for the file, the ADDPFCST command with TYPE(*PRIKEY)
will fail because a file can have only one primary key. If you want a different primary key constraint,
you must first remove the existing primary key constraint with the Remove Physical File Constraint
(RMVPFCST) command. Then you can add a new primary key constraint.
v You can add a unique constraint to a file with the ADDPFCST command. Specify *UNQCST for the
TYPE parameter. You must also specify the key field or fields with the KEY parameter. You can also
add a unique constraint with the Structured Query Language (SQL) ALTER TABLE statement.
If the parent file does not have a primary key or unique constraint that can be used as the parent key,
the system will attempt to automatically add a primary key constraint when adding a referential
constraint.
If the parent file has a uniquely keyed access path, where the access path fields match the foreign keys
fields (both for the number of fields and matching attributes), then a primary key constraint will be
implicitly added to the parent file. This will become the parent key for the referential constraint.
If the parent file is arrival sequence access path, then if the fields specified for the parent key match the
foreign keys fields (matching attributes), then a primary key constraint will be implicitly added to the
parent file. This will become the parent key for the referential constraint.
What to do when you cannot define a parent key
For an existing file with a primary key or unique constraint, if neither constraint will suffice as the parent
key, there are options you can turn to.
You can take either of the following actions when you cannot define a parent key.
v Delete the file and create it again with the appropriate keys.
v Add a unique or primary key constraint to the created file.
Related reference
Create Physical File (CRTPF) command
Add Physical File Constraint (ADDPFCST) command
Remove Physical File Constraint (RMVPFCST) command
Defining the dependent file in a referential constraint:
A dependent file must be a physical file with a maximum of one member. You can either create a
dependent file as you do any physical file or use an existing file as the dependent file.
The dependent file does not require a keyed access path when you create the actual constraint. If no
existing access paths meet the foreign key criteria, the system adds an access path to the file.
Specifying referential constraint rules:
Referential constraints allow you to specify the rules that you want the system to enforce when you
delete or update records.
To specify the rules that you want to enforce with referential constraints, follow these steps:
1. Run the Add Physical File Constraint (ADDPFCST) command.
2. Specify the rule that you want to enforce when you delete records (the delete rule) by choosing a value
for the DLTRULE parameter.
3. Specify the rule that you want to enforce when you update records (the update rule) by choosing a
value for the UPDRULE parameter.
You can also add referential constraints using System i Navigator.
Database programming
259
Related concepts
Getting started with System i Navigator
SQL programming
Related reference
Add Physical File Constraint (ADDPFCST) command
Details: Specifying referential constraint delete rules:
You can specify one of these values for the DLTRULE parameter. The delete rule specifies the action that
the system takes when you delete a parent key value. The delete rule does not affect null parent key
values.
v *NOACTION (the default value)
Record deletion in a parent file will not occur if the parent key value has a matching foreign key
value.
v *CASCADE
Record deletion in a parent file causes records in the dependent file to be deleted when the parent
key value matches the foreign key value.
v *SETNULL
Record deletion in a parent file updates those records in the dependent file where the value of the
parent non-null key matches the foreign key value. For those dependent records that meet the
preceding criteria, all null-capable fields in the foreign key are set to null. Foreign key fields with
the non-null attribute are not updated.
v *SETDFT
Record deletion in a parent file updates those records in the dependent file where the value of the
parent non-null key matches the foreign key value. For those dependent records that meet the
preceding criteria, the foreign key field or fields are set to their corresponding default values.
v *RESTRICT
Record deletion in a parent file will not occur if the parent key value has a matching foreign key
value.
Note: The system enforces a delete *RESTRICT rule immediately when the deletion is attempted. The
system enforces other constraints at the logical end of the operation. The operation, in the case
of other constraints, includes any trigger programs that are run before or after the delete
operation. It is possible for a trigger program to correct a potential referential integrity violation.
For example, a trigger program can add a parent record if one does not exist. The *RESTRICT
rule does not prevent the violation.
Details: Specifying referential constraint update rules:
You can specify one of these values for the UPDRULE parameter. The UPDRULE parameter identifies the
update rule for the constraint relationship between parent and dependent files. The update rule specifies
the action that the system takes when you update the parent file.
v *NOACTION (the default value)
Record update in a parent file does not occur if there is a matching foreign key value in the
dependent file.
v *RESTRICT
Record update in a parent file does not occur if a value of the non-null parent key matches a foreign
key value.
260
Note: The system enforces an update *RESTRICT rule immediately when you attempt the update
operation. The system enforces other constraints at the logical end of the operation. For example,
a trigger program can add a parent record if one does not exist. The *RESTRICT rule does not
prevent the violation.
Details: Specifying referential constraint rulesjournaling requirements:
If you perform insert, update, or delete operations on a file that is associated with a referential constraint,
and the delete rule, update rule, or both are other than *RESTRICT, you must use journaling.
You must journal both the parent and the dependent files to the same journal. In addition, you are
responsible for starting the journaling for the parent and dependent files.
You can start the journaling for the parent and dependent files with the Start Journal Physical File
(STRJRNPF) command.
If you are inserting, updating, or deleting records to a file associated with a referential constraint that has
a delete rule, update rule, or both rules, other than *RESTRICT, commitment control is required. If you
have not started commitment control, the system starts and ends the commit cycle automatically for you.
Related reference
Start Journal Physical File (STRJRNPF) command
Details: Adding referential constraints:
Consider these limitations when adding referential constraints.
v
v
v
v
|
|
|
|
|
v You can define a constraint when both or either of the dependent and the parent files have zero
members. A constraint cannot be established unless both files have a member.
v A file can have a maximum of one primary key, but might have many unique constraints.
v There is a maximum of 5000 constraint relations per file. This maximum value is the sum of:
The referential constraints whether participating as a parent or a dependent, and whether the
constraints are defined or established.
The unique constraints, which includes the primary key constraint.
The check constraints.
v Only externally described files are allowed in referential constraints. Source files are not allowed.
Program described files are not allowed.
v Files with insert, update, or delete capabilities are not allowed in *RESTRICT relationships.
v Constraint names must be unique in a library.
v You cannot add constraints to files in the QTEMP library.
v You cannot add a referential constraint where the parent file is in one ASP and the dependent file is in
a different ASP.
Details: Avoiding constraint cycles:
A constraint cycle is a sequence of constraint relationships in which a descendent of a parent file becomes
a parent to the original parent file. You can use constraint cycles in a DB2 for i database; however, you
should avoid using them.
Database programming
261
262
relationship is disabled. Specify a lock state of Exclusive read (*EXCLRD) on the command so other users
can read the files. After the constraint is enabled again, the Deallocate Object (DLCOBJ) command
unlocks the files.
When you enable or disable multiple constraints, they are processed sequentially. If a constraint cannot be
modified, you receive a diagnostic message, and the function proceeds to the next constraint in the list.
When all constraints have been processed, you receive a completion message listing the number of
constraints modified.
Related concepts
Getting started with System i Navigator
SQL programming
Related reference
Change Physical File Constraint (CHGPFCST) command
Allocate Object (ALCOBJ) command
Deallocate Object (DLCOBJ) command
263
You can specify the type of constraint that you want to remove by using the TYPE parameter.
With the TYPE parameter, you can specify the type of constraint that you want to remove.
v All types: TYPE(*ALL)
All constraints for CST(*ALL)
All constraints in check pending for CST(*CHKPND)
The named constraint for CST(constraint-name)
v Referential constraints: TYPE(*REFCST)
All referential constraints for CST(*ALL)
All referential constraints in check pending for CST(*CHKPND)
The named referential constraint for CST(constraint-name)
v Unique constraints: TYPE(*UNQCST)
All unique constraints except the primary key constraint for CST(*ALL)
Not applicable for CST(*CHKPND)a unique constraint cannot be in check pending
The named unique constraint for CST(constraint-name)
v Primary key constraints: TYPE(*PRIKEY)
The primary constraint for CST(*ALL)
Not applicable for CST(*CHKPND)the primary constraint cannot be in check pending
The named primary constraint for CST(constraint-name)
v Check constraints: TYPE(*CHKCST)
All check constraints for CST(*ALL)
All check constraints in check pending for CST(*CHKPND)
The named check constraint for CST(constraint-name)
264
parent file with parent key department.DEPTNO. Because there is either a primary key constraint or a
unique constraint with the DEPTNO field as the key, the constraint will serve as the parent key
associated with the referential constraint.
The referential constraint has update and delete rules that must be followed for record insert, update, and
delete operations on the parent or the dependent file.
Database programming
265
The database enforces constraint rules for all I/O requests whether from application programs or system
commands (such as the Initialize Physical File Member (INZPFM) command) or SQL statements or file
I/O utilities (such as STRSEU).
Foreign key enforcement:
The rules that you specify for a referential constraint apply to parent key changes. The database enforces
a no-action rule on the insert and update operations on the foreign key to ensure that the value of every
non-null foreign key matches the value of the parent key.
The system returns a referential constraint violation if a matching parent key does not exist for the new
foreign key value, and does not insert or update the dependent record.
Parent key enforcement:
The rules that you specify for a referential constraint determine how the database processes the delete
and update operations on the parent key. The system enforces the unique attribute of a parent key on all
parent file I/O.
Enforcement of delete rules:
When you delete a record from a parent file, the system checks the dependent file for any dependent
records (matching non-null foreign key values). If the system finds any dependent records, the delete rule
determines the action to be taken.
v No Action. If the system finds any dependent records, it returns a constraint violation and does not
delete records.
v Cascade. The system deletes dependent records that its finds in the dependent file.
v Set Null. The system sets null-capable fields in the foreign key to null in every dependent record that
it finds.
v Set Default. The system sets all fields of the foreign key to their default value when it deletes the
matching parent key.
v Restrict. Same as no action except that enforcement is immediate.
If part of the delete rule enforcement fails, the entire delete operation fails and all associated changes are
rolled back. For example, a delete cascade rule causes the database to delete ten dependent records, but a
system failure occurs while deleting the last record. The database will not allow deletion of the parent
key record, and the deleted dependent records are re-inserted.
If a referential constraint enforcement causes a change to a record, the associated journal entry will have
an indicator value noting that a referential constraint caused the record change. For example, a dependent
record that is deleted by a delete cascade rule will have a journal entry indicator which indicates that the
record change was generated during referential constraint enforcement.
Enforcement of update rules:
When the system updates a parent key in a parent file, it checks for any dependent records (matching
non-null foreign values) in the dependent file. If the system finds any dependent records, the update rule
for the constraint relationship determines the action to be taken.
v No Action. If the system finds any dependent records, it returns a constraint violation, does not update
any records.
v Restrict. The system performs the same as above, but enforcement is immediate.
Constraint states
A file can be in several constraint states.
266
v Non-constraint relationship state. No referential constraint exists for a file in this state. If a constraint
relationship once existed for the file, all information about it has been removed.
v Defined state. A constraint relationship is defined between a dependent and a parent file. It is not
necessary to create the member in either file to define a constraint relationship. In the defined state, the
constraint can be:
Defined and enabled. A defined and enabled constraint relationship is for definition purposes only.
The rules for the constraint are not enforced. A constraint in this state remains enabled when it goes
to the established state.
Defined and disabled. A defined constraint relationship that is disabled is for definition purposes
only. The rules for the constraint are not enforced. A constraint in this state remains disabled when it
goes to the established state.
v Established state. The dependent file has a constraint relationship with the parent file. A constraint
will be established only if the attributes match between the foreign and parent key. Members must
exist for both files. In the established state, the constraint can be:
Established and enabled. An established constraint relationship that is enabled causes the database
to enforce referential integrity.
Established and disabled. An established constraint relationship that is disabled directs the database
to not enforce referential integrity.
267
allows any I/O operations. The system does not allow records to be read from such a file because the
user or application might not be aware of the check pending status and the constraint violation.
To perform I/O operations on a dependent file with an enabled referential constraint in check pending,
you can first disable the constraint and then perform the I/O operations that you want.
Parent file restrictions in check pending:
These restrictions apply to a parent file that has an established and enabled referential constraint in check
pending.
You can open the parent file of a constraint relationship that the system marks as check pending, but you
are limited in the types of input/output (I/O) operations that you can do. You can read and insert
records, but you cannot delete or update records.
To perform update and delete operations on a parent file with an enabled referential constraint in check
pending, you can first disable the constraint and then perform the I/O operations that you want.
268
- If the parent and dependent files are in different libraries, then the referential constraint
relationship of the duplicated dependent file will be established with the original parent file
Copy File (CPYF)
When the CPYF command creates a new file and the original file has constraints, the constraints are
not copied to the new file.
Move Object (MOVOBJ)
The MOVOBJ command moves a file from one library to another. The system attempts to establish any
defined referential constraints that can exist for the file in the new library.
Rename Object (RNMOBJ)
The RNMOBJ command renames a file within the same library or renames a library.
An attempt is made to establish any defined referential constraints that can exist for the renamed file
or library.
Delete File (DLTF)
The DLTF command has an optional keyword that specifies how referential constraint relationships are
handled. The RMVCST keyword applies to the dependent file in a constraint relationship. The
keyword specifies how much of the constraint relationship of the dependent file is removed when the
parent file is deleted:
*RESTRICT
If a constraint relationship is defined or established between a parent file and dependent file, the
parent file is not deleted and the constraint relationship is not removed. This is the default value.
*REMOVE
The parent file is deleted, and the constraint relationship and definition are removed. The
constraint relationship between the parent file and the dependent file is removed. The dependent
files corresponding foreign key access path or paths, as well as the constraint definition, are
removed.
*KEEP
The parent file is deleted, and the referential constraint relationship definition is left in the defined
state. The dependent files corresponding foreign key access path and constraint definition are not
removed.
v Remove Physical File Member (RMVM)
When the member of a parent file in a constraint relationship is removed, the constraint relationship is
put in the defined state. The foreign key access path and referential constraint definition are not
removed. The parent key access path is removed because the parent member was removed; the parent
constraint definition remains at the file level.
When the member of a dependent file in a constraint relationship is removed, the constraint
relationship is put in the defined state. The parent key access path and constraint definition are not
removed. The foreign key access path is removed because the dependent member was removed; the
referential constraint definition is not removed.
v Save and restore commands
If the parent file is restored to a library, the system uses the system cross reference files to locate the
dependent file of a defined referential constraint. An attempt is made to establish the constraint
relationship.
If the dependent file is restored, the TOLIB is used to determine constraint relationships:
If both the parent and dependent files are in the same library, the referential constraint relationship
is established with the parent file in the TOLIB.
If the parent and dependent files are in different libraries, the referential constraint relationship of
the duplicated dependent file is established with the original parent file.
The order of the restore of dependent and parent files within a constraint relationship does not matter
(parent restored before dependent or dependent restored before parent). The constraint relationship
will eventually be established.
Database programming
269
Generate a unique value for a newly inserted row on a different file (surrogate function)
Write to other files for audit trail purposes
Query from other files for cross-referencing purposes
Access system functions (for example, print an exception message when a rule is violated)
Replicate data to different files to achieve data consistency
270
v System i Navigator.
v The CREATE TRIGGER SQL statement.
Related reference
Add Physical File Trigger (ADDPFTRG) command
CREATE TRIGGER
Adding triggers using System i Navigator:
Using System i Navigator, you can define system triggers and SQL triggers. Additionally, you can enable
or disable a trigger on a physical database file.
A trigger is a set of actions that run automatically when a specified change operation is performed on a
specified database file. In this discussion, a table is a physical file. The change or read operation can be
an insert, update, or delete high-level language statement in an application program, or an SQL INSERT,
UPDATE, or DELETE statement.
To
1.
2.
3.
4.
5. Right-click the table to which you want to add the trigger, and select New Trigger. Click External to
add a system trigger or SQL to add an SQL trigger.
Related concepts
Triggering automatic events in your database on page 270
A trigger is a set of actions that run automatically when a specified change or read operation is performed
on a specified database file. You can define a set of trigger actions in any high-level language that is
supported on the i5/OS operating system.
SQL triggers
How trigger programs work:
When a user or an application issues a change or read operation on a database file that has an associated
trigger, the operation calls the appropriate trigger program or programs.
The change or read operation passes two parameters to the trigger program, as described in the following
table.
Parameter
Description
Input or output
Type
Input
CHAR(*)
Input
BINARY(4)
From these inputs, the trigger program can refer to a copy of the original or the new records. You must
code the trigger program so that it accepts these parameters.
Related concepts
Trigger buffer sections on page 280
The trigger buffer has two logical sections: a static section and a variable section.
Other important information about working with trigger programs:
Database programming
271
Here are the recommendations, precautions, and error messages for trigger programs. Information about
monitoring and commitment control is also included.
Recommendations for trigger programs:
Consider these recommendations when you create a trigger program.
v Create the trigger program so that it runs under the user profile of the user who created it. In this way,
users who do not have the same level of authority to the program will not encounter errors.
v Create the program with USRPRF(*OWNER) and *EXCLUDE public authority, and do not grant
authorities to the trigger program to USER(*PUBLIC). Avoid having the trigger program altered or
replaced by other users. The database calls the trigger program even if the user causing the trigger
program to run does not have authority to the trigger program.
v Create the program as ACTGRP(*CALLER) if the program is running in an Integrated Language
Environment (ILE). This allows the trigger program to run under the same commitment definition as
the application.
v Open the file with a commit lock level the same as the applications commit lock level. This allows the
trigger program to run under the same commit lock level as the application.
v Create the program in the physical files library.
v Use commit or rollback in the trigger program if the trigger program runs under a different activation
group than the application.
v Signal an exception if an error occurs or is detected in the trigger program. If an error message is not
signalled from the trigger program, the database assumes that the trigger ran successfully. This might
cause the user data to end up in an inconsistent state.
Precautions to take when coding trigger programs:
Trigger programs can be powerful. But you must take caution when coding trigger programs.
Be careful when designing trigger programs that access a system resource, such as a tape drive. For
instance, a trigger program that copies record changes to tape media can be useful, but the program itself
cannot detect if the tape drive is ready or if it contains the correct tape. You must take these kinds of
resource issues into considerations when designing trigger programs.
|
|
|
|
In addition, use read triggers with extreme caution. Using a read trigger causes a trigger to be called for
every record that is read and may be called for records that are positioned to but not read. During a
query, this means that triggers can be called many times as records are processed multiple times by the
query. This can effect system performance.
Functions to use with care in trigger programs:
Some control language (CL) commands and functions are not recommended in a trigger program and
need to be carefully considered if they are to be used.
These CL commands and functions are:
v
v
v
v
v
v
v
v
272
273
1. If the change operation is not running under commitment control, the system always
protects the change operation. However, the system does not monitor updating the same
record within the trigger program.
2. The ALWREPCHG(*NO|YES) parameter of the Add Physical File Trigger (ADDPFTRG)
command controls repeated changes under commitment control. Changing from the default
value to ALWREPCHG(*YES) allows the same record or updated record associated with the
trigger program to repeatedly change.
v The Allow Repeated Change ALWREPCHG(*YES) parameter on the Add Physical File Trigger
(ADDPFTRG) command also affects trigger programs defined to be called before insert and update
database operations. If the trigger program updates the new record in the trigger buffer and
ALWREPCHG(*YES) is specified, the actual insert or update operation on the associated physical file
uses the modified new record image. This option can be helpful in trigger programs that are designed
for data validation and data correction. Because the trigger program receives physical file record
images (even for logical files), it can change any field of that record image.
v The trigger program is called for each row that is changed in or read from the physical file.
v If the physical file or the dependent logical file is opened for insert SEQONLY(*YES) processing, and
the physical file has an insert trigger program associated with it, the system changes the open to
SEQONLY(*NO) so it can call the trigger program for each row that is inserted.
Monitoring the use of trigger programs:
DB2 for i provides the capability to associate trigger programs with database files. Trigger-program
capability is common across the industry for high-function database managers.
When you associate a trigger program with a database file, you specify when the trigger program runs.
For example, you can set up the customer order file to run a trigger program whenever a new record is
added to the file. When the customers outstanding balance exceeds the credit limit, the trigger program
can print a warning letter to the customer and send a message to the credit manager.
Trigger programs are a productive way both to provide application functions and to manage information.
Trigger programs also provide the ability for someone with devious intentions to create a Trojan horse
on your system. A destructive program can be sitting and waiting to run when a certain event occurs in a
database file on your system.
Note: In history, the Trojan horse was a large hollow wooden horse that was filled with Greek soldiers.
After the horse was introduced within the walls of Troy, the soldiers climbed out of the horse and
fought the Trojans. In the computer world, a program that hides destructive functions is often
called a Trojan horse.
When your system ships, the ability to add a trigger program to a database file is restricted. If you are
managing object authority carefully, the typical user will not have sufficient authority to add a trigger
program to a database file. (Appendix D in the Security Reference book tells the authority that is required
or all commands, including the Add Physical File Trigger (ADDPFTRG) command.
You can use the Print Trigger Programs (PRTTRGPGM) command to print a list of all the trigger
programs in a specific library or in all libraries. The following example shows the report:
Trigger Programs (Full Report)
Specified library
Library
CUSTLIB
CUSTLIB
274
. . . . . . :
CUSTLIB
Trigger
File
Library
MB106
ARPGMLIB
MB107
ARPGMLIB
Trigger
Program
INITADDR
INITNAME
Trigger
Time
Before
Before
Trigger
Event
Update
Update
Trigger
Condition
Always
Always
You can use the initial report as a base to evaluate any trigger programs that already exist on your
system. Then, you can print the changed report regularly to see whether new trigger programs have been
added to your system.
When you evaluate trigger programs, consider the following questions:
v Who created the trigger program? You can use the Display Object Description (DSPOBJD) command to
determine this.
v What does the program do? You will have to look at the source program or talk to the program creator
to determine this. For example, does the trigger program check to see who the user is? Perhaps the
trigger program is waiting for a particular user (QSECOFR) in order to gain access to system resources.
After you have established a base of information, you can print the changed report regularly to monitor
new trigger programs that have been added to your system. The following example shows the changed
report:
Trigger Programs (Changed Report)
Specified library . . . . . . :
LIBX
Last changed report . . . . . :
07/01/21
Trigger
Library
File
Library
INVLIB
MB108
INVPGM
INVLIB
MB110
INVPGM
14:33:37
Trigger
Program
NEWPRICE
NEWDSCNT
Trigger
Time
After
After
Trigger
Event
Delete
Delete
Trigger
Condition
Always
Always
275
v The activation group ends. In the normal case, an implicit commit is performed when the activation
group ends. However, if an abnormal system failure occurs, a rollback is performed.
Trigger program error messages:
If a failure occurs when the trigger program is running, the program must signal an appropriate escape
message before exiting. Otherwise, the application assumes that the trigger program ran successfully.
The message can be the original message that is signalled from the system or a message that is created by
the trigger program creator.
Example: Trigger program:
This example shows an external trigger program that is written in ILE C with embedded SQL.
For more trigger program examples, see the IBM Redbooks publication Stored Procedures, Triggers, and
User-Defined Functions on DB2 Universal Database for iSeries
Note: By using the code examples, you agree to the terms of the Code license and disclaimer
information on page 293.
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#include <recio.h>
#include <xxcvt.h>
#include "qsysinc/h/trgbuf"
/* Trigger input parameter
*/
#include "lib1/csrc/msghand1"
/* User defined message handler
*/
/*********************************************************************/
/* This is a trigger program which is called whenever there is an
*/
/* update to the EMPLOYEE table. If the employee's commission is
*/
/* greater than the maximum commission, this trigger program will
*/
/* increase the employee's salary by 1.04 percent and insert into
*/
/* the RAISE table.
*/
/*
*/
/* The EMPLOYEE record information is passed from the input parameter*/
/* to this trigger program.
*/
/*********************************************************************/
Qdb_Trigger_Buffer_t *hstruct;
char *datapt;
/*******************************************************/
/* Structure of the EMPLOYEE record which is used to
*/
/* store the old or the new record that is passed to
*/
/* this trigger program.
*/
/*
*/
/* Note : You must ensure that all the numeric fields */
/*
are aligned at 4 byte boundary in C.
*/
/*
Used either Packed struct or filler to reach */
/*
the byte boundary alignment.
*/
/*******************************************************/
_Packed struct rec{
char empn[6];
_Packed struct { short fstlen ;
char fstnam[12];
} fstname;
char minit[1];
_Packed struct { short lstlen;
char lstnam[15];
} lstname;
char dept[3];
276
char phone[4];
char hdate[10];
char jobn[8];
short edclvl;
char sex1[1];
char bdate[10];
decimal(9,2) salary1;
decimal(9,2) bonus1;
decimal(9,2) comm1;
} oldbuf, newbuf;
EXEC SQL INCLUDE SQLCA;
main(int argc, char **argv)
{
int i;
int obufoff;
/*
int nuloff;
/*
int nbufoff;
/*
int nul2off;
/*
short work_days = 253;
/*
decimal(9,2) commission = 2000.00; /*
decimal(9,2) percentage = 1.04;
/*
char raise_date[12] = "1982-06-01";/*
*/
*/
*/
*/
*/
*/
*/
*/
struct {
char empno[6];
char name[30];
decimal(9,2) salary;
decimal(9,2) new_salary;
} rpt1;
/*******************************************************/
/* Start to monitor any exception.
*/
/*******************************************************/
_FEEDBACK fc;
_HDLR_ENTRY hdlr = main_handler;
/****************************************/
/* Make the exception handler active.
*/
/****************************************/
CEEHDLR(&hdlr, NULL, &fc);
/****************************************/
/* Ensure exception handler OK
*/
/****************************************/
if (fc.MsgNo != CEE0000)
{
printf("Failed to register exception handler.\n");
exit(99);
};
/*******************************************************/
/* Move the data from the trigger buffer to the local */
/* structure for reference.
*/
/*******************************************************/
hstruct = (Qdb_Trigger_Buffer_t *)argv[1];
datapt = (char *) hstruct;
obufoff = hstruct ->Old_Record_Offset;
/* old buffer
memcpy(&oldbuf,datapt+obufoff,; hstruct->Old_Record_Len);
*/
*/
GO TO ERR_EXIT;
/*******************************************************/
Database programming
277
278
/*
/*
/*
/*
Message identifier
Qualified message file name
Message data or text
Length of message data or text
*/
*/
*/
*/
char *,
char *,
int,
void *,
void *,
...);
/*
/*
/*
/*
/*
/*
Message type
*/
Call message queue
*/
Call stack counter
*/
Message key
*/
Error code
*/
Optionals:
length of call message queue
name
Call stack entry qualification
display external messages
screen wait time
*/
/*********************************************************************/
/******** This is the start of the exception handler function.
*/
/*********************************************************************/
void main_handler(_FEEDBACK *cond, _POINTER *token, _INT4 *rc,
_FEEDBACK *new)
{
/****************************************/
/* Initialize variables for call to
*/
/* QMHSNDPM.
*/
/* User must create a message file and */
/* define a message ID to match the
*/
/* following data.
*/
/****************************************/
char
message_id[7] = "TRG9999";
char
message_file[20] = "MSGF
LIB1
";
char
message_data[50] = "Trigger error
" ;
int
message_len = 30;
char
message_type[10] = "*ESCAPE ";
char
message_q[10] = "_C_pep
";
int
pgm_stack_cnt = 1;
char
message_key[4];
/****************************************/
/* Declare error code structure for
*/
/* QMHSNDPM.
*/
/****************************************/
struct error_code {
int bytes_provided;
int bytes_available;
char message_id[7];
} error_code;
error_code.bytes_provided = 15;
/****************************************/
/* Set the error handler to resume and */
/* mark the last escape message as
*/
/* handled.
*/
/****************************************/
*rc = CEE_HDLR_RESUME;
/****************************************/
/* Send my own *ESCAPE message.
*/
/****************************************/
QMHSNDPM(message_id,
&message_file,
&message_data,
message_len,
message_type,
message_q,
pgm_stack_cnt,
&message_key,
&error_code );
/****************************************/
/* Check that the call to QMHSNDPM
*/
/* finished correctly.
*/
/****************************************/
if (error_code.bytes_available != 0)
Database programming
279
{
printf("Error in QMHOVPM : %s\n", error_code.message_id);
}
}
Hex
Type
Field
CHAR(10)
10
CHAR(10)
20
14
CHAR(10)
30
1E
CHAR(1)
Trigger event
31
1F
CHAR(1)
Trigger time
32
20
CHAR(1)
33
21
CHAR(3)
Reserved
36
24
BINARY(4)
CCSID of data
40
28
BIN(4)
44
2C
CHAR(4)
Reserved
48
30
BINARY(4)
52
34
BINARY(4)
56
38
BINARY(4)
60
3C
BINARY(4)
64
40
BINARY(4)
68
44
BINARY(4)
72
48
BINARY(4)
76
4C
BINARY(4)
80
50
CHAR(*)
Reserved
CHAR(*)
Original record
CHAR(*)
CHAR(*)
New record
CHAR(*)
280
CCSID of data
The CCSID of the data in the new or the original records. The data is converted to the job CCSID
by the database. SBCS data is converted to the single byte associated CCSID. DBCS data is
converted to the double byte associated CCSID.
Commit lock level
The commit lock level of the current application program. The possible values are:
0
*NONE
*CHG
*CS
*ALL
Not NULL
NULL
Not NULL
Database programming
281
NULL
Insert operation
Delete operation
Update operation
Read operation
Trigger time
The time, relative to the operation on the database file, when the trigger program is called. The
possible values are:
1
Adding triggers
You can add a trigger to a specific database file.
To add a trigger, follow these steps:
1. Ensure that you have the proper authority and the file has the proper data capabilities.
2. Use one of the following methods to associate the trigger program with a specific database file:
v Use System i Navigator to create a new file or to edit the properties of an existing file.
v Use the Add Physical File Trigger (ADDPFTRG) command.
v Use the CREATE TRIGGER SQL statement.
Note: If the trigger program resides in QTEMP library, the trigger program cannot be associated with a
physical file.
After you have created the association between the trigger program and the file, the system calls the
trigger program when a change or read operation is initiated against the database file, a member of the
file, and any logical file created over the physical file.
You can associate a maximum of 300 triggers with one database file. Each insert, delete, or update
operation can call multiple triggers before and after the operation occurs. Each read operation can call
multiple triggers after the operation occurs. This topic shows how to add a trigger to a file.
282
You can associate a maximum of three triggers with one logical file. That is, you can create one INSTEAD
OF trigger per insert, update, or delete operation. The trigger is called instead of performing the
operation.
The number of triggers called after a read operation that is issued by a query might not be equal to the
number of records that are actually returned. This is because the query might have read a different
number of records, causing a trigger to be called for each read operation, before returning the correct
number of records.
An SQL update operation involves a simultaneous read operation followed by a write operation. Read
triggers are not run for SQL update operations. An update trigger should be specified to cover this read
operation followed by a write operation.
Displaying triggers
You can use the Display File Description (DSPFD) command to display a list of triggers that are
associated with a file. Specify TYPE(*TRG) or TYPE(*ALL) to get the list.
The DSPFD command provides the following information:
v The number of trigger programs
v The trigger name and library
v The trigger status
v The trigger program names and libraries
v
v
v
v
v
The
The
The
The
The
trigger
trigger
trigger
trigger
trigger
events
times
update conditions
type
mode
v
v
v
v
The
The
The
List
trigger orientation
trigger creation date/time
number of trigger update columns
of trigger update columns
Database programming
283
Related reference
Display File Description (DSPFD) command
Removing triggers
You can remove triggers using the Remove Physical File Trigger (RMVPFTRG) command, the SQL DROP
TRIGGER statement, or System i Navigator.
Use the RMVPFTRG command to remove the association of a file and the trigger program. After you
remove the association, the system takes no action when a change or read operation occurs to the
physical file. The trigger program, however, remains on the system.
Related concepts
Getting started with System i Navigator
SQL programming
Related reference
Remove Physical File Trigger (RMVPFTRG) command
284
A trigger program cannot be added if the program is in the QTEMP library. For database files, the
CRTDUPOBJ command attempts to locate the trigger program in the TO library. If the CRTDUPOBJ
command is used with QTEMP specified as the new library, CRTDUPOBJ attempts to create as much
of the object as possible. The file is created, but the trigger cannot be added, so the file remains in
QTEMP without a member.
Database programming
285
Note: If any trigger program functions do not relate to database files and cannot be explicitly
journaled, send journal entries to record relevant information. Use the Send Journal Entry
(SNDJRNE) command or the Send Journal Entry (QJOSJRNE) API. Use this information during
database file recovery to ensure consistency.
286
Database distribution
DB2 Multisystem (i5/OS option 27) provides a simple and direct method of distributing a database file
over multiple systems in a loosely coupled environment.
DB2 Multisystem allows users on distributed systems to have real-time query and update access to a
distributed database as if it existed totally on their particular systems. DB2 Multisystem places new
records on the appropriate system based on a user-defined key field or fields. DB2 Multisystem chooses a
system on the basis of either a system-supplied or user-defined hashing algorithm.
Query performance is improved by a factor approaching the number of nodes in the environment. For
example, a query against a database distributed over four systems runs in approximately one quarter of
the time. However, performance can vary greatly when queries involve joins and grouping. Performance
is also influenced by the balance of the data across the multiple nodes. Multisystem runs the query on
each system concurrently. DB2 Multisystem can significantly reduce query time on very large databases.
Related concepts
DB2 Multisystem
Meaning
DBCS-open: A character string that contains both single-byte and bracketed double-byte data.
DBCS-either: A character string that contains either all single-byte data or all bracketed
double-byte data.
Note: Files containing DBCS data types can be created on a single-byte character set (SBCS) system. Files
containing DBCS data types can be opened and used on a SBCS system, however, coded character
set identifier (CCSID) conversion errors can occur when the system tries to convert from a DBCS
or mixed CCSID to a SBCS CCSID. These errors do not occur if the job CCSID is 65535.
Database programming
287
DBCS constants
A constant identifies the actual character string to be used. The character string is enclosed in single
quotation marks and a string of DBCS characters is surrounded by the DBCS shift-out and shift-in
characters (represented by the characters < and > in the following examples). A DBCS-graphic constant is
preceded by the character G.
The types of DBCS constants are:
Type
Example
DBCS-Only
<A1A2A3>
DBCS-Open
<A1A2A3>BCD
DBCS-Graphic
G<A1A2A3>
Hexadecimal
DBCS- open
DBCSeither
DBCS- only
DBCSgraphic
UCS2graphic
UTF-8
UTF-16
Character
Valid
Valid
Valid
Not valid
Not valid
Not valid
Valid
Valid
Valid
Hexadecimal
Valid
Valid
Valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
DBCS-open
Not valid
Valid
Valid
Not valid
Not valid
Not valid
Valid
Valid
Valid
DBCS-either
Not valid
Valid
Valid
Valid
Not valid
Not valid
Not valid1
Not valid1
Not valid1
DBCS-only
Valid
Valid
Valid
Valid
Valid
Valid
Not valid1
Not valid1
Not valid1
DBCS-graphic
Not valid
Not valid
Valid
Valid
Valid
Valid
Valid
Valid
Valid
UCS2-graphic
Valid
Not valid
Valid
Not valid1
Not valid1
Valid
Valid
Valid
Valid
UTF-8
Valid
Not valid
Valid
Not valid1
Not valid1
Valid
Valid
Valid
Valid
UTF-16
Valid
Not valid
Valid
Not valid1
Not valid1
Valid
Valid
Valid
Valid
Note: In the table, 1 indicates that these mappings are not supported because of the possibility of substitution characters appearing after conversion.
288
A UCS2-graphic (G) field can be concatenated to another UCS2-graphic field, a UTF-8 character
field, or a UTF-16 graphic field. The resulting data type is UTF-16 if one of the operands is UTF-16,
UTF-8 if one of the operands is UTF-8 and no operands are UTF-16, and otherwise UCS-2.
A UTF-8 character (A) field can be concatenated with another UTF-8 field, a UTF-16 field, or a
UCS-2 field. The resulting data type is UTF-16 if one of the operands is UTF-16, UTF-8 if one of the
operands is UTF-8 and no operands are UTF-16, and otherwise UCS-2.
A UTF-16 graphic (G) field can be concatenated with another UTF-16 field, a UTF-8 field, or a UCS-2
field. The resulting data type is UTF-16 if one of the operands is UTF-16, UTF-8 if one of the
operands is UTF-8 and no operands are UTF-16, and otherwise UCS-2.
v The maximum length of a concatenated field varies depending on the data type of the concatenated
field and length of the fields being concatenated. If the concatenated field is zoned decimal (S), its total
length cannot exceed 31 bytes. If the concatenated field is character (A), DBCS-open (O), or DBCS-only
(J), its total length cannot exceed 32,766 bytes (32,740 bytes if the field is variable length).
The length of DBCS-graphic (G) fields is expressed as the number of double-byte characters (the actual
length is twice the number of characters); therefore, the total length of the concatenated field cannot
exceed 16,383 characters (16,370 characters if the field is variable length).
v In join logical files, the fields to be concatenated must be from the same physical file. The first field
specified on the CONCAT keyword identifies which physical file is used. The first field must,
therefore, be unique among the physical files on which the logical file is based, or you must also
specify the JREF keyword to specify which physical file to use.
v The use of a concatenated field must be I (input only).
v REFSHIFT cannot be specified on a concatenated field that has been assigned a data type of O or J.
Notes:
1. When bracketed-DBCS fields are concatenated, a shift-in at the end of one field and a shift-out
at the beginning of the next field are removed. If the concatenation contains one or more
hexadecimal fields, the shift-in and shift-out pairs are only eliminated for DBCS fields that
precede the first hexadecimal field.
2. A concatenated field that contains DBCS fields must be an input-only field.
3. Resulting data types for concatenated DBCS fields might differ when using The Open Query
File (OPNQRYF) command.
Related concepts
Using concatenation with DBCS fields on page 291
When double-byte character set (DBCS) fields are included in a concatenation through the Open Query
File (OPNQRYF) command, the resulting data type is the same as the data type of the concatenated field
in a logical file, with some slight variations.
Database programming
289
Any
numeric
Character
Hexadecimal
DBCS-open
DBCSeither
DBCS-only
DBCSgraphic
UCS2graphic
UTF-8
UTF-16
Date
Time
Timestamp
Valid
Not valid
Not valid
Not valid
Not
valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Character
Not valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Not valid
Valid
Valid
Not valid
Not valid
Not valid
Hexadecimal
Not valid
Valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
DBCS- open
Not valid
Valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Valid
Valid
Not valid
Not valid
Not valid
DBCS- either
Not valid
Valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
DBCS- only
Not valid
Not valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
DBCSgraphic
Not valid
Not valid
Not valid
Not valid
Not
valid
Not valid
Valid
Not valid
Valid
Valid
Not valid
Not valid
Not valid
UCS2graphic
Not valid
Not valid
Not valid
Not valid
Not
valid
Not valid
Not valid
Valid
Valid
Valid
Not valid
Not valid
Not valid
UTF-8
Not valid
Valid
Not valid
Valid
Not
valid
Not valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Not valid
UTF-16
Not valid
Valid
Not valid
Valid
Not
valid
Not valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Not valid
Date
Not valid
Not valid
Not valid
Not valid
Not
valid
Not valid
Not valid
Not valid
Not valid
Not valid
Valid
Not valid
Not valid
Time
Not valid
Not valid
Not valid
Not valid
Not
valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Valid
Not valid
Timestamp
Not valid
Not valid
Not valid
Not valid
Not
valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Valid
Comparing DBCS fields through the Open Query File (OPNQRYF) command
When you compare two fields or constants, fixed-length fields can be compared to variable-length fields
if the types are compatible. The table shows the valid comparisons for double-byte character set (DBCS)
fields through the Open Query File (OPNQRYF) command.
Table 51. Valid comparisons for DBCS fields through the OPNQRYF command
Any numeric
Character
Hexadecimal
DBCS- open
DBCS- either
DBCS- only
DBCSgraphic
UCS2- graphic
Date
Time
Any numeric
Valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Character
Not valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Valid
Valid
Valid
Valid
Hexa- decimal
Not valid
Valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Valid
Valid
Valid
DBCS- open
Not valid
Valid
Valid
Valid
Valid
Valid
Not valid
Valid
Valid
Valid
Valid
DBCS- either
Not valid
Valid
Valid
Valid
Valid
Valid
Not valid
Valid
Valid
Valid
Valid
DBCS- only
Not valid
Not valid
Valid
Valid
Valid
Valid
Not valid
Valid
Not valid
Not valid
Not valid
DBCS- graphic
Not valid
Not valid
Not valid
Not valid
Not valid
Not valid
Valid
Valid
Not valid
Not valid
Not valid
UCS2- graphic
Not valid
Valid
Not valid
Valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Not valid
Time- stamp
Date
Not valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Not valid
Valid
Not valid
Not valid
Time
Not valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Not valid
Not valid
Valid
Not valid
Time- stamp
Not valid
Valid
Valid
Valid
Valid
Not valid
Not valid
Not valid
Not valid
Not valid
Valid
290
Manuals
v IDDU Use, SC41-5704
(562 KB)
This manual provides the administrative secretary, business professional, or programmer with
information about using the interactive data definition utility (IDDU) to describe data dictionaries, files,
and records to the system.
(1351 KB)
v Query for i5/OS, SC41-5210
This manual provides the administrative secretary, business professional, or programmer with
information about using IBM Query for i to get data from any database file. It describes how to sign on
to Query and how to define and run queries to create reports that contain the selected data.
Other information
v Application programming interfaces
This topic collection provides the application programmer with the information needed to develop
system-level applications and other i5/OS applications using the application programming interfaces
(APIs).
v Backup and recovery
Database programming
291
These topic collections contain information about how to plan a backup and recovery strategy, how to
set up disk protection for your data, how to back up your system, and how to control your system
shutdown in the event of a failure.
v Commitment control
This topic collection contains information about using commitment control to ensure that database
changes are synchronized.
v Control language
This topic collection provides the application programmer and system programmer with detailed
information about control language (CL) and commands.
v Database file management
This topic collection provides the application programmer with information about using files in
application programs. Included are topics on the Copy File (CPYF) command and the override
commands.
v DB2 for i SQL reference
This topic collection provides the application programmer, programmer, or database administrator with
detailed information about Structured Query Language (SQL) statements and their parameters.
v DDS concepts
This topic collection provides the application programmer with descriptions of the entries and
keywords needed to describe database files (both logical and physical) and certain device files (for
displays, printers, and the intersystem communications function (ICF) that are external to the users
programs).
v Disk management
This topic collection helps you manage and protect disk units and disk pools for continuously available
information.
v i5/OS globalization
This topic collection provides the data processing manager, system operator, system manager,
application programmer, user, and system engineer with information about the i5/OS national
language support function. It prepares the user for planning, installing, configuring, and using the
i5/OS globalization and multilingual system. It also explains database management of multilingual
data and application considerations for a multilingual system.
v Journal management
This topic collection provides information about how to set up, manage, and troubleshoot
system-managed access-path protection (SMAPP), local journals, and remote journals.
v Performance
This topic collection provides a description of tuning the system, collecting performance data, working
with system values to control or change the overall operation of the system, and gathering data to
determine who is using the system and what resources are being used.
v Security reference
This topic collection provides information about planning, setting up, managing, and auditing security
on your system.
v SQL programming
This topic collection provides the application programmer, programmer, or database administrator with
an overview of how to design, write, run, and test SQL statements. It also describes interactive SQL.
v Work management
This topic collection provides the programmer with information about how to create and change a
work management environment.
292
Related reference
PDF file for Database programming on page 1
You can view and print a PDF file of this information.
Database programming
293
294
Appendix. Notices
This information was developed for products and services offered in the U.S.A.
IBM may not offer the products, services, or features discussed in this document in other countries.
Consult your local IBM representative for information on the products and services currently available in
your area. Any reference to an IBM product, program, or service is not intended to state or imply that
only that IBM product, program, or service may be used. Any functionally equivalent product, program,
or service that does not infringe any IBM intellectual property right may be used instead. However, it is
the users responsibility to evaluate and verify the operation of any non-IBM product, program, or
service.
IBM may have patents or pending patent applications covering subject matter described in this
document. The furnishing of this document does not grant you any license to these patents. You can send
license inquiries, in writing, to:
IBM Director of Licensing
IBM Corporation
North Castle Drive
Armonk, NY 10504-1785
U.S.A.
For license inquiries regarding double-byte (DBCS) information, contact the IBM Intellectual Property
Department in your country or send inquiries, in writing, to:
Intellectual Property Licensing
Legal and Intellectual Property Law
IBM Japan, Ltd.
3-2-12, Roppongi, Minato-ku, Tokyo 106-8711
The following paragraph does not apply to the United Kingdom or any other country where such
provisions are inconsistent with local law: INTERNATIONAL BUSINESS MACHINES CORPORATION
PROVIDES THIS PUBLICATION AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Some
states do not allow disclaimer of express or implied warranties in certain transactions, therefore, this
statement may not apply to you.
This information could include technical inaccuracies or typographical errors. Changes are periodically
made to the information herein; these changes will be incorporated in new editions of the publication.
IBM may make improvements and/or changes in the product(s) and/or the program(s) described in this
publication at any time without notice.
Any references in this information to non-IBM Web sites are provided for convenience only and do not in
any manner serve as an endorsement of those Web sites. The materials at those Web sites are not part of
the materials for this IBM product and use of those Web sites is at your own risk.
IBM may use or distribute any of the information you supply in any way it believes appropriate without
incurring any obligation to you.
Licensees of this program who wish to have information about it for the purpose of enabling: (i) the
exchange of information between independently created programs and other programs (including this
one) and (ii) the mutual use of the information which has been exchanged, should contact:
IBM Corporation
Copyright IBM Corp. 1998, 2010
295
296
Trademarks
IBM, the IBM logo, and ibm.com are trademarks or registered trademarks of International Business
Machines Corp., registered in many jurisdictions worldwide. Other product and service names might be
trademarks of IBM or other companies. A current list of IBM trademarks is available on the Web at
Copyright and trademark information at www.ibm.com/legal/copytrade.shtml.
The following terms are trademarks of International Business Machines Corporation in the United States,
other countries, or both:
AS/400
COBOL/400
DB2
DB2 Universal Database
DRDA
i5/OS
IBM
IBM (logo)
Integrated Language Environment
iSeries
Redbooks
REXX
RPG/400
System i
System/36
System/38
WebSphere
Adobe, the Adobe logo, PostScript, and the PostScript logo are either registered trademarks or trademarks
of Adobe Systems Incorporated in the United States, and/or other countries.
Microsoft, Windows, Windows NT, and the Windows logo are trademarks of Microsoft Corporation in the
United States, other countries, or both.
Other company, product, or service names may be trademarks or service marks of others.
297
You may not download, export or re-export this information except in full compliance with all applicable
laws and regulations, including all United States export laws and regulations.
IBM MAKES NO GUARANTEE ABOUT THE CONTENT OF THESE PUBLICATIONS. THE
PUBLICATIONS ARE PROVIDED AS-IS AND WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF
MERCHANTABILITY, NON-INFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
298
Printed in USA