데이터셋 소개

본 장에서는 데이터셋 액세스 메소드, 데이터셋 이름, SMS 클래스, 카탈로그 등록과 관리 그리고 데이터셋 처리 등 데이터셋 전반에 대해서 설명한다.

1. 개요

논리적으로 연결된 데이터 레코드의 집합을 데이터셋이라 하며, 레코드는 애플리케이션에서 사용되는 정보의 기본 단위이다. 데이터셋과 UNIX 파일과의 근본적인 차이점은 데이터셋을 사용하는 경우에는 레코드 단위의 I/O를 지원해주는 액세스 메소드가 제공된다는 점이다.

데이터셋은 하드디스크나 마그네틱 테이프와 같은 이차 저장장치에 저장되며, 저장장치의 기본 단위는 볼륨이다. 하드디스크에는 모든 종류의 데이터셋이 저장될 수 있지만, 마그네틱 테이프에는 순차 데이터셋(SDS)만 저장될 수 있다.

OpenFrame에서는 마그네틱 테이프 디바이스를 실제로 지원하지 않고, 대신에 하드디스크의 특정 영역을 마그네틱 테이프 볼륨으로 매핑하는 방법을 제공하며, 옵션에 따라서 마그네틱 테이프 볼륨에 저장된 데이터셋을 압축해서 보관할 수 있다.

2. 액세스 메소드

데이터를 레코드 단위로 읽어 들이고 저장하는 데 사용되는 기술로서, 각 액세스 메소드는 자신만의 데이터셋 구조를 가지고 데이터를 저장하며, 데이터셋을 처리하는 인터페이스와 유틸리티 프로그램을 가지고 있다. 각 데이터셋을 처리하는 데 사용되는 액세스 메소드는 그 데이터셋의 구조로 식별된다. 예를 들면 순차 데이터셋을 처리하려면 BSAM이나 QSAM을 사용해야 한다.

OpenFrame에서는 Mainframe의 EXCP(EXecute Channel Program)에 의한 물리 I/O 방법은 제공하지 않는다. 일반적인 리호스팅 대상 업무가 Mainframe의 저수준 액세스 메소드의 매크로나 함수를 직접 사용하는 일은 드문 일이기 때문이다. OpenFrame은 Mainframe의 매크로나 함수를 1대 1로 대응하여 호환시키는 것을 목표로 하고 있지 않다. 오히려, 논리적/외부적인 수준의 기능이나 개념의 차이로 리호스팅할 경우 큰 비용을 초래할 수 있는 문제에 대해서 비용 효율적인 솔루션을 제공하는 것을 주요 목표로 하고 있다.

