DL/I 데이터베이스 서비스

본 장에서는 DL/I 데이터베이스 서비스와 관련된 EXEC DLI 인터페이스, CBLTDLI에 대해 설명한다.

1. 개요

OSC 애플리케이션 서버는 IBM Mainframe IMS/DB에 대응하는 OpenFrame의 HiDB 제품을 기반으로 DL/I 데이터베이스 서비스 기능을 제공한다. DL/I 데이터베이스 서비스는 EXEC DLI 명령어 인터페이스와 CBLTDLI 호출 인터페이스의 2가지 인터페이스를 지원한다.

EXEC DLI 명령어 인터페이스

EXEC DLI 인터페이스는 DL/I 데이터베이스 접근을 위한 명령어 인터페이스이다. OSC 애플리케이션 서버는 EXEC DLI 인터페이스를 통하여 명령어를 실행할 때마다 현재 상태 코드 및 DL/I과 관련된 정보들을 애플리케이션이 프로그램이 접근할 수 있도록 DIB(DL/I Interface Block)라는 컨트롤 블럭을 제공한다. 사용자는 이 블록에 저장된 상태 코드를 통해 명령어가 성공적으로 실행되었는지 확인하도록 한다.

DIB를 통하여 다음과 같은 정보를 얻을 수 있다.

구분 설명

DIBSTAT

2Bytes 문자열로 EXEC DLI 인터페이스를 통하여 명령어를 실행한 후 상태 코드가 저장된다.

DIBSEGM

8Bytes 문자열로 GN, GNP, GU, ISRT 명령어가 성공적으로 실행된 경우 가장 낮은 수준의 세그먼트의 이름이 저장된다.

DIBSEGLV

2Bytes 문자열로 GN, GNP, GU, ISRT 명령어가 성공적으로 실행된 경우 가장 낮은 세그먼트 레벨값이 저장된다.

DIBKFBL

2Bytes 바이너리 숫자로 GN, GNP, GU 명령어에서 KEYFEEDBACK 옵션을 사용한 경우 연쇄 키(concatenated key)의 길이가 저장된다.

DL/I 데이터베이스로의 접근은 PSB(Program Specification Block)를 스케줄링함으로써 시작한다.

PSB는 PCB(Program Communication Block)들의 집합체이고, PCB는 애플리케이션이 어떤 뷰(View)를 통하여 데이터베이스를 바라볼지를 정의한다. OSC 애플리케이션은 여러 PCB 타입 중 DB-PCB 타입만 지원한다. 각 명령어는 PSB에 설정된 PCB를 이용하여 어떤 데이터베이스를 접근할 것인지를 지정한다.

다음은 EXEC DLI 명령어의 사용 예를 보여준다.

* PSB 스케줄링한다.
EXEC DLI SCHD PSB(PSB-NAME) END-EXEC.

* FIELDA의 필드값이 123인 SEGA 세그먼트 값을 가지고 온다.
MOVE ‘123’ TO FIELD1.
EXEC DLI GU SEGMENT(SEGA) INTO(SEGA-AREA) WHERE(FIELDA=FIELD1) END-EXEC.

* PSB 사용을 종료한다.
EXEC DLI TERM END-EXEC.

스케줄링이 성공하면 다음 절에서 설명하는 명령어들을 이용하여 PSB에 지정된 데이터베이스에 접근할 수 있다.

DL/I 기능 및 HiDB에 대한 자세한 정보는 OpenFrame "HiDB 안내서"를 참고한다.

CBLTDLI 호출 인터페이스

CBLTDLI 인터페이스는 EXEC DLI 인터페이스와 별도로 COBOL 프로그램에서 CALL 키워드를 이용하여 DL/I 데이터베이스에 접근할 수 있도록 제공되는 호출 인터페이스이다. CBLTDLI 인터페이스는 OSC 애플리케이션 프로그램뿐만 아니라, OpenFrame Batch 애플리케이션 프로그램에서도 사용이 가능하다. 그러나 OpenFrame Batch 애플리케이션 프로그램과는 사용 방식에 차이가 있다.

2. EXEC DLI 명령어 인터페이스

EXEC DLI 명령어 인터페이스는 데이터베이스 접근 제어 명령어 그룹과 접근 명령어 그룹으로 나누어진다.

