OpenFrame HiDB 정의 유틸리티
본 장에서는 OpenFrame HiDB 데이터베이스를 정의하는 유틸리티에 대해 기술한다.
1. 개요
OpenFrame HiDB 유틸리티 프로그램은 OpenFrame HiDB 엔진과 함께 제공되는 프로그램으로 JCL을 통해 Batch JOB으로 실행되는 프로그램을 의미한다. 유틸리티 프로그램은 Mainframe에서 사용되는 데이터베이스 유틸리티 프로그램과의 호환성을 유지하기 위해 제공되는 프로그램으로, 데이터베이스의 정의, 재편성 및 초기화 기능 등을 제공한다.
다음은 OpenFrame HiDB 데이터베이스를 정의하는 유틸리티 프로그램 목록이다. 각 유틸리티에 대한 설명은 해당 절에서 자세하게 기술한다.
프로그램명 | 설명 |
---|---|
OpenFrame HiDB 데이터베이스 스키마를 시스템에 정의할 때 사용한다. |
|
데이터베이스에 대한 논리 구조 및 DC 인터페이스 블록을 정의한다. |
2. DBDGEN
DBDGEN 유틸리티는 OpenFrame HiDB 데이터베이스 스키마를 시스템에 정의할 때 사용한다. 데이터베이스 스키마 정보는 데이터베이스 정의 블록(DBD 블록)으로 만들어져서 시스템 라이브러리에 저장된다.
DBDGEN 유틸리티를 사용하면 다음과 같은 유형의 데이터베이스를 정의할 수 있다.
-
HSAM 데이터베이스(SHSAM 포함)
-
HISAM 데이터베이스(SHISAM 포함)
-
HDAM 데이터베이스
-
HIDAM 데이터베이스
-
DEDB 데이터베이스
-
INDEX 데이터베이스
-
LOGICAL 데이터베이스
다음은 DBDGENC0 프로그램과 DFSILNK0 프로그램을 실행시키는 DBDGEN 프러시저의 내용을 보여주는 예로 아래와 같이 2개의 스텝으로 이루어져 있다.
// PROC MBR=TEMPNAME,SOUT=A,RGN=4M,SYS2= //C EXEC PGM=DBDGENC0,REGION=&RGN,PARM='OBJECT,NODECK' //SYSLIB DD DSN=IMS.&SYS2MACLIB,DISP=SHR //SYSLIN DD UNIT=SYSDA,DISP=(,PASS), // SPACE=(80,(100,100),RLSE), // DCB=(BLKSIZE=80,RECFM=F,LRECL=80) //SYSPRINT DD SYSOUT=&SOUT,DCB=BLKSIZE=1089, // SPACE=(121,(300,300),RLSE,,ROUND) //SYSUT1 DD UNIT=SYSDA,DISP=(,DELETE), // SPACE=(CYL,(10,5)) //L EXEC PGM=DFSILNK0,PARM='XREF,LIST',COND=(0,LT,C) //SYSLIN DD DSN=*.C.SYSLIN,DISP=(OLD,DELETE) //SYSPRINT DD SYSOUT=&SOUT,DCB=BLKSIZE=1089, // SPACE=(121,(90,90),RLSE) //SYSLMOD DD DSN=IMS.&SYS2DBDLIB(&MBR),DISP=SHR //SYSUT1 DD UNIT=SYSDA,DISP=(,DELETE), // SPACE=(1024,(100,10),RLSE)
위 DBDGEN 프러시저의 첫 번째 과정인 C 스텝은 컴파일 스텝으로 OpenFrame HiDB 데이터베이스 정의 스크립트를 컴파일하기 위해 DBDGENC0 유틸리티를 실행시켜 오브젝트 모듈을 생성한다. 두 번째 스텝인 L 스텝은 DFSILNK0 유틸리티를 실행시키는 Link-Edit 스텝으로 앞의 컴파일 과정에서 생성된 오브젝트 모듈을 시스템 라이브러리로 복사하는 작업을 수행한다.
2.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSIN DD |
OpenFrame HiDB 데이터베이스 정의 스크립트를 포함하는 입력 데이터셋을 지정한다. |
SYSLMOD DD |
IMS.DBDLIB 등의 DBD 블록을 저장하기 위한 PDS 데이터셋을 지정한다. |
2.2. JCL 파라미터
JCL 파라미터 항목은 다음과 같다.
항목 | 설명 |
---|---|
MBR |
생성하는 DBD의 이름을 지정한다. 이곳에 지정된 이름은 DBD 문의 NAME 파라미터에 지정된 이름과 동일해야 한다. |
SOUT |
SYSOUT DD 문장에 할당될 클래스를 지정한다. (기본값: 'A') |
SYS2 |
IMS 시스템 데이터셋의 두 번째 Qualifier를 지정한다. (예: SYS2='IMSA.') |
2.3. 명령어 설정
DBDGEN 유틸리티에서는 DBD 컨트롤문을 사용하여 데이터베이스 스키마를 정의한다.
다음은 DBD 컨트롤문에 대한 설명이다.
컨트롤문 | 설명 |
---|---|
데이터베이스 전반에 대한 정보를 지정한다. |
|
데이터베이스를 구성하는 데이터셋 정보를 지정한다. |
|
DEDB 데이터베이스는 AREA 문으로 데이터셋 정보를 지정한다. |
|
선행하는 DATASET 문으로 정의되는 데이터셋에 포함되는 세그먼트 정보를 지정한다. |
|
선행하는 SEGM 문으로 정의된 세그먼트의 논리 자식 정보를 지정한다. |
|
선행하는 SEGM 문으로 정의된 세그먼트의 필드 정보를 지정한다. |
|
Secondary Index 관계에 있어서 세그먼트 검색 필드 정보를 지정한다. |
|
데이터베이스 정의의 종료를 지정한다. |
|
컨트롤문의 종료를 지정한다. |
|
선택적이며 호환성을 위해 존재한다. |
DBD 컨트롤문의 기술 순서는 다음의 규칙을 따른다.
-
DBD 문은 DBD 컨트롤문의 제일 앞에 기술한다.
-
DBD 문의 다음에는 반드시 DATASET 문을 기술한다. (DEDB의 경우 DATASET 문 대신 AREA 문 사용)
-
DBD 문에 이어 1개 이상의 DATASET, SEGM, FIELD 문이 있어야 한다. 단, 논리 데이터베이스 정의에는 FIELD, LCHILD 문이 존재해서는 안 된다.
-
HDAM, HIDAM, HISAM(SHISAM) 이외의 데이터베이스 정의에서는 XDFLD 문이 존재해서는 안 된다.
-
FIELD 문은 Secondary Index 관계를 지정하는 LCHILD 문의 다음에 지정하면 안 된다.
-
기본 인덱스를 지정하는 LCHILD 문 또는 Logical Relationship을 지정하는 LCHILD 문은 Secondary Index 관계를 지정하는 LCHILD 문의 다음에 지정하면 안 된다.
다음은 DBD 컨트롤문의 입력 순서이다.
DBD ...................... 데이터베이스 정의 시작 DATASET ................ 데이터셋 정보 SEGM ................. 세그먼트 정보 FIELD .............. 필드 정보 LCHILD ............. 논리 자식 정보 XDFLD .............. 세그먼트 검색 필드 SEGM FIELD SEGM FIELD DBDGEN ................... 데이터베이스 정의 종료 END ...................... 컨트롤 문장의 종료
DBD 문
기술하고 있는 데이터베이스의 이름을 지정하고 데이터베이스의 구조에 대한 DL/I 정보를 제공한다. 하나의 데이터베이스 정의 스크립트에는 하나의 DBD 문을 사용할 수 있다.
-
HSAM(SHSAM) 데이터베이스
다음은 HSAM(SHSAM) 데이터베이스를 위한 DBD 문이다.
DBD NAME=dbname1,ACCESS={HSAM|SHSAM}
-
HISAM(SHISAM) 데이터베이스
다음은 HISAM(SHISAM) 데이터베이스를 위한 DBD 문이다.
DBD NAME=dbname1,ACCESS=({HISAM|SHISAM}[,VSAM]) [,PASSWD={NO|YES}] [,VERSION='n']
-
HDAM 데이터베이스
다음은 HDAM 데이터베이스를 위한 DBD 문이다.
DBD NAME=dbname1,ACCESS=(HDAM,{VSAM|OSAM}) ,RMNAME=(mod[,anch,rbn,bytes]) [,PASSWD={NO|YES}] [,VERSION='n']
-
HIDAM 데이터베이스
다음은 HIDAM 데이터베이스를 위한 DBD 문이다.
DBD NAME=dbname1,ACCESS=(HIDAM,{VSAM|OSAM}) [,PASSWD={NO|YES}] [,VERSION='n']
-
DEDB 데이터베이스
다음은 DEDB 데이터베이스를 위한 DBD 문이다.
DBD NAME=dbname1,ACCESS=DEDB ,RMNAME=(mod,...XCI) [,VERSION='n']
-
INDEX 데이터베이스
다음은 INDEX 데이터베이스를 위한 DBD 문이다.
DBD NAME=(dbname1[,dbname2]),ACCESS=(INDEX,VSAM) [,PASSWD={NO|YES}]
-
LOGICAL 데이터베이스
다음은 LOGICAL 데이터베이스를 위한 DBD 문이다.
DBD NAME=dbname1,ACCESS=LOGICAL
다음은 DBD 문의 파라미터에 대한 설명이다.
항목 | 설명 |
---|---|
NAME |
현재 기술하고 있는 데이터베이스의 DBD 이름을 지정한다. 단, PSB 이름과 중복된 이름을 사용할 수 없다. |
ACCESS |
이 데이터베이스에서 사용되는 DL/I와 데이터셋 접근방식을 지정한다. 다음과 같은 값을 사용할 수 있다.
|
PASSWD |
VSAM 패스워드로 DBD 이름을 사용할지의 여부를 결정한다. (기본값: NO) |
VERSION |
DBD를 식별할 수 있는 문자열을 최대 255자까지 지정할 수 있다. |
RMNAME |
ACCESS 파라미터 값으로 HDAM 또는 DEDB가 지정이 되었을 때, 데이터베이스 안에 저장되는 데이터를 관리하는 정보를 지정한다. 이 정보에 의해 임의추출(Randomizer) 모듈이 동작하는 방식이 결정된다. |
OpenFrame HiDB에서는 VSAM 패스워드를 사용하지 않는다. |
DATASET 문
DATASET 문은 데이터베이스 안에서의 데이터셋 그룹을 정의한다.
-
HSAM(SHSAM) 데이터베이스
다음은 HSAM(SHSAM) 데이터베이스를 위한 DATASET 문이다.
DATASET DD1=ddname1,DD2=ddname2 [,BLOCK=(blkfact1,blkfact2)] [,RECORD=(reclen1,reclen2)]
-
HISAM(SHISAM) 데이터베이스
다음은 HISAM(SHISAM) 데이터베이스를 위한 DATASET 문이다.
DATASET DD1=ddname1,OVFLW=ddname3 [,BLOCK=(blkfact1,blkfact2)] [,SIZE=(size1,size2)] [,RECORD=(reclen1,reclen2)]
SHISAM 데이터베이스는 OVFLW를 기술하지 않는다.
-
HDAM / HIDAM 데이터베이스
다음은 HDAM 또는 HIDAM 데이터베이스를 위한 DATASET 문이다.
DATASET DD1=ddname1 [,BLOCK=size0] [,SIZE=(,size1)] [,SCAN=cyls] [,FRSPC=(fbff,fspf)] [,SEARCHA=0|1|2]
-
INDEX 데이터베이스
다음은 INDEX 데이터베이스를 위한 DATASET 문이다.
DATASET DD1=ddname1,OVFLW=ddname3 [,BLOCK=(blkfact1,blkfact2)] [,SIZE=(size1,size2)] [,RECORD=(reclen1,reclen2)]
-
LOGICAL 데이터베이스
다음은 LOGICAL 데이터베이스를 위한 DATASET 문이다.
DATASET LOGICAL
다음은 DATASET 문의 파라미터에 대한 설명이다.
항목 | 설명 |
---|---|
DD1 |
데이터셋 그룹의 첫 번째 데이터셋의 DD 이름을 지정한다. 데이터베이스 유형에 따라 다음과 같은 의미를 갖는다.
|
DD2 |
HSAM(SHSAM) 데이터베이스 유형에서 출력 데이터셋의 DD 이름을 지정한다. |
OVFLW |
HISAM 데이터베이스 또는 INDEX 데이터베이스 유형에서 오버플로우 데이터셋의 DD 이름을 지정한다. |
BLOCK |
블록 팩터(blocking factors)를 지정한다. 아래 표에서 자세하게 설명한다. |
RECORD |
옵션 파라미터로 논리 레코드의 크기를 지정한다. 아래 표에서 자세하게 설명한다. |
SIZE |
DBDGEN 프러시저에서 VSAM 컨트롤 인터벌 크기를 재정의할 때 사용한다. |
SCAN |
세그먼트를 삽입할 때 빈 공간을 찾기 위해 검색하는 디바이스의 실린터 개수를 지정한다. OpenFrame HiDB에서는 문법적인 형식만 체크하고 기능적으로 지원하지는 않는다. |
FRSPC |
HDAM 또는 HIDAM 데이터베이스 유형에서 여유 공간을 얼마만큼 유지할지를 결정한다. |
SEARCHA |
세그먼트를 삽입할 때 빈 공간을 찾는 알고리즘의 유형을 지정한다. OpenFrame HiDB에서는 문법적인 형식만 체크하고 기능을 지원하지는 않는다. |
LOGICAL |
LOGICAL 데이터베이스를 정의하고 있는 것을 알려준다. |
다음은 앞에서 설명한 BLOCK, RECORD 파라미터에 대한 자세한 설명이다.
-
HSAM(SHSAM) 데이터베이스
HSAM(SHSAM)은 Unblocked I/O를 사용한다. 따라서 LRECL과 BLKSIZE의 값은 동일하게 지정한다.
파라미터 설명 BLOCK
-
blkfact1 : 입력 데이터셋에 대한 블록 팩터를 지정한다. (항상 1)
-
blkfact2 : 출력 데이터셋에 대한 블록 팩터를 지정한다. (항상 1)
RECORD
-
reclen1 : 입력 데이터셋의 레코드 크기를 지정한다.
-
reclen2 : 출력 데이터셋의 레코드 크기를 지정한다.
-
-
HISAM(SHISAM), INDEX 데이터베이스
파라미터 설명 BLOCK
-
blkfact1 : 기본 데이터셋에 대한 블록 팩터를 지정한다.
-
blkfact2 : 오버플로우 데이터셋에 대한 블록 팩터를 지정한다.
RECORD
-
reclen1 : 기본 데이터셋의 레코드 크기를 지정한다.
-
reclen2 : 오버플로우 데이터셋에 대한 레코드 크기를 지정한다.
-
-
HDAM / HIDAM 데이터베이스
파라미터 설명 BLOCK
size0에 오버헤드를 제외한 VSAM 컨트롤 인터벌 크기를 지정한다. VSAM 데이터셋에 대한 기본 오버헤드 값은 5이다.
RECORD
지정해도 무시된다.
AREA 문
DEDB 데이터베이스는 AREA 문을 사용해서 데이터를 저장할 데이터셋 영역을 정의한다. DEDB를 정의하는 DBDGEN 스크립트를 작성할 때, 모든 AREA 문은 DBD 문과 첫 번째 SEGM 문 사이에 위치해야 한다.
다음은 DEDB 데이터베이스를 위한 AREA 문이다.
AREA DD1=ddname1 [,DEVICE=nnnn] ,SIZE=size1 ,UOW=(number1,overflow1) ,ROOT=(number2,overflow2)
항목 | 설명 |
---|---|
DD1 |
정의될 영역의 DD 이름을 지정한다. |
DEVICE |
물리적인 저장장치의 디바이스 유형을 지정한다. 파라미터를 지정하지 않은 경우 기본값으로 3380이 사용된다. |
SIZE |
컨트롤 인터벌 크기를 지정한다. 512B, 1KB, 2KB, 4KB, 8KB, 28KB의 값을 사용할 수 있다. VSAM 데이터셋의 컨트롤 인터벌 크기와 동일하게 지정한다. |
UOW |
1개의 UOW(Unit of Work)에 사용되는 컨트롤 인터벌 개수를 지정한다.
|
ROOT |
DEDB AREA에 대한 속성을 정의한다.
|
SEGM 문
SEGM 문은 데이터베이스의 세그먼트를 정의한다. 한 데이터베이스 안에서 세그먼트의 계층, 세그먼트의 물리적인 속성, 그리고 다른 세그먼트와의 관계 등을 정의한다.
-
HSAM(SHSAM) 데이터베이스
다음은 HSAM(SHSAM) 데이터베이스를 위한 SEGM 문이다.
SEGM NAME=segname1 ,PARENT=segname2 ,BYTES=max_bytes [,FREQ=frequency]
-
HISAM(SHISAM) 데이터베이스
다음은 HISAM(SHISAM) 데이터베이스를 위한 SEGM 문이다.
SEGM NAME=segname1 ,PARENT=(segname2[(lpsegname,[{VIRTUAL|PHYSICAL}],dbname1)]) ,BYTES=max_bytes[,min_bytes] [,FREQ=frequency] [,POINTER|PTR={LPARNT|CTR|PAIRED}] [,RULES=([{L|P|V}{L|P|V|B}{L|P|V}],[{LAST|FIRST|HERE}])]
-
HDAM 또는 HIDAM 데이터베이스
다음은 HDAM 또는 HIDAM 데이터베이스를 위한 SEGM 문이다.
SEGM NAME=segname1 ,PARENT=(segname2[,{SNGL|DBLE}][,(lpsegname,[{VIRTUAL|PHYSICAL}],dbname1)]) ,BYTES=max_bytes[,min_bytes] [,POINTER|PTR={HIER|HIERBWD|TWIN|TWINBWD|NOTWIN} ,{LTWIN|LTWINBWD},{LPARNT|CTR|PAIRED}] [,RULES=([{L|P|V}{L|P|V|B}{L|P|V}],[{LAST|FIRST|HERE}])]
-
DEDB 데이터베이스
다음은 DEDB 데이터베이스를 위한 SEGM 문이다.
SEGM NAME=segname1 ,PARENT=(segname2[,{SNGL|DBLE}]) ,BYTES=max_bytes,min_bytes,TYPE={DIR|SEQ} [,RULES={HERE|LAST|FIRST}]
-
INDEX 데이터베이스
다음은 INDEX 데이터베이스를 위한 SEGM 문이다.
SEGM NAME=segname1 [,PARENT=0] ,BYTES=max_bytes
다음은 SEGM 문의 파라미터에 대한 설명이다.
항목 | 설명 |
---|---|
NAME |
현재 정의하고 있는 세그먼트의 이름을 지정한다. |
PARENT |
현재 정의하고 있는 세그먼트의 부모 세그먼트를 지정한다. 물리적인 부모 세그먼트와 논리적인 부모 세그먼트를 지정할 수 있다. |
BYTE[S] |
세그먼트의 데이터 부분의 크기를 지정한다. 최대 32760까지 지정할 수 있다.
|
FREQ |
부모 세그먼트의 각각의 인스턴스마다 평균적으로 몇 개의 자식 세그먼트 인스턴스가 있는지 추정값을 지정한다. |
POINTER |
현재 정의하는 세그먼트의 데이터 앞부분에 저장될 포인터들을 지정한다. 이 포인터들은 현재 세그먼트 인스턴스를 부모 세그먼트 또는 트윈 세그먼트와 관계를 맺게 해준다. 아래의 포인터 유형 중 하나의 값을 가질 수 있다.
|
RULES |
세그먼트에 대한 추가(Insert), 삭제(Delete), 변경(Replace) 명령을 할 때 지켜야 하는 규칙을 지정한다.
|
TYPE |
DEDB 데이터베이스의 종속 세그먼트 유형을 지정한다. 다음 2가지 유형 중 하나를 선택할 수 있다.
|
SOURCE |
다음 2가지 용도로 사용된다.
|
LCHILD 문
LCHILD 문은 2개의 세그먼트 간 Logical Relationship, 2개의 세그먼트 간 HIDAM Primary Index 또는 Secondary Index를 정의한다.
-
HISAM(SHISAM) 데이터베이스
다음은 HISAM(SHISAM) 데이터베이스를 위한 LCHILD 문이다.
LCHILD NAME=(segname1,dbname) [,POINTER|PTR={DBLE|NONE|SYMB}] [,PAIR=segname2] [,RULES={LAST|FIRST|HERE}]
-
HDAM 또는 HIDAM 데이터베이스
다음은 HDAM 또는 HIDAM 데이터베이스를 위한 LCHILD 문이다.
LCHILD NAME=(segname1,dbname) [,POINTER|PTR={DBLE|NONE|INDX|SYMB}] [,PAIR=segname2] [,RULES={LAST|FIRST|HERE}]
-
INDEX 데이터베이스
다음은 INDEX 데이터베이스를 위한 LCHILD 문이다.
LCHILD NAME=(segname1,dbname) [,POINTER|PTR={SNGL|SYMB}] ,INDEX=fldname
다음은 LCHILD 문의 파라미터에 대한 설명이다.
항목 | 설명 |
---|---|
NAME |
segname1에 논리 자식이나 인덱스 포인터 또는 인덱스 대상의 이름을 지정한다. dbname에 segname1에 지정한 세그먼트가 정의되어 있는 데이터베이스 이름을 지정한다. |
POINTER |
Logical Relationship 또는 인덱스 관계에서 사용되는 포인터를 지정한다.
|
PAIR |
양방향 Logical Relationship에서 물리적인 또는 가상적인 페어(Pair) 세그먼트를 지정하기 위해 사용된다. |
RULES |
Logical Relationship에서 논리 자식 트윈들 사이에서의 삽입 순서를 결정한다.
|
INDEX |
INDEX 데이터베이스의 LCHILD 문장에서 사용된다. fldname은 HIDAM 주요 인덱스의 루트 세그먼트를 지정하거나, HIDAM Secondary Index의 XDFLD를 나타낸다. |
FIELD 문
FIELD 문은 한 세그먼트 안에서의 필드를 정의한다.
-
HSAM(SHSAM) 데이터베이스
다음은 HSAM(SHSAM) 데이터베이스를 위한 FIELD 문이다.
FIELD NAME=(fldname1[,SEQ,{U|M}]) ,BYTES=bytes ,START=startpos [,TYPE={C|X|P}]
-
HISAM(SHISAM), HDAM, HIDAM 데이터베이스
다음은 HISAM(SHISAM), HDAM, HIDAM 데이터베이스를 위한 FIELD 문이다.
FIELD NAME={(fldname1[,SEQ,{U|M}])|systrelfldname} ,BYTES=bytes ,START=startpos [,TYPE={C|X|P}]
-
DEDB 데이터베이스
다음은 DEDB 데이터베이스를 위한 FIELD 문이다.
FIELD NAME=(fldname1[,SEQ,U]) ,BYTES=bytes ,START=startpos [,TYPE={C|X|P}]
-
INDEX 데이터베이스
다음은 INDEX 데이터베이스를 위한 FIELD 문이다.
FIELD NAME=(fldname1[,SEQ,{U|M}]) ,BYTES=bytes ,START=startpos [,TYPE={C|X|P}]
다음은 FIELD 문의 파라미터에 대한 설명이다.
항목 | 설명 |
---|---|
NAME |
한 세그먼트에서 정의되는 필드의 이름을 지정한다.
|
BYTE[S] |
현재 정의하는 필드의 크기를 지정한다. |
START |
현재 정의하는 필드의 시작 위치를 지정한다. |
TYPE |
현재 정의하는 필드의 데이터 타입을 지정한다. 다음과 같은 상수를 사용할 수 있다.
|
XDFLD 문
XDFLD 문은 Secondary Index 관계에서 사용되는 색인 필드를 정의한다.
다음은 HISAM(SHISAM), HDAM 또는 HIDAM 데이터베이스를 위한 XDFLD 문이다.
XDFLD NAME=fldname [,SEGMENT=segname] [,CONST=char] ,SRCH=list1 [,SUBSEQ=list2] [,DDATA=list3] [,NULLVAL=value1]
항목 | 설명 |
---|---|
NAME |
색인 데이터 필드의 이름을 지정한다. |
SEGMENT |
인덱스 소스 세그먼트의 이름을 지정한다. |
SRCH |
인덱스 소스 세그먼트의 필드 리스트를 지정한다. |
SUBSEQ |
Secondary Index의 Subsequence 필드를 지정한다. |
DDATA |
Secondary Index의 Duplicate Data 필드를 지정한다. |
OpenFrame HiDB에서는 XDFLD 문에서 CONST 및 NULLVAL 파라미터를 지원하지 않는다. |
DBDGEN, END, FINISH 문
DBD 생성 컨트롤 문장에는 3가지 추가적인 컨트롤문이 있다.
구분 | 설명 |
---|---|
DBDGEN 문 |
DBD 생성 컨트롤문의 마지막을 나타낸다. |
END 문 |
어셈블리 입력문의 마지막을 나타낸다. |
FINISH 문 |
선택적이며 호환성을 위해 존재한다. |
DBDGEN 문과 END 문은 반드시 사용되어야 하지만 FINISH 문은 선택적으로 사용할 수 있다. |
2.4. 사용예제
다음은 DBDGEN 프러시저를 사용하여 HIDAM 데이터베이스를 정의하는 JCL 예제이다.
//DBDGEN JOB MSGLEVEL=1 // EXEC DBDGEN,MBR=SKILLINV //C.SYSIN DD * DBD NAME=SKILLINV,ACCESS=HIDAM DATASET DD1=SKLHIDAM,BLOCK=1648,SCAN=5 * SEGM NAME=SKILL,BYTES=31,PTR=T,PARENT=0 LCHILD NAME=(INDE,INDEXDB),PTR=INDX * FIELD NAME=(TYPE,SEQ,U),BYTES=21,START=1,TYPE=C FIELD NAME=SDCODE,BYTES=10,START=22,TYPE=C * SEGM NAME=NAME,BYTES=20,PTR=T,PARENT=((SKILL,SNGL)) FIELD NAME=(STDCLEVL,SEQ,U),BYTES=20,START=1,TYPE=C * SEGM NAME=EXPR,BYTES=20,PTR=T,PARENT=((NAME,SNGL)) FIELD NAME=PREVJOB,BYTES=10,START=1,TYPE=C FIELD NAME=CLASSIF,BYTES=10,START=11,TYPE=C * SEGM NAME=EDUC,BYTES=75,PTR=T,PARENT=((NAME,SNGL)) FIELD NAME=GRADLEVL,BYTES=10,START=1,TYPE=C FIELD NAME=SCHOOL,BYTES=65,START=11,TYPE=C * DBDGEN FINISH END /*
2.5. 유의사항
DBDGEN 유틸리티 프로그램을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
코드 0을 반환한다.
-
에러가 발생한 경우
에러가 발생한 경우에는 해당 에러 메시지를 SYSPRINT DD로 출력하고 각 에러에 해당하는 코드를 반환한다.
DBDGEN 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 12
Unrecoverable 에러로 다음의 경우에 발생한다.
-
SYSLIN DD 또는 SYSLMOD DD를 제공하지 않은 경우
-
SYSLIN DD 또는 SYSLMOD DD의 유형이 맞지 않는 경우
-
SYSIN DD 스크립트 문장의 문법 에러가 발생한 경우
16
시스템 에러로, 다음의 경우에 발생한다.
-
OpenFrame 시스템 라이브러리 초기화에 실패한 경우
-
SYSLIN DD 또는 SYSLMOD DD OPEN 에러가 발생한 경우
-
SYSIN DD 또는 SYSLIN DD 읽기 에러가 발생한 경우
-
3. PSBGEN
PSBGEN 유틸리티는 애플리케이션에서 바라보는 HiDB 데이터베이스에 대한 논리 구조 및 데이터 커뮤니케이션과의 인터페이스 블록을 정의한다. 정의된 프로그램 접근 사양(Program Access Specification) 블록은 시스템 라이브러리에 저장된다.
다음은 PSBGENC0 프로그램과 DFSILNK0 프로그램을 실행시키는 PSBGEN 프러시저의 내용을 보여주는 예로, 아래와 같이 2개의 스텝으로 이루어져 있다.
// PROC MBR=TEMPNAME,SOUT=A,RGN=4M,SYS2= //C EXEC PGM=PSBGENC0,REGION=&RGN,PARM='OBJECT,NODECK' //SYSLIB DD DSN=IMS.&SYS2MACLIB,DISP=SHR //SYSLIN DD UNIT=SYSDA,DISP=(,PASS), // SPACE=(80,(100,100),RLSE), // DCB=(BLKSIZE=80,RECFM=F,LRECL=80) //SYSPRINT DD SYSOUT=&SOUT,DCB=BLKSIZE=1089, // SPACE=(121,(300,300),RLSE,,ROUND) //SYSUT1 DD UNIT=SYSDA,DISP=(,DELETE), // SPACE=(CYL,(10,5)) //L EXEC PGM=DFSILNK0,PARM='XREF,LIST',COND=(0,LT,C) //SYSLIN DD DSN=*.C.SYSLIN,DISP=(OLD,DELETE) //SYSPRINT DD SYSOUT=&SOUT,DCB=BLKSIZE=1089, // SPACE=(121,(90,90),RLSE) //SYSLMOD DD DSN=IMS.&SYS2PSBLIB(&MBR),DISP=SHR //SYSUT1 DD UNIT=SYSDA,DISP=(,DELETE), // SPACE=(1024,(100,10),RLSE)
위 PSBGEN 프러시저의 첫 번째 과정인 C 스텝은 컴파일 스텝으로 SYSIN으로 입력된 PSB 정의 스크립트를 컴파일하기 위해 PSBGENC0 유틸리티를 실행시켜 오브젝트 모듈을 생성한다. 두 번째 스텝인 L 스텝은 DFSILNK0 유틸리티를 실행시키는 Link-Edit 스텝으로 앞의 컴파일 과정에서 생성한 오브젝트 모듈을 시스템 라이브러리로 복사하는 작업을 수행한다.
3.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSIN DD |
PSB 컴파일러로 컴파일하기 위한 PSB 스크립트 입력 데이터셋을 지정한다. |
SYSLMOD DD |
IMS.PSBLIB 등의 PSB 블록을 저장하기 위한 PDS 데이터셋을 지정한다. |
3.2. JCL 파라미터
JCL 파라미터 항목은 다음과 같다.
항목 | 설명 |
---|---|
MBR |
생성하는 PSB의 이름을 지정한다. 이곳에 지정된 이름은 PSBGEN 문의 PSBNAME 파라미터에 지정된 이름과 동일해야 한다. |
SOUT |
SYSOUT DD 문장에 할당될 클래스를 지정한다. (기본값: 'A') |
SYS2 |
IMS 시스템 데이터셋의 두 번째 Qualifier를 지정한다. (예: SYS2='IMSA.') |
3.3. 명령어 설정
PSBGEN 유틸리티에서는 PSB 컨트롤문을 사용하여 PSB 블록을 생성한다.
다음은 PSBGEN 유틸리티를 사용할 경우에 PSB 컨트롤문의 입력 순서를 나타낸 것이다.
PCB TYPE=TP .............. 논리 단말 PCB 정보 PCB TYPE=DB .............. 데이터베이스 PCB 정보 SENSEG SENFLD SENFLD PCB TYPE=DB SENSEG SENSEG PSBGEN ................... PSB 블록 정의 종료 END ...................... 컨트롤 문장의 종료
다음은 PSBGEN 유틸리티를 사용할 경우의 PSB 컨트롤문에 대한 설명이다.
컨트롤문 | 설명 |
---|---|
현재 입력 메시지의 출처 이외의 목적지를 기술하기 위해 사용한다. (PSBGEN 유틸리티를 사용할 경우) |
|
DL/I 또는 FastPath 데이터베이스를 위한 PCB를 기술한다. |
|
애플리케이션이 사용하는 데이터베이스 세그먼트를 선언한다. |
|
SENSEG로 지정된 세그먼트에서 애플리케이션이 사용하는 필드를 지정한다. |
|
PSB 블록에 대한 정의의 종료를 지정한다. |
|
컨트롤문의 종료를 지정한다. |
Alternate PCB 문
현재 입력 메시지의 출처 이외의 목적지를 기술하기 위해 사용한다. (PSBGEN 유틸리티를 사용할 경우)
Alternate PCB 문의 형식은 다음과 같다.
PCB TYPE=TP [,LTERM|NAME=name] [,ALTRESP={NO|YES}] [,SAMETRM={NO|YES}] [,MODIFY={NO|YES}] [,EXPRESS={NO|YES}] [,PCBNAME=pcbname] [,LIST={YES|NO}]
항목 | 설명 |
---|---|
TYPE |
모든 Alternate PCB에 대한 필수 파라미터이다. |
LTERM |
메시지가 출력될 논리 단말 이름이나 트랜잭션 코드를 지정한다. |
ALTRESP |
Alternate PCB가 I/O PCB 대신 사용될 수 있는지 지정한다. |
SAMETRM |
논리 단말이 실제 물리 단말에 할당되어 있는지 지정한다. |
MODIFY |
이 Alternate PCB가 애플리케이션 안에서 변경 가능한지 지정한다. |
EXPRESS |
애플리케이션이 ABEND되었을 때, 이 Alternate PCB에서 나온 메시지가 목적 단말로 보내져야 하는지 아니면 제거되어야 하는지를 지정한다. |
PCBNAME |
PCB 이름을 지정한다. 어셈블러 레이블로 대체할 수 있다. |
LIST |
애플리케이션이 실행될 때 애플리케이션의 진입 포인트로 전달되는 PCB 목록에 리스트가 포함될지 여부를 결정한다. |
데이터베이스 PCB 문
두 번째 유형의 PCB 문은 DL/I 또는 FastPath 데이터베이스를 위한 PCB를 기술한다.
데이터베이스 PCB 문의 형식은 다음과 같다.
PCB TYPE=DB ,DBDNAME|NAME=name [,PCBNAME=pcbname] [,PROCOPT=nnnn] [,SB={NO|COND}] ,KEYLEN=value [,POS={SINGLE|MULTIPLE}] [,PROCSEQ=index_dbname] [,VIEW=MSDB] [,LIST={YES|NO}]
항목 | 설명 |
---|---|
TYPE |
모든 DL/I 데이터베이스 PCB에 대한 필수 파라미터이다. |
DBDNAME |
물리 데이터베이스 이름을 지정한다. |
PCBNAME |
PCB의 이름을 지정한다. 어셈블러 레이블로 대체할 수 있다. |
PROCOPT |
PCB 처리 파라미터를 지정한다. 최대 4개의 알파벳 문자를 사용하여 설정할 수 있으며, 다음과 같은 알파벳 문자를 지원한다.
|
SB |
순차 버퍼링(Sequential Buffering) 기법을 사용할지의 여부를 결정하는 항목으로 미지원 기능이다. |
KEYLEN |
가장 긴 연쇄 키의 길이를 지정한다. (1~3825) |
POS |
논리 데이터 구조에서 1개 또는 여러 개의 포지셔닝을 지원할지를 지정한다. 다음과 같은 약자를 사용할 수 있다.
|
PROCSEQ |
데이터베이스에 접근하기 위한 Secondary Index 이름을 지정한다. |
VIEW |
MSDB 커밋 뷰를 제공하는 항목으로 미지원 기능이다. |
LIST |
애플리케이션이 실행될 때 애플리케이션의 진입 포인트로 전달되는 PCB 목록에 리스트가 포함될지 여부를 결정한다. |
Multiple 포지셔닝에 대한 자세한 내용은 IBM 매뉴얼 중에 "IMS Application Programming: Database Manager"의 "Using Multiple Processing" 섹션을 참고한다. |
SENSEG 문
SENSEG 문은 계층적으로 연결되어 있는 데이터 세그먼트를 정의하기 위해 사용한다. 센시티브 세그먼트를 지정할 때는 계층 경로상에 상위 레벨의 세그먼트도 모두 센시티브 세그먼트여야 한다.
SENSEG 문의 형식은 다음과 같다.
SENSEG NAME=name ,PARENT=name [,PROCOPT=nnnn] [,INDICES|SIENTRY=list1]
항목 | 설명 |
---|---|
NAME |
DBD를 생성할 때 SEGM 문을 통해 정의되었던 세그먼트의 이름을 지정한다. |
PARENT |
현재 세그먼트의 부모 세그먼트를 적어준다. |
PROCOPT |
연관된 애플리케이션에서 사용될 세그먼트 처리 파라미터를 지정한다. 특정 세그먼트만 읽거나 변경할 수 없도록 하는 등의 보안처리를 할 수 있다. 처리가능 파라미터를 4자 이내로 조합하여 지정한다. 지정을 생략한 경우 기본값은 PCB 문의 PROCOPT의 값을 따른다.
|
INDICES |
어떤 Secondary Index가 인덱스 세그먼트에 대한 검색 필드를 담고 있는지 지정한다. |
SENFLD 문
SENSEG 문과 함께 사용되어 애플리케이션에서 어떤 필드를 사용할 수 있는지 지정한다. 단, SENFLD 문을 지정했을 경우 그 세그먼트에 대해서는 DLET/REPL/ISRT 콜은 발행할 수 없다.
SENFLD 문의 형식은 다음과 같다.
SENFLD NAME=name, START=startpos [,REPLACE|REPL={YES|NO}]
항목 | 설명 |
---|---|
NAME |
DBD를 생성할 때 FIELD 문을 통해 정의되었던 필드의 이름을 지정한다. |
START |
사용자 I/O 영역에서 해당 필드의 시작 위치를 지정한다. 주의사항은 다음과 같다.
|
REPLACE |
REPLACE 요청을 통해 해당 필드가 변경될 수 있는지의 여부를 지정한다. |
PSBGEN 문
PSBGEN 문은 애플리케이션의 속성을 지정한다.
PSBGEN 문의 형식은 다음과 같다.
PSBGEN PSBNAME=name [,LANG={COBOL|PL/I|ASSEM|PASCAL|blank}] [,MAXQ={0|nr}] [,CMPAT={NO|YES}] [,IOASIZE=value] [,SSASIZE=value] [,IOEROPN={n|(n,WTOR)}] [,OLIC={NO|YES}] [,GSROLBOK={NO|YES}] [,LOCKMAX={0|n}]
항목 | 설명 |
---|---|
PSBNAME |
현재 정의하는 PSB 블록의 이름을 지정한다. |
LANG |
메시지 프로그램 또는 배치 프로그램이 작성된 컴파일러 언어를 지정한다. 다음과 같은 약자를 사용할 수 있다.
|
MAXQ |
Qx 명령어 코드를 포함한 데이터베이스 호출의 최대 개수를 지정한다. |
CMPAT |
BMP 프로그램 또는 메시지 프로그램에서의 호환성을 표시한다. 만약 CMPAT=YES이면 해당 PSB는 맨 앞에 I/O PCB를 포함하고 있는 것으로 간주된다. |
IOASIZE |
애플리케이션에서 사용하는 I/O 영역의 최대 크기를 지정한다. |
SSASIZE |
애플리케이션에서 사용하는 SSA의 최대 길이를 지정한다. |
LOCKMAX |
애플리케이션이 동시에 획득할 수 있는 LOCK의 최대 개수를 지정한다. |
OpenFrame HiDB에서는 PSBGEN 문의 IOEROPN, OLIC, GSROLBOK 파라미터는 지원하지 않는다. |
END 문
컨트롤문의 종료를 지정한다.
3.4. 사용예제
다음은 PSBGEN 프러시저를 사용하여 PSB 블록을 생성하는 JCL 예제이다.
//PSBGEN JOB MSGLEVEL=1 // EXEC PSBGEN,MBR=APPLPGM1 //C.SYSIN DD * PCB TYPE=TP,NAME=OUTPUT1,PCBNAME=OUTPCB1 PCB TYPE=TP,NAME=OUTPUT2,PCBNAME=OUTPCB2 PCB TYPE=DB,DBDNAME=PARTMSTR,PROCOPT=A,KEYLEN=100 SENSEG NAME=PARTMAST,PARENT=0,PROCOPT=A SENSEG NAME=CPWS,PARNET=PARTMAST,PROCOPT=A SENSEG NAME=POLN,PARENT=PARTMAST,PROCOPT=A SENSEG NAME=OPERTON,PARENT=PARTMAST,PROCOPT=A SENSEG NAME=INVSTAT,PARENT=OPERTON,PROCOPT=A SENSEG NAME=OPERSGMT,PARENT=OPERTON PSBGEN LANG=COBOL,PSBNAME=APPLPGM1 END /*
3.5. 유의사항
PSBGEN 유틸리티 프로그램을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
코드 0을 반환한다.
-
에러가 발생한 경우
에러가 발생한 경우에는 해당 에러 메시지를 SYSPRINT DD로 출력하고 각 에러에 해당하는 코드를 반환한다.
DBDGEN 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 12
Unrecoverable 에러로, 다음의 경우에 발생한다.
-
SYSLIN DD 혹은 SYSLMOD DD를 제공하지 않은 경우
-
SYSLIN DD 혹은 SYSLMOD DD의 유형이 맞지 않는 경우
-
SYSIN DD 스크립트 문장의 문법 오류가 발생한 경우
16
시스템 에러로, 다음의 경우에 발생한다.
-
OpenFrame 시스템 라이브러리 초기화에 실패한 경우
-
SYSLIN DD 또는 SYSLMOD DD OPEN 에러가 발생한 경우
-
SYSIN DD 또는 SYSLIN DD 읽기 에러가 발생한 경우
-