다음은 데이터셋의 액세스 메소드 종류와 그에 대한 설명이다.

  • BDAM(Basic Direct Access Method)

    프로그램에서 원하는 대로 데이터 레코드를 저장하며, 0부터 시작하는 데이터 레코드의 상대 주소로 직접 접근한다. BDAM 데이터셋에서는 한 블록 크기만큼의 데이터를 하나의 레코드로 인식한다.

    BDAM 액세스 메소드는 가장 기본적인 형태의 엑세스 메소드로 사용상의 제약이 많아서 최근의 업무 프로그램에서는 많이 사용되지 않는 편이다.

  • BSAM(Basic Sequential Access Method)

    데이터 레코드를 입력된 순서대로 저장하는 방식으로 구성된 데이터셋을 순차 데이터셋이라고 한다. 프로그램은 여러 레코드들을 하나의 블록으로 구성하여 저장하며, BSAM은 블록 단위로 데이터를 읽거나 쓸 수 있다.

    OpenFrame에서는 순차 데이터셋을 처리하기 위해서, 데이터 블록에 대한 버퍼 관리를 사용자에게 맡기는 BSAM 액세스 메소드 대신, 액세스 메소드에서 사용자를 대신해 버퍼를 관리해 주는 QSAM 액세스 메소드를 제공한다.

  • QSAM(Queued Sequential Access Method)

    BSAM과 마찬가지로 입력된 순서대로 레코드를 저장한다. QSAM은 I/O 성능향상을 위해 버퍼링 기법을 사용하며, 사용자를 대신해 버퍼를 관리해 준다. 즉, GET 인터페이스는 입력 버퍼로부터 다음 순차 레코드를 읽고, PUT 인터페이스로 다음 순차 레코드를 출력 버퍼에 기록한다. 디스크에 있는 데이터를 입력 버퍼로 읽어들이거나, 출력 버퍼에 있는 데이터를 디스크에 저장하는 역할은 액세스 메소드가 수행한다.

  • ISAM(Indexed Sequential Access Method)

    ISAM으로 처리되는 데이터셋은 색인 순차 데이터셋이라고 불린다. ISAM은 키 필드의 순서대로 레코드를 저장하며, 키 필드로 데이터 레코드를 조회한다.

    OpenFrame에서는 ISAM 데이터셋을 내부적으로 VSAM의 KSDS 데이터셋으로 매핑해서 지원한다. 하지만 향후 데이터셋 관리의 통일성을 위해서는 VSAM의 KSDS 데이터셋으로 전환해서 사용할 것을 권장한다.

  • BPAM(Basic Partitioned Access Method)

    데이터를 구분 데이터셋(PDS: Partitioned Data Set)의 멤버로서 저장한다. 구분 데이터셋 각각의 멤버는 하나의 순차 데이터셋으로 볼 수 있다.

    구분 데이터셋은 데이터셋 내부에 각각의 멤버 이름으로 데이터 주소를 찾을 수 있는 디렉터리 정보를 포함한다. OpenFrame에서 구분 데이터셋은 UNIX 파일 시스템의 디렉터리로 구성된다.

    Hitachi Mainframe에는 LIME이라는 액세스 메소드가 존재한다. OpenFrame에서는 이를 지원하지 않는다. LIME은 Non-VSAM의 PDS와 비슷하게 하나의 데이터셋에 여러 개의 멤버를 저장한다. 반면 구현 측면에서는 VSAM을 기반으로 PDS의 기능을 구현하고 있으며, 멤버 단위의 Lock 처리가 가능한 것이 특징이다.

  • VSAM(Virtual Storage Access Method)

    VSAM은 디스크에 저장된 고정 길이 레코드나 가변 길이 레코드에 대한 직접 처리(Direct Processing) 또는 순차 처리(Sequential Processing)를 하는데 사용된다. 그리고 VSAM에 의해 구성된 데이터는 빠른 접근을 위해 반드시 카탈로그에 등록되어야 한다.

    VSAM 데이터셋은 다음과 같이 4가지 유형으로 분류된다.

    유형 설명

    ESDS(Entry-Sequenced Data Set)

    입력된 순서대로 레코드를 저장하며, 새로운 레코드는 데이터셋의 뒷부분에 추가된다. 레코드에 대한 순차 처리가 가능하고 상대 주소(RBA: Relative Byte Address)를 사용한 직접 처리도 가능하다.

    KSDS(Key-Sequenced Data Set)

    레코드는 키 필드의 오름차순으로 저장되며, 키 필드로 레코드에 대한 직접 처리를 할 수 있다. TSAM에서는 상대 주소로 KSDS 데이터셋에 대한 직접 처리는 할 수 없다.

    RRDS(Relative Record Data Set)

    레코드 번호(RRN: Relative Record Number) 순서대로 레코드를 저장하며, 이 레코드 번호로만 레코드에 대한 직접 처리가 가능하다. RRDS에는 고정 길이 RRDS와 가변 길이 RRDS의 2가지 종류가 있다.

    LDS(Linear Data Set)

    LDS는 데이터를 레코드 단위가 아닌 블록 단위로 저장한다. LDS는 다른 VSAM 데이터셋과는 다르게 어떠한 컨트롤 정보도 데이터셋 안에 담고 있지 않다. TSAM에서는 LDS를 지원하지 않는다.

  1. OpenFrame에서는 VSAM에 대응되는 제품으로 TSAM을 제공한다. TSAM에 대한 자세한 내용은 VSAM 데이터셋을 참고한다.

  2. Hitachi Mainframe에서는 LDS 유형을 FDS(Flat Data Set) 유형으로 구분한다.

  3. VSAM 데이터셋 유형에 대한 자세한 내용은 VSAM 데이터셋 유형을 참고한다.