EXEC DLI 명령어
  • DL/I 데이터베이스 접근 제어 명령어

    다음은 DL/I 데이터베이스 접근 제어 명령어 목록이다. 각 명령어에 대한 자세한 설명은 해당 절을 참고한다.

    명령어 설명

    SCHD

    PSB를 스케줄링한다.

    TERM

    PSB의 사용이 끝났음을 알리는 명령어이다.

  • DL/I 데이터베이스 접근 명령어

    다음은 DL/I 데이터베이스 접근과 관련된 명령어 목록이다. 각 명령어에 대한 자세한 설명은 해당 절을 참고한다.

    명령어 설명

    DLET

    데이터베이스로부터 세그먼트와 해당 세그먼트에 종속된 항목들을 삭제한다.

    GN

    데이터베이스로부터 순차적으로 세그먼트를 읽어온다.

    GNP

    특정 부모에게 종속된 세그먼트만 읽어온다.

    GU

    특정 세그먼트를 가져오고, 순차 검색을 위하여 시작 지점을 지정한다.

    ISRT

    하나 이상의 새로운 세그먼트를 추가한다.

    REPL

    특정 세그먼트의 하나 이상의 필드값을 변경한다.

2.1. SCHD (SCHEDULE)

PSB를 스케줄링한다. SCHD 명령어는 DL/I 데이터베이스에 접근하기 전에 PSB 스케줄링을 통해서 접근할 것을 DL/I에 통보하는 기능을 한다.

  • 문법

    EXEC DLI SCHD [option …] END-EXEC.
  • 옵션

    옵션 설명

    PSB

    스케줄링하려는 PSB를 지정한다.

    더 이상 PSB를 사용하지 않거나 다른 PSB를 사용하려면 이전의 PSB를 TERM 명령어를 통해서 종료한다.

2.2. TERM (TERMINATE)

PSB의 사용을 끝났음을 알린다. TERM 명령어를 사용하면 PSB 사용을 종료하고, 모든 데이터베이스의 변경사항이 반영된다. 별도의 명령어 옵션은 없다.

  • 문법

    EXEC DLI TERM END-EXEC.

변경 사항이 반영된 이후 다시 복구되지 않으니 주의하도록 한다.

2.3. DLET (DELETE)

데이터베이스로부터 세그먼트와 해당 세그먼트에 종속된 항목들을 삭제한다. 삭제하기 전 삭제하려고 하는 세그먼트를 먼저 받아야 하고 그 받은 세그먼트를 DLET 명령어로 삭제한다.

  • 문법

    EXEC DLI DLET [option …] END-EXEC.
  • 옵션

    옵션 설명

    USING PCB

    사용할 DB-PCB를 지정한다.

    FROM

    삭제할 세그먼트의 데이터가 저장된 경로를 지정한다.

    SEGMENT

    삭제할 세그먼트의 타입을 지정한다.

    SEGLENGTH

    I/O 경로의 길이를 지정한다.

2.4. GN (GET NEXT)

데이터베이스로부터 순차적으로 세그먼트를 읽어온다. GN 명령어를 실행할 때마다 옵션에 지정한 정보에 따라 다음 세그먼트를 받아온다. GN 명령어를 실행하기 전 필수적으로 GU 명령어를 이용하여 어디부터 읽을 것인지 지정해야 한다.

SEGMENT 옵션과 WHERE 옵션으로 읽기에 대한 조건 부여가 가능하다.

  • 문법

    EXEC DLI GN [option …] END-EXEC.
  • 옵션

    옵션 설명

    USING PCB

    사용할 DB-PCB를 지정한다.

    CURRENT

    현재 포지션을 기반으로 세그먼트를 추가한다.

    FEEDBACKLEN

    KEYFEEDBACK 저장소의 길이를 지정한다.

    FIELDLENGTH

    WHERE 옵션에 지정할 필드 값의 길이를 지정한다.

    FIRST

    세그먼트 타입의 첫 세그먼트를 가져온다.

    KEYFEEDBACK

    세그먼트의 연쇄 키(concatenated key)가 저장될 경로를 지정한다.

    INTO

    읽어올 세그먼트가 저장될 경로를 지정한다.

    LAST

    세그먼트 타입의 마지막 세그먼트를 가져온다.

    SEGLENGTH

    I/O 경로의 길이를 지정한다.

    SEGMENT

    읽어올 세그먼트의 타입을 지정한다.

    WHERE

    읽어올 세그먼트에 대한 Qualification Statement를 기술한다.

    Qualification Statement는 다음의 3가지 조합으로 구성된다.

    • 세그먼트의 필드 이름

    • 비교 연산자

    • 비교할 값이 저장된 변수

2.5. GNP (GET NEXT IN PARENT)

특정 부모에게 종속된 세그먼트만 읽어온다. GNP 명령어를 실행하기 전에 부모 정보가 주어진 GU 또는 GN 명령어를 실행해야 한다.

SEGMENT 옵션과 WHERE 옵션으로 읽기에 대한 조건 부여가 가능하다.

  • 문법

    EXEC DLI GNP [option …] END-EXEC.
  • 옵션

    옵션 설명

    USING PCB

    사용할 DB-PCB를 지정한다.

    CURRENT

    현재 포지션을 기반으로 세그먼트를 추가한다.

    FIELDLENGTH

    WHERE 옵션에 지정할 필드 값의 길이를 지정한다.

    FEEDBACKLEN

    KEYFEEDBACK 저장소의 길이를 지정한다.

    FIRST

    세그먼트 타입의 첫 세그먼트를 가져온다.

    KEYFEEDBACK

    세그먼트의 연쇄 키(concatenated key)가 저장될 경로를 지정한다.

    INTO

    읽어올 세그먼트가 저장될 경로를 지정한다.

    LAST

    세그먼트 타입의 마지막 세그먼트를 가져온다.

    SEGMENT

    읽어올 세그먼트의 타입을 지정한다.

    SEGLENGTH

    I/O 경로의 길이를 지정한다.

    WHERE

    읽어올 세그먼트에 대한 Qualification Statement를 기술한다.

    Qualification Statement는 다음의 3가지 조합으로 구성된다.

    • 세그먼트의 필드 이름

    • 비교 연산자

    • 비교할 값이 저장된 변수

2.6. GU (GET UNIQUE)

특정 세그먼트를 가져오고, 순차 검색을 위하여 시작 지점을 지정한다. 어떤 세그먼트 타입을 가져올 것인지 적어도 하나의 SEGMENT 옵션을 지정해야 하고, WHERE 옵션을 통하여 읽기에 대한 조건 부여가 가능하다.

  • 문법

    EXEC DLI GU [option …] END-EXEC.
  • 옵션

    옵션 설명

    USING PCB

    사용할 DB-PCB를 지정한다.

    FIELDLENGTH

    WHERE 옵션에 지정할 필드 값의 길이를 지정한다.

    FEEDBACKLEN

    KEYFEEDBACK 저장소의 길이를 지정한다.

    KEYFEEDBACK

    세그먼트의 연쇄 키(concatenated key)가 저장될 장소를 지정한다.

    INTO

    읽어올 세그먼트가 저장될 경로를 지정한다.

    LAST

    세그먼트 타입의 마지막 세그먼트를 가져온다.

    SEGMENT

    읽어올 세그먼트의 타입을 지정한다.

    SEGLENGTH

    I/O 경로의 길이를 지정한다.

    WHERE

    읽어올 세그먼트에 대한 Qualification Statement를 기술한다.

    Qualification Statement는 다음의 3가지 조합으로 구성된다.

    • 세그먼트의 필드 이름

    • 비교 연산자

    • 비교할 값이 저장된 변수

2.7. ISRT (INSERT)