새로운 데이터셋에 대한 액세스 메소드를 선택하려면 순차처리를 할 것인지 아니면 직접처리를 할 것인지 그리고 어떤 종류의 처리를 원하는지 등을 먼저 고려해야 한다. 예를 들면 RRDS는 직접처리만 하는 애플리케이션이나 직접 처리 또는 순차 처리를 하는 애플리케이션에 적합하다. BSAM(순차 데이터셋)이나 VSAM ESDS 데이터셋은 순차 처리를 하는 애플리케이션에 적합하다.

3. 데이터셋 이름

새로운 데이터셋을 생성할 때마다 사용자는 데이터셋에 유일한 이름을 작성해야 한다(일반적으로 데이터셋의 이름은 JCL에서 dsname으로 주어진다).

데이터셋의 이름은 하나의 이름 세그먼트 또는 여러 개의 연결된 이름 세그먼트로 구성되며, 각각의 이름 세그먼트는 Qualification으로 레벨을 나타낸다. 예를 들어 TPLAB.IGKANG.TEST3이라는 데이터셋 이름은 3개의 이름 세그먼트로 구성되어 있다. 첫 번째 이름 세그먼트인 TPLAB은 최상위 Qualifier(High Level Qualifier)라고 불리고, 마지막 이름 세그먼트인 TEST3은 최하위 Qualifier(Low Level Qualifier)라고 불린다.