하나 이상의 새로운 세그먼트를 추가한다. ISRT 명령어를 실행하기 전에 세그먼트가 추가될 위치를 지정해야 한다.

  • 문법

    EXEC DLI ISRT [option …] END-EXEC.
  • 옵션

    옵션 설명

    USING PCB

    사용할 DB-PCB를 지정한다.

    CURRENT

    현재 포지션을 기반으로 세그먼트를 추가한다.

    FIELDLENGTH

    WHERE 옵션에 지정할 필드 값의 길이를 지정한다.

    FROM

    추가할 세그먼트의 데이터가 저장된 경로를 지정한다.

    FIRST

    세그먼트 타입의 첫 세그먼트로 추가한다.

    LAST

    세그먼트 타입의 마지막 세그먼트로 추가한다.

    SEGMENT

    추가할 세그먼트의 타입을 지정한다.

    SEGLENGTH

    I/O 경로의 길이를 지정한다.

    WHERE

    추가할 세그먼트에 대한 Qualification Statement를 기술한다.

    Qualification Statement는 다음 3가지 조합으로 구성된다.

    • 세그먼트의 필드 이름

    • 비교 연산자

    • 비교할 값이 저장된 변수

2.8. REPL (REPLACE)

특정 세그먼트의 하나 이상의 필드값을 변경한다. REPL 명령어 전 GU 명령어를 통해 변경하려는 세그먼트를 먼저 받은 다음 그 세그먼트를 REPL 명령어로 수정한다. REPL 명령어는 SEGMENT 옵션 및 FROM 옵션이 각각 하나 이상 필수적으로 지정되어야 한다.

  • 문법

    EXEC DLI REPL [option …] END-EXEC.
  • 옵션

    옵션 설명

    USING PCB

    사용할 DB-PCB를 지정한다.

    FROM

    수정할 세그먼트의 데이터가 저장된 경로를 지정한다.

    SEGLENGTH

    I/O 경로의 길이를 지정한다.

    SEGMENT

    수정할 세그먼트의 타입을 지정한다.

3. CBLTDLI 호출 인터페이스

본 절에서는 앞서 설명한 EXEC DLI 인터페이스와 CBLTDLI 호출 인터페이스의 차이점을 소개하고, OpenFrame Batch 프로그램의 CBLTDLI 호출 인터페이스와의 차이점을 기술한다.

EXEC DLI 인터페이스와의 차이점

EXEC DLI 인터페이스와 달리 CBLTDL 인터페이스를 사용할 경우에는 CICS에서와 동일하게 DLIUIB(DL/I User Interface Block)와 PCB MASK 등을 직접 지정해 주어야 하며, DL/I 데이터베이스에 접근할 경우 세그먼트를 식별하기 위하여, 직접 SSA(Segment Search Arguments)를 생성하여 기술해야 한다.

다음은 CBLTDLI 인터페이스를 이용하여 PSB를 스케줄링하는 예이다.

CALL ‘CBLTDLI’  USING ‘PCB ‘ PSBNAME ADDRESS OF DLIUIB

다음은 특정 필드 조건에 맞는 세그먼트 값을 가지고 오는 예이다.

CALL ‘CBLTDLI’ USING ‘GU  ‘ THE-PCB-MASK SEGA-AREA FIELDA-SSA.
Batch 프로그램의 CBLTDLI 인터페이스와의 차이점

OSC 시스템에서 CBLTDLI 인터페이스로 DL/I 데이터베이스에 접근하는 것은 Batch 프로그램에서 CBLTDLI 인터페이스를 사용하는 것과 비교하면 다음 2가지의 차이점이 나타난다.

  • EXEC DLI 인터페이스와 마찬가지로 PSB 스케줄링이 필요하다.

  • CBLTDLI 호출 결과에 대한 상태 체크에 차이가 있다.

    DLIUIB의 UIBRCODE가 각각의 CBLTDLI 호출의 성공 여부를 결정하게 된다. UBIRCODE는 에러 정보를 보여주는 UIBFCTR과 부가 에러 정보를 보여주는 UIBDLTR로 나누어진다. 먼저 UIBFCTR로 에러를 확인하여 만약 이 값이 심각한 상태를 표현하는 경우 CBLTDLI 인터페이스는 직접 에러 처리를 하지 않기 때문에 사용자가 직접 EXEC CICS 인터페이스의 ABEND 명령어를 이용하여 태스크를 종료해야 한다. Batch DL/I 프로그램에서와 마찬가지로 CBLTDLI 호출이 정상적으로 이루어졌는지는 PCB MASK의 상태 코드를 이용하여 확인한다.

CBLTDLI 인터페이스에 대한 자세한 내용은 OpenFrame "HiDB 안내서"를 참고한다.