데이터셋 이름은 다음과 같은 규칙을 가져야 한다.

  • 이름 세그먼트당 최대 8개의 문자로 구성된다.

  • 세그먼트의 첫 번째 문자는 알파벳(A-Z)이나 기호문자(@,#,$) 중 하나로 시작한다.

  • 세그먼트의 나머지 7개의 문자는 알파벳(A-Z), 숫자(0-9), 기호문자(@,#,$) 또는 하이픈(-) 중 선택한다.

  • 이름 세그먼트를 구분하기 위해 점(.)을 사용한다.

  • 전체 데이터셋 이름은 이름 세그먼트와 점(.)을 포함하여 44문자로 제한한다.

  1. IBM Mainframe의 TSO나 Hitachi 및 Fujitsu Mainframe의 TSS 환경에서는 사용자 ID로 시작하는 데이터셋 이름의 개념이 존재한다. 해당 환경에서 apostrophe(') 문자로 둘러싸지 않은 영구 데이터셋 이름의 맨 앞에 사용자 ID를 수식자로 추가하여 시스템에 데이터셋 이름으로 전달하는 방식이다.

  2. OpenFrame/Batch XSP TJES에서 전체 데이터셋 이름은 26 문자로 제한한다. 따라서 OpenFrame/Batch XSP TJES를 사용할 경우 전체 데이터셋 이름은 26 문자로 생성할 것을 권고한다.

  3. VSAM 데이터셋의 이름은 클러스터 이름만 지정하고 컴포넌트 이름을 지정하지 않으면 42 문자로 제한한다. VSAM 데이터셋 이름에 대한 자세한 내용은 VSAM 데이터셋 이름을 참고한다.

4. 스토리지 관리

새로운 데이터셋을 생성할 때마다 JOB을 실행시키는 사용자가 데이터셋이 저장되어야 하는 UNIT이나 볼륨 시리얼을 JCL에 직접 기술하는 방식은 매우 비효율적이다. 또 JOB을 실행시키는 각 사용자에게 스토리지 관리를 맡겨버린다면, 스토리지 관리에 대한 체계가 없어서 시간이 지남에 따라 스토리지를 관리하기가 더욱 힘들어질 것이다.

따라서 본 절에서는 OpenFrame 시스템에서 SMS 클래스들(스토리지 클래스, 매니지먼트 클래스, 데이터 클래스)을 사용하여 효과적으로 스토리지를 관리할 수 있는 방법에 대해서 설명한다.

4.1. 스토리지 클래스

스토리지 관리자는 현재 시스템에서 사용 가능한 모든 스토리지에 대해 각 스토리지 디바이스의 성능과 용량을 기준으로 용도를 구분한 뒤 구분된 스토리지 디바이스들을 환경설정 중 sms 서브젝트의 스토리지 클래스로 등록한다.

시스템에 스토리지 클래스가 등록된 이후에는 JCL의 DD 문장에 UNIT이나 VOL 파라미터로 직접 볼륨 시리얼을 지정하는 방법 대신, JCL의 DD 문장에 스토리지 클래스를 지정해 줄 수 있다. 스토리지 클래스가 지정된 데이터셋은 해당 스토리지 클래스로 분류된 스토리지 볼륨 시리얼 중 한 곳에 데이터 공간이 할당된다.

데이터셋의 이름에서 데이터셋의 속성을 유추할 수 있다면 JCL의 DD 문장에 직접 스토리지 클래스를 지정하지 않고서도, 자동으로 스토리지 클래스가 지정되게 할 수 있다.

스토리지 관리자가 ACS(Automatic Class Selection) 규칙을 등록하게 되면, 해당 ACS 규칙에 부합하는 데이터셋은 스토리지 관리자가 설정한 스토리지 클래스로 지정되고, 그 스토리지 클래스로 미리 분류된 볼륨 시리얼 중 한 곳에 데이터셋의 데이터 공간이 할당된다.

  1. sms와 acs 설정에 대한 자세한 내용은 OpenFrame Base "환경설정 안내서"를 참고한다.

  2. 스토리지 클래스의 비슷한 기능으로 Hitachi Mainframe에는 기억 풀(Storage Pool)이라는 기능이 존재한다. 이것은 동일한 타입의 장치 여럿을 묶어 하나의 논리적인 기억 장치로 사용하는 것을 가능하게 한다. JCL의 DD문의 UNIT 파라미터로 기억 풀의 이름을 지정하여 사용한다. OpenFrame에서는 기억 풀에 의한 저장소 할당을 지원하지 않는다.

4.2. 매니지먼트 클래스

스토리지 관리에는 신규 데이터셋에 대한 데이터 공간의 할당뿐만 아니라 만기가 지난 데이터셋에 대한 삭제 작업도 포함한다.

스토리지 관리자는 데이터셋의 보관기간에 따라 데이터셋의 클래스를 분류한 뒤, 매니지먼트 클래스로 등록한다. 이렇게 등록된 매니지먼트 클래스는 앞에서 설명한 스토리지 클래스와 마찬가지로 JCL의 DD 문장에 직접 기술해서 사용하거나 또는 ACS 규칙을 등록해서 자동으로 데이터셋에 매니지먼트 클래스가 지정되도록 설정할 수 있다.

매니지먼트 클래스가 지정된 데이터셋은 만기일이 지나면 OpenFrame 데이터셋 관리 서버인 ofrdmsvr에 의해 자동으로 삭제된다.

4.3. 데이터 클래스

데이터 클래스는 공통적으로 많이 사용되는 데이터셋의 속성을 기준으로 클래스를 등록한다. 데이터 클래스를 사용하면 사용자가 보다 쉽게 JCL을 작성할 수 있다.

데이터 클래스로 정의된 데이터셋의 속성은 앞에서 설명한 스토리지 클래스나 매니지먼트 클래스와는 달리 JCL 파라미터로 변경할 수 있다.

다음의 예제는 JCL을 사용해서 새로운 데이터셋을 생성하는 방법을 보여준다. 이 예제에서는 ACS 규칙을 사용하지 않고 JCL에 직접 SMS 클래스를 지정해서 데이터셋을 생성한다(아래 예제에서는 스토리지 클래스가 직접 지정되었기 때문에 VOL 파라미터와 UNIT 파라미터는 무시된다).

//MYJOB   JOB
//STEP1   EXEC PGM=IEFBR14
//MKDS1   DD   DSNAME=IGKANG.TEST.DS0001,DISP=(NEW,CATLG),
//              DATACLAS=TEST,MGMTCLAS=NEVER,
//              STORCLAS=SECURE,VOL=SER=XXXXXX,UNIT=SYSDA

5. 카탈로그 등록

데이터셋의 물리적인 저장장소를 관리하기 위해 OpenFrame 시스템은 VTOC(Volume Table of Contents)와 카탈로그를 사용한다.

VTOC는 한 볼륨 안에 있는 데이터셋의 목록을 관리하고, 데이터셋에 대한 기본적인 정보와 물리적인 디스크 주소 그리고 데이터셋의 크기를 관리한다. 카탈로그는 데이터셋의 여러 가지 속성과 데이터셋이 위치한 볼륨에 대한 정보를 기술한다.

데이터셋은 다음의 여러 가지 방법을 통해 카탈로그에 등록된다.

  • JCL(Job Control Language)의 DISP 파라미터

  • AMS(Access Method Service)의 ALLOCATE 또는 DEFINE 명령

  • TSO(Time Sharing Option)의 ALLOCATE 명령

카탈로그에 등록되지 않았지만, 이미 존재하는 데이터셋은 IDCAMS(JSCVSUT/KQCAMS) 유틸리티의 DEFINE RECATALOG 명령을 통해 카탈로그에 등록할 수 있다.

  1. 카탈로그에 대한 보다 자세한 내용은 통합 카탈로그를 참고한다.

  2. IDCAMS에 해당하는 Hitachi VOS3 VSAM 유틸리티는 JSCVSUT이고, XSP 및 MSP 시스템의 VSAM 유틸리티는 KQCAMS이다. IDCAMS(JSCVSUT/KQCAMS) 유틸리티에 대한 자세한 내용은 "OpenFrame 유틸리티 참조 안내서"를 참고한다.

6. 데이터셋 처리

OpenFrame 환경에서 모든 프로그램은 다음의 순서대로 데이터셋을 처리한다.

  1. 데이터셋을 할당해서 프로그램과 데이터셋을 논리적으로 연결한다. (Allocate)

    데이터셋을 처리하려면 먼저 해당하는 데이터셋을 할당한 후 각 액세스 메소드가 제공하는 인터페이스를 사용하여 데이터에 접근할 수 있다.

    데이터셋 할당은 다음의 2가지 작업을 의미한다.

    • 새로운 데이터셋을 위한 디스크 공간을 할당한다.

      다음의 방법으로 데이터셋을 할당할 수 있다.

      구분 설명

      AMS(Access Method Service)

      IDCAMS(JSCVSUT/KQCAMS)의 ALLOCATE 명령을 이용하여 데이터셋을 할당한다.

      JCL(Job Control Language)

      모든 데이터셋은 JCL을 사용해서 직접 정의할 수 있다.

    • JOB STEP과 사용하려는 데이터셋을 논리적으로 연결한다.

  2. DDNAME을 사용해서 데이터셋을 식별하고 데이터셋을 연다. (Open)

  3. 액세스 메소드를 사용해서 데이터를 읽거나 기록한다. (Read/Write)

  4. 사용한 데이터셋을 닫는다. (Close)

  5. 할당된 데이터셋을 해제한다. (Unallocate)

VSAM 데이터셋 이외의 Non-VSAM 데이터셋에 대해서도 처리 절차는 동일하다.

6.1. Allocate/Unallocate

사용자가 기존에 있는 데이터셋에 접근하려고 할 때 시스템은 물리적인 저장장치의 주소를 찾기 위해 JCL에서 사용자가 제공한 데이터셋에 대한 정보와 카탈로그에 등록된 데이터셋에 대한 정보를 활용한다.

사용자가 새로운 데이터셋을 생성할 때, 시스템은 사용자가 제공한 데이터셋에 대한 정보에 따라서 디스크에 데이터셋의 저장공간을 확보한다. 이처럼 기존에 존재하는 데이터셋에 대한 저장장치의 주소를 찾는 작업 또는 새로운 데이터셋에 대한 저장공간을 확보하는 작업을 할당(Allocate)이라고 한다.

  • 데이터셋을 새로 생성해서 사용하기 위한 할당을 하는 경우 새로운 데이터셋이 저장될 볼륨과 장치 정보 그리고 데이터셋의 크기 정보를 필요로 한다.

  • 기존에 존재하는 데이터셋을 사용하기 위한 할당은 볼륨과 장치 정보를 필요로 한다. 데이테 셋이 카탈로그에 등록되어 있다면 단순히 데이터셋의 이름만 지정하면 된다.

시스템은 데이터셋을 처리하기 위해 데이터셋을 할당할 때, DCB(Data Control Block)라고 불리는 구조체를 준비한다. 이 DCB 구조체에는 하나의 데이터셋을 처리하기 위해 필요한 정보와 실시간으로 I/O 리포트를 하기 위한 버퍼로 이루어져 있다.

데이터셋이 처리되기 전에 반드시 할당되어야 하고 데이터셋이 처리된 이후에는 할당이 해제(Unallocate)되어야 한다. JCL에서 기술되는 데이터셋 후처리(disposition)는 시스템이 데이터셋의 할당을 해제할 때 어떻게 처리해야 하는지를 지정한다. 예를 들어 임시 데이터셋에 대한 처리는 작업이 끝날 때까지 데이터셋을 유지해야 하는지, 아니면 바로 삭제되어야 하는지를 결정하고, 영구 데이터셋에 대한 처리는 마스터 카탈로그에 등록되어야 하는지 또는 사용자 카탈로그에 등록되어야 하는지에 대해 결정한다.

6.2. Open/Close

애플리케이션은 특정 데이터셋에 접근하기 전에 반드시 Open 인터페이스를 사용해서 데이터셋을 열어야 한다. Open 인터페이스는 DCB를 통해 애플리케이션과 액세스 메소드(Access Method) 그리고 데이터셋 사이를 논리적으로 연결한다.

Open 인터페이스는 DCB 구조체를 완성하고 데이터셋을 초기화하며 데이터셋 처리에 필요한 시스템 내부 버퍼를 준비한다.

DCB 구조체는 다음의 3가지 정보로부터 완성된다.

  • 카탈로그 정보

  • JCL DD 문장

  • 애플리케이션

Close 인터페이스는 애플리케이션과 데이터셋 사이의 연결을 끊는다.

데이터셋이 닫힐 때 시스템은 다음과 같은 작업을 한다.

  • 물리적으로 기록되지 않은 데이터를 디스크에 기록한다.

  • 데이터셋 크기 정보 등 카탈로그 정보를 수정한다.

  • 데이터셋 처리에 사용되었던 DCB 구조체를 해제한다.

6.3. OPEN 모드

데이터셋을 열 때에는 OPEN 모드를 지정해야 한다. OPEN 모드는 애플리케이션이 데이터셋을 읽고 있는지, 데이터셋을 기록하고 있는지, 아니면 2가지 모두를 하고 있는지를 설정하기 위한 모드이다.

데이터셋은 다음의 4가지 OPEN 모드 중 하나의 모드로 지정된다.

  • 입력 모드(Input Mode)

    입력 모드를 지정하면 데이터셋을 읽기만 할 수 있다. 레코드를 기록하거나 수정 또는 삭제하여 데이터셋을 변경하려고 시도하면 에러가 발생한다. 존재하지 않는 데이터셋을 열려고 하는 경우 OPTIONAL 옵션을 지정하지 않는 한 에러가 발생한다.

  • 출력 모드(Output Mode)

    출력 모드를 지정하면 애플리케이션이 레코드를 기록할 수 있는 새로운 데이터셋을 생성한다. 데이터셋에서 레코드를 읽으려고 시도하면 에러가 발생하고, 이미 존재하는 데이터셋을 기록하기 위해 출력 모드로 데이터셋을 열면 기존의 모든 레코드는 삭제된다.

  • 입출력 모드(Input/Output Mode)

    입출력 모드를 지정하면 데이터셋을 읽고 쓰기를 모두 할 수 있다. 데이터셋이 존재하지 않으면, OPTIONAL 옵션을 지정하지 않는 한 에러가 발생한다.

  • 확장 모드(Extend Mode)

    확장 모드는 데이터셋에 쓰기만을 할 수 있는 출력 모드와 비슷하지만, 이 모드는 이미 존재하는 데이터셋에 쓰기를 할 때 사용된다. 애플리케이션은 파일의 끝 부분에 새로운 레코드를 기록한다. 데이터셋이 존재하지 않으면, OPTIONAL 옵션을 지정하지 않는 한 에러가 발생한다.

해당 데이터셋이 존재하지 않을 경우 OPTIONAL 옵션이 지정되어 있다면 데이터셋을 생성한다.

6.4. 액세스 모드

데이터셋의 액세스 모드는 데이터셋에 있는 레코드를 처리하는 순서를 의미하며, 데이터셋 자체의 속성이 아니라 애플리케이션에서 데이터셋을 사용하려고 하는 방식을 나타낸다.

데이터셋은 다음의 3가지 액세스 모드 중 하나의 모드로 지정된다.

  • 순차 액세스(Sequential Access)

    순차 액세스 모드는 레코드를 첫 번째 레코드부터 마지막 레코드까지 순차적으로 읽거나 쓰는 방법을 의미한다. 순차적으로 구성된 데이터셋은 순차적으로만 접근할 수 있다. ESDS, RRDS 또는 KSDS 데이터셋은 모두 레코드에 대한 순서가 존재하기 때문에 순차적으로 액세스할 수 있다. RRDS의 경우에 순서는 상대 레코드 번호(RRN)에 의해서 정해지고, KSDS의 경우에 순서는 기본 키 또는 보조 키 중 하나인 영문자(Alphanumeric) 키를 통해서 정해진다.

  • 임의 액세스(Random Access)

    임의 액세스 모드는 원하는 순서대로 레코드를 처리하는 것을 의미한다. ESDS, RRDS나 KSDS 모두 임의 액세스 모드를 지원한다. 임의 액세스 방식으로 데이터셋의 레코드를 읽으려면 사용자는 데이터셋의 구성 방식에 따라 RBA, RRN, 키 값과 같은 레코드 인식자를 지정해야 한다.

  • 동적 액세스(Dynamic Access)

    동적 액세스 모드는 애플리케이션을 실행하는 동안 데이터셋에 대해서 순차 액세스 모드와 임의 액세스 모드 모두를 사용할 수 있다는 것을 의미한다. ESDS, RRDS나 KSDS 모두 동적 액세스 모드를 지원한다.

6.5. 레코드 액세스

데이터셋이 열린 후에는 액세스 메소드에서 제공하는 다양한 인터페이스를 통해서 데이터셋에 있는 레코드를 처리할 수 있다. 예를 들면 READ 인터페이스를 통해서 데이터셋에 있는 레코드를 읽을 수 있고, WRITE 인터페이스를 통해서 데이터셋에 새로운 레코드를 추가할 수 있다.

다음의 4가지 레코드 액세스 인터페이스를 사용하여 데이터셋의 레코드를 관리한다.

  • WRITE(레코드 삽입/추가)

    순차 데이터셋의 모든 레코드는 데이터셋의 마지막에 추가된다.

    VSAM ESDS에는 새로운 레코드를 중간에 추가할 수 없으며, VSAM KSDS나 RRDS의 경우에는 레코드 키를 통해 추가되는 레코드의 위치를 지정할 경우 중간에 레코드를 추가할 수 있다. 해당하는 레코드 키에 이미 레코드가 있는 경우에는 DUPLICATE RECORD 에러 코드가 반환된다.

  • READ(레코드 읽기)

    • 순차 액세스

      애플리케이션이 데이터셋에 처음으로 순차 액세스를 시도하면 항상 첫 번째 레코드부터 읽기 시작한다. 만약 이전에 데이터셋에 임의 액세스를 한 경우라면 내부 레코드 포인터가 변경되어 있을 수 있으므로 항상 START 인터페이스를 사용해서 레코드 포인터를 초기화한 다음 순차 액세스 인터페이스를 사용하는 것이 바람직하다.

    • 임의 액세스

      VSAM ESDS, KSDS나 RRDS는 레코드 인식자를 통해 임의 액세스를 지원한다. 임의 액세스 모드는 내부 레코드 포인터에 영향을 받지 않는다. 읽고자 하는 레코드를 찾기 위해서는 VSAM 데이터셋 종류에 따라 다음과 같은 정보를 제공해야 한다.

      데이터셋 정보

      KSDS

      KEY

      RRDS

      RRN

      ESDS

      RBA

      ESDS에 대해서도 RBA를 이용한 임의 액세스가 가능하지만 일반적인 업무 애플리케이션에서 사용하기에는 적합하지 않다.

  • REWRITE(레코드 수정)

    액세스 메소드에서 제공하는 REWRITE 인터페이스를 사용하면 레코드의 내용을 수정할 수 있다. 단, VSAM KSDS의 레코드를 수정할 때에는 기본 키의 내용은 수정할 수 없다.

  • DELETE(레코드 삭제)

    액세스 메소드에서 제공하는 DELETE 인터페이스를 사용하면 데이터셋의 레코드를 삭제할 수 있다. VSAM RRDS에서 레코드를 삭제하면 삭제된 레코드가 사용하던 공간을 재사용할 수 있다. 단, VSAM ESDS에서는 레코드를 삭제할 수 없다.