Cobol-quick-guide

提供:Dev Guides
移動先:案内検索

COBOL-概要

COBOLの概要

COBOLは高水準言語です。 COBOLの仕組みを理解する必要があります。 コンピューターは、0と1のバイナリストリームであるマシンコードのみを認識します。 COBOLコードは、コンパイラ*を使用してマシンコードに変換する必要があります。 コンパイラを介してプログラムソースを実行します。 コンパイラは最初に構文エラーをチェックしてから、機械語に変換します。 コンパイラーは、 *load module と呼ばれる出力ファイルを作成します。 この出力ファイルには、0と1の形式の実行可能コードが含まれています。

COBOLの進化

世界の西部でビジネスが成長していた1950年代には、操作を簡単にするためにさまざまなプロセスを自動化する必要があり、ビジネスデータ処理を目的とした高レベルのプログラミング言語が誕生しました。

  • 1959年に、COBOLはCODASYL(Conference on Data Systems Language)によって開発されました。
  • 次のバージョンのCOBOL-61は1961年にリリースされ、いくつかの修正が加えられました。
  • 1968年、COBOLはANSIによって商業用の標準言語(COBOL-68)として承認されました。
  • 1974年と1985年に再び改訂され、それぞれCOBOL-74とCOBOL-85という名前の後続バージョンが開発されました。
  • 2002年に、オブジェクト指向COBOLがリリースされました。これは、COBOLプログラミングの通常の部分としてカプセル化されたオブジェクトを使用できます。

COBOLの重要性

  • COBOLは、最初に広く使用されている高レベルのプログラミング言語でした。 ユーザーフレンドリーな英語に似た言語です。 すべての指示は、簡単な英単語でコーディングできます。
  • COBOLは、自己文書化言語としても使用されます。
  • COBOLは膨大なデータ処理を処理できます。
  • COBOLは以前のバージョンと互換性があります。
  • COBOLには効果的なエラーメッセージがあるため、バグの解決は簡単です。

COBOLの機能

標準言語

COBOLは、IBM AS/400、パーソナルコンピューターなどのマシンでコンパイルおよび実行できる標準言語です。

ビジネス志向

COBOLは、金融ドメイン、防衛ドメインなどに関連するビジネス指向のアプリケーション向けに設計されました。 高度なファイル処理機能により、大量のデータを処理できます。

堅牢な言語

COBOLは、ほぼすべてのコンピュータープラットフォームで多数のデバッグおよびテストツールが利用できるため、堅牢な言語です。

構造化言語

論理制御構造はCOBOLで使用でき、読み取りと変更が容易になります。 COBOLにはさまざまな部門があるため、デバッグは簡単です。

COBOL-環境設定

'__ === オンラインで試す

COBOLプログラミング環境をオンラインで設定したため、利用可能なすべてのサンプルをオンラインでコンパイルして実行できます。 読んでいるものに自信を与え、さまざまなオプションでプログラムを検証することができます。 サンプルを自由に変更して、オンラインで実行してください。

CodingGroundから入手できるオンラインコンパイラを使用して、次の例を試してください。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

PROCEDURE DIVISION.
   DISPLAY 'Hello World'.
STOP RUN.

このチュートリアルに記載されているほとんどの例では、オンラインコンパイラにアクセスできる右上隅のWebサイトコードセクションに[試用]オプションがあります。 だからそれを利用して、あなたの学習を楽しんでください。 '__

Windows/LinuxでのCOBOLのインストール

Windowsには、単純なCOBOLプログラムの作成と学習に使用できる無料のメインフレームエミュレータが多数あります。

そのようなエミュレータの1つはHerculesです。これは、以下に示すいくつかの簡単な手順に従うことで、Windowsに簡単にインストールできます。

  • Herculesエミュレーターをダウンロードしてインストールします。Herculesのホームサイトから入手できます:http://www.hercules-390.eu [www.hercules-390.eu]
  • Windowsマシンにパッケージをインストールすると、 C:/hercules/mvs/cobol のようなフォルダーが作成されます。
  • コマンドプロンプト(CMD)を実行し、CMDのディレクトリC:/hercules/mvs/cobolに到達します。 JCLおよびCOBOLプログラムを作成および実行するためのさまざまなコマンドに関する完全なガイドは、次の場所にあります。 + www.jaymoseley.com/hercules/installmvs/instmvs2 *

Herculesは、最新の64ビットz/Architectureに加えて、メインフレームSystem/370およびESA/390アーキテクチャのオープンソースソフトウェア実装です。 Herculesは、Linux、Windows、Solaris、FreeBSD、およびMac OS Xで動作します。

ユーザーは、シンクライアント、ダミーターミナル、仮想クライアントシステム(VCS)、仮想デスクトップシステム(VDS)など、さまざまな方法でメインフレームサーバーに接続できます。 すべての有効なユーザーには、Z/OSインターフェース(TSO/EまたはISPF)に入るためのログインIDが与えられます。

COBOLプログラムのコンパイル

JCLを使用してCOBOLプログラムをバッチモードで実行するには、プログラムをコンパイルする必要があり、すべてのサブプログラムでロードモジュールが作成されます。 JCLは、実行時に実際のプログラムではなく、ロードモジュールを使用します。 ロードライブラリは連結され、 JCLLIB または STEPLIB を使用して実行時にJCLに渡されます。

COBOLプログラムのコンパイルには、多くのメインフレームコンパイラユーティリティが利用できます。 一部の企業では、 Endevor などの変更管理ツールを使用しています。これは、プログラムのすべてのバージョンをコンパイルして保存します。 これは、プログラムに加えられた変更を追跡するのに役立ちます。

//COMPILE   JOB ,CLASS=6,MSGCLASS=X,NOTIFY=&SYSUID
//*
//STEP1     EXEC IGYCRCTL,PARM=RMODE,DYNAM,SSRANGE
//SYSIN     DD DSN=MYDATA.URMI.SOURCES(MYCOBB),DISP=SHR
//SYSLIB    DD DSN=MYDATA.URMI.COPYBOOK(MYCOPY),DISP=SHR
//SYSLMOD   DD DSN=MYDATA.URMI.LOAD(MYCOBB),DISP=SHR
//SYSPRINT  DD SYSOUT=*
//*

IGYCRCTLは、IBM COBOLコンパイラユーティリティです。 コンパイラーのオプションは、PARMパラメーターを使用して渡されます。 上記の例では、RMODEは、プログラムで相対アドレス指定モードを使用するようコンパイラーに指示します。 COBOLプログラムは、SYSINパラメーターを使用して渡されます。 Copybookは、SYSLIBのプログラムで使用されるライブラリです。

COBOLプログラムの実行

以下に示すのは、プログラムMYPROGが入力ファイルMYDATA.URMI.INPUTを使用して実行され、スプールに書き込まれる2つの出力ファイルを生成するJCLの例です。

//COBBSTEP  JOB CLASS=6,NOTIFY=&SYSUID
//
//STEP10    EXEC PGM=MYPROG,PARM=ACCT5000
//STEPLIB   DD DSN=MYDATA.URMI.LOADLIB,DISP=SHR
//INPUT1    DD DSN=MYDATA.URMI.INPUT,DISP=SHR
//OUT1      DD SYSOUT=*
//OUT2      DD SYSOUT=*
//SYSIN     DD *
//CUST1     1000
//CUST2     1001
/*

MYPROGのロードモジュールはMYDATA.URMI.LOADLIBにあります。 これは、上記のJCLが非DB2 COBOLモジュールにのみ使用できることに注意することが重要です。

COBOL-DB2プログラムの実行

COBOL-DB2プログラムを実行するには、JCLおよびプログラムで専用のIBMユーティリティーが使用されます。 DB2領域および必須パラメーターは、ユーティリティーへの入力として渡されます。

COBOL-DB2プログラムを実行する際の手順は次のとおりです-

  • COBOL-DB2プログラムがコンパイルされると、DBRM(データベース要求モジュール)がロードモジュールとともに作成されます。 DBRMには、COBOLプログラムのSQLステートメントが含まれており、構文が正しいことが確認されています。
  • DBRMは、COBOLが実行されるDB2領域(環境)にバインドされます。 これは、JCLでIKJEFT01ユーティリティーを使用して実行できます。
  • バインド手順の後、ロードライブラリとDBRMライブラリをJCLへの入力としてIKJEFT01(再び)を使用して、COBOL-DB2プログラムが実行されます。
//STEP001  EXEC PGM=IKJEFT01
//*
//STEPLIB  DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//*
//input files
//output files
//SYSPRINT DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSDBOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//DISPLAY  DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(MYCOBB) PLAN(PLANNAME) PARM(parameters to cobol program) -
   LIB('MYDATA.URMI.LOADLIB')
   END
/*

上記の例では、MYCOBBはIKJEFT01を使用して実行されるCOBOL-DB2プログラムです。 プログラム名、DB2サブシステムID(SSID)、およびDB2プラン名はSYSTSIN DDステートメント内で渡されることに注意してください。 DBRMライブラリーはSTEPLIBで指定されます。

COBOL-プログラム構造

COBOLプログラム構造は、次の画像に示すように部門で構成されています-

プログラム構造

これらの部門の簡単な紹介を以下に示します-

  • *セクション*は、プログラムロジックの論理的な下位区分です。 セクションは段落の集まりです。
  • *段落*は、セクションまたは部門の下位区分です。 これは、ユーザー定義または事前定義の名前の後にピリオドが続き、ゼロ個以上の文/エントリで構成されます。
  • *文*は、1つ以上のステートメントの組み合わせです。 文は、手続き部にのみ表示されます。 文はピリオドで終わる必要があります。
  • Statements は、何らかの処理を実行する意味のあるCOBOLステートメントです。
  • *文字*は階層の最下位であり、分割できません。

次の例では、上記の用語をCOBOLプログラムと相互に関連付けることができます-

PROCEDURE DIVISION.
A0000-FIRST-PARA SECTION.
FIRST-PARAGRAPH.
ACCEPT WS-ID            - Statement-1  -----|
MOVE '10' TO WS-ID      - Statement-2       |-- Sentence - 1
DISPLAY WS-ID           - Statement-3  -----|
.

部門

COBOLプログラムは4つの部門で構成されています。

識別部

これは、すべてのCOBOLプログラムの最初で唯一の必須区分です。 プログラマとコンパイラは、この区分を使用してプログラムを識別します。 この部門では、PROGRAM-IDのみが必須の段落です。 PROGRAM-IDは、1〜30文字で構成されるプログラム名を指定します。

オンラインで Live Demo オプションを使用して、次の例を試してください。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
DISPLAY 'Welcome to finddevguides'.
STOP RUN.

上記のCOBOLプログラムを実行する JCL を以下に示します。

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Welcome to finddevguides

環境課

環境区分は、プログラムへの入力ファイルと出力ファイルを指定するために使用されます。 それは2つのセクションで構成されています-

  • *構成セクション*は、プログラムが作成および実行されるシステムに関する情報を提供します。 それは2つの段落で構成されています-
  • ソースコンピューター-プログラムのコンパイルに使用されるシステム。
  • オブジェクトコンピューター-プログラムの実行に使用されるシステム。
  • *入出力セクション*は、プログラムで使用されるファイルに関する情報を提供します。 それは2つの段落で構成されています-
  • ファイル制御-プログラムで使用される外部データセットの情報を提供します。
  • I-Oコントロール-プログラムで使用されるファイルの情報を提供します。
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
   SOURCE-COMPUTER. XXX-ZOS.
   OBJECT-COMPUTER. XXX-ZOS.

INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT FILEN ASSIGN TO DDNAME
   ORGANIZATION IS SEQUENTIAL.

データ部

データ分割は、プログラムで使用される変数を定義するために使用されます。 それは4つのセクションで構成されています-

  • *ファイルセクション*は、ファイルのレコード構造を定義するために使用されます。
  • * Working-Storageセクション*は、プログラムで使用される一時変数とファイル構造を宣言するために使用されます。
  • *ローカルストレージセクション*は、ワーキングストレージセクションに似ています。 唯一の違いは、プログラムが実行を開始するたびに変数が割り当てられて初期化されることです。
  • *リンケージセクション*は、外部プログラムから受信したデータ名を記述するために使用されます。
  • COBOLプログラム*
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT FILEN ASSIGN TO INPUT.
      ORGANIZATION IS SEQUENTIAL.
      ACCESS IS SEQUENTIAL.

DATA DIVISION.
   FILE SECTION.
   FD FILEN
   01 NAME PIC A(25).

   WORKING-STORAGE SECTION.
   01 WS-STUDENT PIC A(30).
   01 WS-ID PIC 9(5).

   LOCAL-STORAGE SECTION.
   01 LS-CLASS PIC 9(3).

   LINKAGE SECTION.
   01 LS-ID PIC 9(5).

PROCEDURE DIVISION.
   DISPLAY 'Executing COBOL program using JCL'.
STOP RUN.

上記のCOBOLプログラムを実行する JCL は次のとおりです-

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//INPUT DD DSN = ABC.EFG.XYZ,DISP = SHR

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Executing COBOL program using JCL

手続き部

手続き部は、プログラムのロジックを含めるために使用されます。 データ部で定義された変数を使用した実行可能ステートメントで構成されます。 この部門では、段落名とセクション名はユーザー定義です。

手続き部には少なくとも1つのステートメントが必要です。 この部門で実行を終了する最後のステートメントは、呼び出し側プログラムで使用される STOP RUN または呼び出されるプログラムで使用される EXIT PROGRAM です。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NAME PIC A(30).
   01 WS-ID PIC 9(5) VALUE '12345'.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   DISPLAY 'Hello World'.
   MOVE 'finddevguides' TO WS-NAME.
   DISPLAY "My name is : "WS-NAME.
   DISPLAY "My ID is : "WS-ID.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Hello World
My name is : finddevguides
My ID is : 12345

COBOL-基本構文

キャラクターセット

「文字」は階層の最下位であり、さらに分割することはできません。 COBOL文字セットには、以下に示す78文字が含まれます-

Sr.No. Character & Description
1

A-Z

アルファベット(大文字)

2

a-z

アルファベット(小文字)

3

0-9

数値

4

 

スペース

5

+

プラス記号

6

-

マイナス記号またはハイフン

7 アスタリスク
8

/

フォワードスラッシュ

9

$

通貨記号

10

,

コンマ

11

;

セミコロン

12

.

小数点または期間

13

"

引用符

14

(

左括弧

15

)

右括弧

16

>

より大きい

17

<

未満

18

:

結腸

19

''

アポストロフィ

20

=

等号

コーディングシート

COBOLのソースプログラムは、コンパイラが受け入れられる形式で作成する必要があります。 COBOLプログラムは、COBOLコーディングシートに記述されています。 コーディングシートの各行には80文字の位置があります。

文字の位置は、次の5つのフィールドにグループ化されます-

Positions Field Description
1-6 Column Numbers Reserved for line numbers.
7 Indicator It can have Asterisk (*) indicating comments, Hyphen (-) indicating continuation and Slash (/) indicating form feed.
8-11 Area A All COBOL divisions, sections, paragraphs and some special entries must begin in Area A.
12-72 Area B All COBOL statements must begin in area B.
73-80 Identification Area It can be used as needed by the programmer.

次の例は、COBOLコーディングシートを示しています-

000100 IDENTIFICATION DIVISION.                                         000100
000200 PROGRAM-ID. HELLO.                                               000101
000250* THIS IS A COMMENT LINE                                          000102
000300 PROCEDURE DIVISION.                                              000103
000350 A000-FIRST-PARA.                                                 000104
000400     DISPLAY “Coding Sheet”.                                      000105
000500 STOP RUN.                                                        000106
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Coding Sheet

文字列

文字列は、個々の文字を組み合わせて形成されます。 文字列は

  • コメント、
  • リテラル、または
  • COBOLワード。

すべての文字列は separators で終わる必要があります。 区切り文字は、文字列を区切るために使用されます。

頻繁に使用される区切り記号-スペース、コンマ、ピリオド、アポストロフィ、左/右括弧、および引用符。

コメント

コメントは、プログラムの実行に影響を与えない文字列です。 文字の任意の組み合わせを使用できます。

コメントには2種類あります-

コメント行

コメント行は、任意の列に書き込むことができます。 コンパイラーは、コメント行の構文をチェックせず、文書化のために処理します。

コメント入力

コメントエントリは、識別部のオプションの段落に含まれているものです。 これらはエリアBで記述されており、プログラマーが参照用に使用しています。

  • 太字*で強調表示されたテキストは、次の例のコメントエントリです-
000100 IDENTIFICATION DIVISION.                                         000100
000150 PROGRAM-ID. HELLO.                                               000101
000200 AUTHOR. finddevguides.                                          000102
000250* THIS IS A COMMENT LINE                                          000103
000300 PROCEDURE DIVISION.                                              000104
000350 A000-FIRST-PARA.                                                 000105
000360/First Para Begins - Documentation Purpose                       000106
000400     DISPLAY “Comment line”.                                      000107
000500 STOP RUN.                                                        000108

上記のCOBOLプログラムを実行する JCL -

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Comment Line

リテラル

リテラルは、プログラムで直接ハードコーディングされた定数です。 次の例では、「Hello World」はリテラルです。

PROCEDURE DIVISION.
DISPLAY 'Hello World'.

以下で説明するように、リテラルには2つのタイプがあります-

英数字リテラル

英数字リテラルは引用符またはアポストロフィで囲まれています。 長さは最大160文字です。 アポストロフィまたは引用符は、ペアになっている場合にのみリテラルの一部になります。 リテラルの開始と終了は、アポストロフィまたは引用符のどちらかで同じでなければなりません。

次の例は、有効および無効な英数字リテラルを示しています-

Valid:
   ‘This is valid’
   "This is valid"
   ‘This isn’’t invalid’

Invalid:
   ‘This is invalid”
   ‘This isn’t valid’

数値リテラル

数値リテラルは、0〜9の数字の組み合わせ、+、–、または小数点です。 長さは最大18文字です。 記号を右端の文字にすることはできません。 小数点は最後に表示されません。

次の例は、有効および無効な数値リテラルを示しています-

Valid:
   100
   +10.9
   -1.9

Invalid:
   1,00
   10.
   10.9-

COBOL Word

COBOL Wordは、予約語またはユーザー定義語にできる文字列です。 長さは最大30文字です。

ユーザー定義の

ユーザー定義の単語は、ファイル、データ、レコード、段落名、およびセクションの命名に使用されます。 ユーザー定義の単語を作成する際、アルファベット、数字、ハイフンを使用できます。 COBOLの予約語は使用できません。

予約語

予約語は、COBOLの事前定義語です。 私たちが頻繁に使用する予約語の種類は次のとおりです-

  • ADD、ACCEPT、MOVEなどの*キーワード*
  • 特殊文字 +、-、*、<、⇐などの単語
  • *比Fig定数*は、ゼロ、スペースなどの定数値です。 表意定数のすべての定数値は、次の表に記載されています。

比Constant定数

Sr.No. Figurative Constants & Description
1

HIGH-VALUES

降順で最上位にある1つ以上の文字。

2

LOW-VALUES

1つ以上の文字のバイナリ表現にはゼロが含まれます。

3

ZERO/ZEROES

変数のサイズに応じて1つ以上のゼロ。

4

SPACES

1つ以上のスペース。

5

QUOTES

一重引用符または二重引用符。

6

ALL literal

データ項目をリテラルで埋めます。

COBOL-データ型

データ部は、プログラムで使用される変数を定義するために使用されます。 COBOLでデータを説明するには、次の用語を理解する必要があります-

  • データ名
  • レベル番号
  • ピクチャー句 *値句
01            TOTAL-STUDENTS            PIC9(5)            VALUE '125'.
|                    |                    |                    |
|                    |                    |                    |
|                    |                    |                    |
Level Number     Data Name           Picture Clause       Value Clause

データ名

データ名は、手続き部で使用する前に、データ部で定義する必要があります。 ユーザー定義の名前が必要です。予約語は使用できません。 データ名は、実際のデータが保存されているメモリの場所への参照を提供します。 基本タイプまたはグループタイプを指定できます。

次の例は、有効および無効なデータ名を示しています-

Valid:
   WS-NAME
   TOTAL-STUDENTS
   A100
   100B

Invalid:
   MOVE            (Reserved Words)
   COMPUTE         (Reserved Words)
   100             (No Alphabet)
   100+B           (+ is not allowed)

レベル番号

レベル番号は、レコード内のデータのレベルを指定するために使用されます。 基本項目とグループ項目を区別するために使用されます。 基本項目をグループ化して、グループ項目を作成できます。

Sr.No. Level Number & Description
1
  • 01*

レコード記述エントリー

2

02 to 49

グループおよび基本アイテム

3

66

句アイテムの名前変更

4

77

細分化できないアイテム

5

88

条件名エントリ

  • *基本項目*はそれ以上分割できません。 レベル番号、データ名、Picture句、およびValue句(オプション)は、基本項目を記述するために使用されます。
  • *グループ項目*は、1つ以上の基本項目で構成されます。 レベル番号、データ名、および値句(オプション)は、グループアイテムを記述するために使用されます。 グループレベル番号は常に01です。

次の例は、グループおよび基本項目を示しています-

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME    PIC X(25).                               ---> ELEMENTARY ITEM
01 WS-CLASS   PIC 9(2)  VALUE  '10'.                   ---> ELEMENTARY ITEM

01 WS-ADDRESS.                                         ---> GROUP ITEM
   05 WS-HOUSE-NUMBER    PIC 9(3).                     ---> ELEMENTARY ITEM
   05 WS-STREET          PIC X(15).                    ---> ELEMENTARY ITEM
   05 WS-CITY            PIC X(15).                    ---> ELEMENTARY ITEM
   05 WS-COUNTRY         PIC X(15)  VALUE 'INDIA'.     ---> ELEMENTARY ITEM

ピクチャー句

Picture句は、次の項目を定義するために使用されます-

  • *データタイプ*は、数値、アルファベット、または英数字です。 数値型は、0〜9の数字のみで構成されます。 アルファベットのタイプは、A〜Zの文字とスペースで構成されます。 英数字タイプは、数字、文字、および特殊文字で構成されます。
  • Sign は数値データで使用できます。 +または–のいずれかです。
  • *小数点位置*は数値データで使用できます。 想定位置は小数点の位置であり、データには含まれません。
  • *長さ*は、データ項目が使用するバイト数を定義します。

Picture節で使用される記号-

Sr.No. Symbol & Description
1

9

数値

2

A

アルファベット

3

X

英数字

4

V

暗黙の10進数

5

S

Sign

6

P

想定される10進数

次の例は、PIC句の使用を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC S9(3)V9(2).
   01 WS-NUM2 PIC PPP999.
   01 WS-NUM3 PIC S9(3)V9(2) VALUE -123.45.
   01 WS-NAME PIC A(6) VALUE 'ABCDEF'.
   01 WS-ID PIC X(5) VALUE 'A121$'.

PROCEDURE DIVISION.
   DISPLAY "WS-NUM1 : "WS-NUM1.
   DISPLAY "WS-NUM2 : "WS-NUM2.
   DISPLAY "WS-NUM3 : "WS-NUM3.
   DISPLAY "WS-NAME : "WS-NAME.
   DISPLAY "WS-ID : "WS-ID.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1 : +000.00
WS-NUM2 : .000000
WS-NUM3 : -123.45
WS-NAME : ABCDEF
WS-ID : A121$

値句

値句は、データ項目を初期化するために使用されるオプションの句です。 値は、数値リテラル、英数字リテラル、または比fig定数です。 グループ項目と基本項目の両方で使用できます。

次の例は、VALUE句の使用を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 99V9 VALUE IS 3.5.
   01 WS-NAME PIC A(6) VALUE 'ABCD'.
   01 WS-ID PIC 99 VALUE ZERO.

PROCEDURE DIVISION.
   DISPLAY "WS-NUM1 : "WS-NUM1.
   DISPLAY "WS-NAME : "WS-NAME.
   DISPLAY "WS-ID   : "WS-ID.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1 : 03.5
WS-NAME : ABCD
WS-ID   : 00

COBOL-基本動詞

COBOL動詞は、データ処理の手続き部で使用されます。 ステートメントは常にCOBOL動詞で始まります。 アクションのタイプが異なるいくつかのCOBOL動詞があります。

入力/出力動詞

入出力動詞は、ユーザーからデータを取得し、COBOLプログラムの出力を表示するために使用されます。 次の2つの動詞がこのプロセスに使用されます-

動詞を受け入れる

Accept動詞は、日付、時刻、曜日などのデータをオペレーティングシステムから、またはユーザーから直接取得するために使用されます。 プログラムがユーザーからデータを受け入れている場合、JCLを介して渡す必要があります。 オペレーティングシステムからデータを取得している間、次の例に示すようにFROMオプションが含まれています-

ACCEPT WS-STUDENT-NAME.
ACCEPT WS-DATE FROM SYSTEM-DATE.

動詞の表示

表示動詞は、COBOLプログラムの出力を表示するために使用されます。

DISPLAY WS-STUDENT-NAME.
DISPLAY "System date is : " WS-DATE.
  • COBOLプログラム*
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-NAME PIC X(25).
   01 WS-DATE PIC X(10).

PROCEDURE DIVISION.
   ACCEPT WS-STUDENT-NAME.
   ACCEPT WS-DATE FROM DATE.
   DISPLAY "Name :  " WS-STUDENT-NAME.
   DISPLAY "Date : " WS-DATE.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//INPUT DD DSN=PROGRAM.DIRECTORY,DISP=SHR
//SYSIN DD *
finddevguides
/*

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Name : finddevguides
Date : 2014-08-30

動詞の初期化

初期化動詞は、グループ項目または基本項目を初期化するために使用されます。 RENAME句を含むデータ名は初期化できません。 数値データ項目はゼロに置き換えられます。 英数字またはアルファベットのデータ項目はスペースに置き換えられます。 REPLACING用語を含めると、データ項目は、次の例に示すように、指定された置換値に初期化できます-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NAME PIC A(30) VALUE 'ABCDEF'.
   01 WS-ID PIC 9(5).
   01 WS-ADDRESS.
   05 WS-HOUSE-NUMBER PIC 9(3).
   05 WS-COUNTRY PIC X(15).
   05 WS-PINCODE PIC 9(6) VALUE 123456.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   INITIALIZE WS-NAME, WS-ADDRESS.
   INITIALIZE WS-ID REPLACING NUMERIC DATA BY 12345.
   DISPLAY "My name is   : "WS-NAME.
   DISPLAY "My ID is     : "WS-ID.
   DISPLAY "Address      : "WS-ADDRESS.
   DISPLAY "House Number : "WS-HOUSE-NUMBER.
   DISPLAY "Country      : "WS-COUNTRY.
   DISPLAY "Pincode      : "WS-PINCODE.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

My name is   :
My ID is     : 12345
Address      : 000               000000
House Number : 000
Country      :
Pincode      : 000000

動詞を移動

移動動詞は、ソースデータから宛先データにデータをコピーするために使用されます。 基本データ項目とグループデータ項目の両方で使用できます。 グループデータ項目の場合、MOVE CORRESPONDING/CORRが使用されます。 try itオプションでは、MOVE CORRは機能していません。しかし、メインフレームサーバーでは動作します。

文字列からデータを移動するには、MOVE(x:l)が使用されます。xは開始位置で、lは長さです。 宛先データ項目のPIC句がソースデータ項目のPIC句よりも小さい場合、データは切り捨てられます。 宛先データ項目のPIC句がソースデータ項目のPIC句よりも大きい場合、余分なバイトにZEROSまたはSPACESが追加されます。 次の例はそれを明確にします。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).
   01 WS-NUM3 PIC 9(5).
   01 WS-NUM4 PIC 9(6).
   01 WS-ADDRESS.
   05 WS-HOUSE-NUMBER PIC 9(3).
   05 WS-COUNTRY PIC X(5).
   05 WS-PINCODE PIC 9(6).
   01 WS-ADDRESS1.
   05 WS-HOUSE-NUMBER1 PIC 9(3).
   05 WS-COUNTRY1 PIC X(5).
   05 WS-PINCODE1 PIC 9(6).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 123456789 TO WS-NUM1.
   MOVE WS-NUM1 TO WS-NUM2 WS-NUM3.
   MOVE WS-NUM1(3:6) TO WS-NUM4.
   MOVE 123 TO WS-HOUSE-NUMBER.
   MOVE 'INDIA' TO WS-COUNTRY.
   MOVE 112233 TO WS-PINCODE.
   MOVE WS-ADDRESS TO WS-ADDRESS1.

   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUM3     : " WS-NUM3
   DISPLAY "WS-NUM4     : " WS-NUM4
   DISPLAY "WS-ADDRESS  : " WS-ADDRESS
   DISPLAY "WS-ADDRESS1 : " WS-ADDRESS1

STOP RUN.

上記のCOBOLプログラムを実行する JCL

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1     : 123456789
WS-NUM2     : 123456789
WS-NUM3     : 56789
WS-NUM4     : 345678
WS-ADDRESS  : 123INDIA112233
WS-ADDRESS1 : 123INDIA112233

法的な動き

次の表は、法的動きに関する情報を提供します-

Alphabetic Alphanumeric Numeric
Alphabetic Possible Possible Not Possible
Alphanumeric Possible Possible Possible
Numeric Not Possible Possible Possible

動詞を追加

追加動詞は、2つ以上の数値を追加し、結果を宛先オペランドに格納するために使用されます。

構文

以下の2つ以上の数字を追加する構文です-

ADD A B TO C D

ADD A B C TO D GIVING E

ADD CORR WS-GROUP1 TO WS-GROUP2

構文-1では、A、B、Cが追加され、結果はCに保存されます(C = A + B + C)。 A、B、Dが追加され、結果がDに保存されます(D = A + B + D)。

構文-2では、A、B、C、Dが追加され、結果はEに保存されます(E = A + B + C + D)。

構文3では、WS-GROUP1およびWS-GROUP2内のサブグループアイテムが追加され、結果はWS-GROUP2に格納されます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 10.
   01 WS-NUM4 PIC 9(9) VALUE 10.
   01 WS-NUMA PIC 9(9) VALUE 10.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9) VALUE 10.
   01 WS-NUMD PIC 9(9) VALUE 10.
   01 WS-NUME PIC 9(9) VALUE 10.

PROCEDURE DIVISION.
   ADD WS-NUM1 WS-NUM2 TO WS-NUM3 WS-NUM4.
   ADD WS-NUMA WS-NUMB WS-NUMC TO WS-NUMD GIVING WS-NUME.
   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUM3     : " WS-NUM3
   DISPLAY "WS-NUM4     : " WS-NUM4
   DISPLAY "WS-NUMA     : " WS-NUMA
   DISPLAY "WS-NUMB     : " WS-NUMB
   DISPLAY "WS-NUMC     : " WS-NUMC
   DISPLAY "WS-NUMD     : " WS-NUMD
   DISPLAY "WS-NUME     : " WS-NUME

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1     : 000000010
WS-NUM2     : 000000010
WS-NUM3     : 000000030
WS-NUM4     : 000000030
WS-NUMA     : 000000010
WS-NUMB     : 000000010
WS-NUMC     : 000000010
WS-NUMD     : 000000010
WS-NUME     : 000000040

動詞を引く

減算動詞は、減算演算に使用されます。

構文

以下は、減算操作の構文です-

SUBTRACT A B FROM C D

SUBTRACT A B C FROM D GIVING E

SUBTRACT CORR WS-GROUP1 TO WS-GROUP2

構文-1では、AとBがCから加算および減算されます。 結果はCに保存されます(C = C-(A + B))。 AとBがDから加算および減算されます。 結果はDに保存されます(D = D-(A + B))。

構文-2では、A、B、Cが加算され、Dから減算されます。 結果はEに保存されます(E = D-(A + B + C))

構文3では、WS-GROUP1およびWS-GROUP2内のサブグループアイテムが減算され、結果がWS-GROUP2に格納されます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 100.
   01 WS-NUM4 PIC 9(9) VALUE 100.
   01 WS-NUMA PIC 9(9) VALUE 10.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9) VALUE 10.
   01 WS-NUMD PIC 9(9) VALUE 100.
   01 WS-NUME PIC 9(9) VALUE 10.

PROCEDURE DIVISION.
   SUBTRACT WS-NUM1 WS-NUM2 FROM WS-NUM3 WS-NUM4.
   SUBTRACT WS-NUMA WS-NUMB WS-NUMC FROM WS-NUMD GIVING WS-NUME.

   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUM3     : " WS-NUM3
   DISPLAY "WS-NUM4     : " WS-NUM4
   DISPLAY "WS-NUMA     : " WS-NUMA
   DISPLAY "WS-NUMB     : " WS-NUMB
   DISPLAY "WS-NUMC     : " WS-NUMC
   DISPLAY "WS-NUMD     : " WS-NUMD
   DISPLAY "WS-NUME     : " WS-NUME

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1     : 000000010
WS-NUM2     : 000000010
WS-NUM3     : 000000080
WS-NUM4     : 000000080
WS-NUMA     : 000000010
WS-NUMB     : 000000010
WS-NUMC     : 000000010
WS-NUMD     : 000000100
WS-NUME     : 000000070

動詞を掛ける

乗算動詞は、乗算演算に使用されます。

構文

以下は、2つ以上の数字を乗算する構文です-

MULTIPLY A BY B C

MULTIPLY A BY B GIVING E

構文-1では、AとBは乗算され、結果はBに格納されます(B = A B)。 AとCは乗算され、結果はCに格納されます(C = A C)。

構文2では、AとBは乗算され、結果はEに格納されます(E = A * B)。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 10.
   01 WS-NUMA PIC 9(9) VALUE 10.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9) VALUE 10.

PROCEDURE DIVISION.
   MULTIPLY WS-NUM1 BY WS-NUM2 WS-NUM3.
   MULTIPLY WS-NUMA BY WS-NUMB GIVING WS-NUMC.

   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUM3     : " WS-NUM3
   DISPLAY "WS-NUMA     : " WS-NUMA
   DISPLAY "WS-NUMB     : " WS-NUMB
   DISPLAY "WS-NUMC     : " WS-NUMC

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1     : 000000010
WS-NUM2     : 000000100
WS-NUM3     : 000000100
WS-NUMA     : 000000010
WS-NUMB     : 000000010
WS-NUMC     : 000000100

動詞を分ける

除算動詞は除算操作に使用されます。

構文

以下は、除算演算の構文です-

DIVIDE A INTO B

DIVIDE A BY B GIVING C REMAINDER R

構文-1では、BはAで除算され、結果はBに格納されます(B = B/A)。

構文2では、AはBで除算され、結果はC(C = A/B)に格納され、残りはRに格納されます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 5.
   01 WS-NUM2 PIC 9(9) VALUE 250.
   01 WS-NUMA PIC 9(9) VALUE 100.
   01 WS-NUMB PIC 9(9) VALUE 15.
   01 WS-NUMC PIC 9(9).
   01 WS-REM PIC 9(9).

PROCEDURE DIVISION.
   DIVIDE WS-NUM1 INTO WS-NUM2.
   DIVIDE WS-NUMA BY WS-NUMB GIVING WS-NUMC REMAINDER WS-REM.
   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUMA     : " WS-NUMA
   DISPLAY "WS-NUMB     : " WS-NUMB
   DISPLAY "WS-NUMC     : " WS-NUMC
   DISPLAY "WS-REM      : " WS-REM

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1     : 000000005
WS-NUM2     : 000000050
WS-NUMA     : 000000100
WS-NUMB     : 000000015
WS-NUMC     : 000000006
WS-REM      : 000000010

計算ステートメント

計算ステートメントは、COBOLで算術式を記述するために使用されます。 これは、加算、減算、乗算、および除算の代替です。

  • 例 *
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9) VALUE 10 .
   01 WS-NUM2 PIC 9(9) VALUE 10.
   01 WS-NUM3 PIC 9(9) VALUE 10.
   01 WS-NUMA PIC 9(9) VALUE 50.
   01 WS-NUMB PIC 9(9) VALUE 10.
   01 WS-NUMC PIC 9(9).

PROCEDURE DIVISION.
   COMPUTE WS-NUMC= (WS-NUM1* WS-NUM2) - (WS-NUMA/WS-NUMB) + WS-NUM3.
   DISPLAY "WS-NUM1     : " WS-NUM1
   DISPLAY "WS-NUM2     : " WS-NUM2
   DISPLAY "WS-NUM3     : " WS-NUM3
   DISPLAY "WS-NUMA     : " WS-NUMA
   DISPLAY "WS-NUMB     : " WS-NUMB
   DISPLAY "WS-NUMC     : " WS-NUMC

STOP RUN.

上記のCOBOLプログラムを実行する JCL

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1     : 000000010
WS-NUM2     : 000000010
WS-NUM3     : 000000010
WS-NUMA     : 000000050
WS-NUMB     : 000000010
WS-NUMC     : 000000105

COBOL-データレイアウト

COBOLレイアウトは、各フィールドの使用とそのフィールドに存在する値の説明です。 以下は、COBOLで使用されるデータ記述エントリです-

  • 句の再定義
  • 句の名前を変更
  • 使用条項
  • コピーブック

句の再定義

Redefines句は、異なるデータ記述でストレージを定義するために使用されます。 1つ以上のデータ項目が同時に使用されない場合、同じストレージを別のデータ項目に使用できます。 そのため、同じストレージを異なるデータ項目で参照できます。

構文

以下は、再定義句の構文です-

01 WS-OLD PIC X(10).
01 WS-NEW1 REDEFINES WS-OLD PIC 9(8).
01 WS-NEW2 REDEFINES WS-OLD PIC A(10).

以下は、使用されるパラメータの詳細です-

  • WS-OLDは再定義されたアイテムです
  • WS-NEW1およびWS-NEW2はアイテムの再定義です

再定義されたアイテムと再定義されたアイテムのレベル番号は同じである必要があり、66または88のレベル番号であってはなりません。 再定義アイテムでVALUE句を使用しないでください。 ファイルセクションでは、01レベル番号の再定義句を使用しないでください。 定義の再定義は、再定義する次のデータ記述でなければなりません。 再定義するアイテムは、常に再定義するアイテムと同じ値を持ちます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-DESCRIPTION.
   05 WS-DATE1 VALUE '20140831'.
   10 WS-YEAR PIC X(4).
   10 WS-MONTH PIC X(2).
   10 WS-DATE PIC X(2).
   05 WS-DATE2 REDEFINES WS-DATE1 PIC 9(8).

PROCEDURE DIVISION.
   DISPLAY "WS-DATE1 : "WS-DATE1.
   DISPLAY "WS-DATE2 : "WS-DATE2.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-DATE1 : 20140831
WS-DATE2 : 20140831

句の名前を変更

Renames句は、既存のデータ項目に異なる名前を付けるために使用されます。 データ名を再グループ化し、新しい名前を付けるために使用されます。 新しいデータ名は、グループまたは基本項目にわたって名前を変更できます。 レベル番号66は、名前変更のために予約されています。

構文

以下は、名前変更句の構文です-

01 WS-OLD.
10 WS-A PIC 9(12).
10 WS-B PIC X(20).
10 WS-C PIC A(25).
10 WS-D PIC X(12).
66 WS-NEW RENAMES WS-A THRU WS-C.

名前の変更は、同じレベルでのみ可能です。 上記の例では、WS-A、WS-B、およびWS-Cは同じレベルにあります。 名前変更定義は、名前を変更する次のデータ記述でなければなりません。 01、77、または66のレベル番号で名前の変更を使用しないでください。 名前の変更に使用されるデータ名は順番に並んでいる必要があります。 occur句を含むデータ項目の名前は変更できません。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-DESCRIPTION.
   05 WS-NUM.
   10 WS-NUM1 PIC 9(2) VALUE 20.
   10 WS-NUM2 PIC 9(2) VALUE 56.
   05 WS-CHAR.
   10 WS-CHAR1 PIC X(2) VALUE 'AA'.
   10 WS-CHAR2 PIC X(2) VALUE 'BB'.
   66 WS-RENAME RENAMES WS-NUM2 THRU WS-CHAR2.

PROCEDURE DIVISION.
   DISPLAY "WS-RENAME : " WS-RENAME.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-RENAME : 56AABB

使用条項

Usage句は、形式データが保存されるオペレーティングシステムを指定します。 レベル番号66または88では使用できません。 グループに使用法句が指定されている場合、すべての基本項目は同じ使用法句になります。 Usage句で使用できるさまざまなオプションは次のとおりです-

表示

データ項目はASCII形式で保存され、各文字には1バイトが必要です。 デフォルトの使用法です。

次の例では、必要なバイト数を計算します-

01 WS-NUM PIC S9(5)V9(3) USAGE IS DISPLAY.
It requires 8 bytes as sign and decimal doesn't require any byte.

01 WS-NUM PIC 9(5) USAGE IS DISPLAY.
It requires 5 bytes as sign.

計算/COMP

データ項目はバイナリ形式で保存されます。 ここで、データ項目は整数でなければなりません。

次の例では、必要なバイト数を計算します-

01 WS-NUM PIC S9(n) USAGE IS COMP.

If 'n' = 1 to 4, it takes 2 bytes.
If 'n' = 5 to 9, it takes 4 bytes.
If 'n' = 10 to 18, it takes 8 bytes.

COMP-1

データ項目は実数または浮動小数点数に似ており、単精度の浮動小数点数として表されます。 内部的には、データは16進形式で保存されます。 COMP-1はPIC句を受け入れません。 ここで、1ワードは4バイトに相当します。

COMP-2

データ項目はLongまたはDoubleに似ており、倍精度の浮動小数点数として表されます。 内部的には、データは16進形式で保存されます。 COMP-2はPIC句を指定しません。 ここで、2ワードは8バイトに相当します。

COMP-3

データ項目はパック10進数形式で保存されます。 各桁は半バイト(1ニブル)を占有し、符号は右端のニブルに格納されます。

次の例では、必要なバイト数を計算します-

01 WS-NUM PIC 9(n) USAGE IS COMP.
Number of bytes = n/2 (If n is even)
Number of bytes = n/2 + 1(If n is odd, consider only integer part)

01 WS-NUM PIC 9(4) USAGE IS COMP-3 VALUE 21.
It requires 2 bytes of storage as each digit occupies half a byte.

01 WS-NUM PIC 9(5) USAGE IS COMP-3 VALUE 21.
It requires 3 bytes of storage as each digit occupies half a byte.

コピーブック

COBOLコピーブックは、データ構造を定義する一連のコードです。 特定のデータ構造が多くのプログラムで使用されている場合、同じデータ構造を再度書き込む代わりに、コピーブックを使用できます。 COPYステートメントを使用して、コピーブックをプログラムに組み込みます。 COPYステートメントは、WorkingStorageセクションで使用されます。

次の例では、COBOLプログラム内にコピーブックが含まれています-

DATA DIVISION.
WORKING-STORAGE SECTION.
COPY ABC.

ここで、ABCはコピーブック名です。 ABCコピーブックの次のデータ項目は、プログラム内で使用できます。

01 WS-DESCRIPTION.
   05 WS-NUM.
      10 WS-NUM1 PIC 9(2) VALUE 20.
      10 WS-NUM2 PIC 9(2) VALUE 56.
   05 WS-CHAR.
      10 WS-CHAR1 PIC X(2) VALUE 'AA'.
      10 WS-CHAR2 PIC X(2) VALUE 'BB'.

COBOL-条件ステートメント

条件ステートメントは、プログラマーが指定した特定の条件に応じて実行フローを変更するために使用されます。 条件付きステートメントは常にtrueまたはfalseに評価されます。 条件は、IF、Evaluate、およびPerformステートメントで使用されます。 条件の種類は次のとおりです-

  • IF条件ステートメント
  • 関係条件
  • サイン条件
  • クラス条件
  • 条件名条件
  • 否定的な条件
  • 複合条件

IF条件ステートメント

IFステートメントは条件をチェックします。 条件が真の場合、IFブロックが実行されます。条件が偽の場合、ELSEブロックが実行されます。

*END-IF* は、IFブロックを終了するために使用されます。 IFブロックを終了するには、END-IFの代わりにピリオドを使用できます。 ただし、複数のIFブロックにはEND-IFを使用することを常にお勧めします。
*Nested-IF* -別のIFブロック内に現れるIFブロック。 ネストされたIFステートメントの深さに制限はありません。

構文

IF条件ステートメントの構文は次のとおりです-

IF [condition] THEN
   [COBOL statements]
ELSE
   [COBOL statements]
END-IF.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).
   01 WS-NUM3 PIC 9(5).
   01 WS-NUM4 PIC 9(6).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 25 TO WS-NUM1 WS-NUM3.
   MOVE 15 TO WS-NUM2 WS-NUM4.

   IF WS-NUM1 > WS-NUM2 THEN
      DISPLAY 'IN LOOP 1 - IF BLOCK'

      IF WS-NUM3 = WS-NUM4 THEN
         DISPLAY 'IN LOOP 2 - IF BLOCK'
      ELSE
         DISPLAY 'IN LOOP 2 - ELSE BLOCK'
      END-IF

   ELSE
      DISPLAY 'IN LOOP 1 - ELSE BLOCK'
   END-IF.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

IN LOOP 1 - IF BLOCK
IN LOOP 2 - ELSE BLOCK

関係条件

関係条件は、2つのオペランドを比較します。オペランドは、識別子、リテラル、または算術式のいずれかです。 数値フィールドの代数比較は、サイズと使用法の句に関係なく行われます。

非数値オペランドの場合

同じサイズの2つの非数値オペランドが比較される場合、文字は左から、対応する位置と最後まで比較されます。 より多くの文字を含むオペランドは、より大きく宣言されます。

サイズが等しくない2つの非数値オペランドを比較する場合、オペランドのサイズが等しくなるまで、短いデータ項目の末尾にスペースが追加され、前のポイントで述べた規則に従って比較されます。

構文

以下に、関係条件ステートメントの構文を示します-

[Data Name/Arithmetic Operation]

   [IS] [NOT]

[Equal to (=),Greater than (>), Less than (<),
Greater than or Equal (>=), Less than or equal (<=) ]

[Data Name/Arithmetic Operation]

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(9).
   01 WS-NUM2 PIC 9(9).

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 25 TO WS-NUM1.
   MOVE 15 TO WS-NUM2.

   IF WS-NUM1 IS GREATER THAN OR EQUAL TO WS-NUM2 THEN
      DISPLAY 'WS-NUM1 IS GREATER THAN WS-NUM2'
   ELSE
      DISPLAY 'WS-NUM1 IS LESS THAN WS-NUM2'
   END-IF.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1 IS GREATER THAN WS-NUM2

サイン条件

符号条件は、数値オペランドの符号を確認するために使用されます。 与えられた数値がゼロより大きいか、小さいか、等しいかを決定します。

構文

以下は、符号条件ステートメントの構文です-

[Data Name/Arithmetic Operation]

   [IS] [NOT]

[Positive, Negative or Zero]

[Data Name/Arithmetic Operation]

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC S9(9) VALUE -1234.
   01 WS-NUM2 PIC S9(9) VALUE 123456.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   IF WS-NUM1 IS POSITIVE THEN
      DISPLAY 'WS-NUM1 IS POSITIVE'.

   IF WS-NUM1 IS NEGATIVE THEN
      DISPLAY 'WS-NUM1 IS NEGATIVE'.

   IF WS-NUM1 IS ZERO THEN
      DISPLAY 'WS-NUM1 IS ZERO'.

   IF WS-NUM2 IS POSITIVE THEN
      DISPLAY 'WS-NUM2 IS POSITIVE'.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE

クラス条件

クラス条件は、オペランドにアルファベットまたは数値データのみが含まれているかどうかを確認するために使用されます。 スペースは、ALPHABETIC、ALPHABETIC-LOWER、およびALPHABETIC-UPPERで考慮されます。

構文

以下は、クラス条件ステートメントの構文です-

[Data Name/Arithmetic Operation>]

   [IS] [NOT]

[NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER]

[Data Name/Arithmetic Operation]

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC X(9) VALUE 'ABCD '.
   01 WS-NUM2 PIC 9(9) VALUE 123456789.

PROCEDURE DIVISION.
   A000-FIRST-PARA.

   IF WS-NUM1 IS ALPHABETIC THEN
      DISPLAY 'WS-NUM1 IS ALPHABETIC'.

   IF WS-NUM1 IS NUMERIC THEN
      DISPLAY 'WS-NUM1 IS NUMERIC'.

   IF WS-NUM2 IS NUMERIC THEN
      DISPLAY 'WS-NUM2 IS NUMERIC'.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC

条件名条件

条件名はユーザー定義の名前です。 ユーザーが指定した値のセットが含まれます。 ブール変数のように動作します。 レベル番号88で定義されます。 PIC句はありません。

構文

以下は、ユーザー定義の条件ステートメントの構文です-

88 [Condition-Name] VALUE [IS, ARE] [LITERAL] [THRU LITERAL].

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM PIC 9(3).
   88 PASS VALUES ARE 041 THRU 100.
   88 FAIL VALUES ARE 000 THRU 40.

PROCEDURE DIVISION.
   A000-FIRST-PARA.
   MOVE 65 TO WS-NUM.

   IF PASS
      DISPLAY 'Passed with ' WS-NUM ' marks'.

   IF FAIL
      DISPLAY 'FAILED with ' WS-NUM 'marks'.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Passed with 065 marks

否定的な条件

否定条件は、NOTキーワードを使用して与えられます。 条件がtrueで、その前にNOTを指定した場合、その最終値はfalseになります。

構文

否定条件ステートメントの構文は次のとおりです-

IF NOT [CONDITION]
   COBOL Statements
END-IF.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(2) VALUE 20.
   01 WS-NUM2 PIC 9(9) VALUE 25.

PROCEDURE DIVISION.
   A000-FIRST-PARA.

   IF NOT WS-NUM1 IS LESS THAN WS-NUM2 THEN
      DISPLAY 'IF-BLOCK'
   ELSE
      DISPLAY 'ELSE-BLOCK'
   END-IF.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

ELSE-BLOCK

複合条件

結合条件には、論理演算子ANDまたはORを使用して接続された2つ以上の条件が含まれます。

構文

以下は、結合された条件ステートメントの構文です-

IF [CONDITION] AND [CONDITION]
   COBOL Statements
END-IF.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-NUM1 PIC 9(2) VALUE 20.
   01 WS-NUM2 PIC 9(2) VALUE 25.
   01 WS-NUM3 PIC 9(2) VALUE 20.

PROCEDURE DIVISION.
   A000-FIRST-PARA.

   IF WS-NUM1 IS LESS THAN WS-NUM2 AND WS-NUM1=WS-NUM3 THEN
      DISPLAY 'Both condition OK'
   ELSE
      DISPLAY 'Error'
   END-IF.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Both condition OK

動詞を評価する

動詞の評価は、一連のIF-ELSEステートメントの置き換えです。 複数の条件を評価するために使用できます。 CプログラムのSWITCHステートメントに似ています。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 0.

PROCEDURE DIVISION.
   MOVE 3 TO WS-A.

   EVALUATE TRUE
      WHEN WS-A > 2
         DISPLAY 'WS-A GREATER THAN 2'

      WHEN WS-A < 0
         DISPLAY 'WS-A LESS THAN 0'

      WHEN OTHER
         DISPLAY 'INVALID VALUE OF WS-A'
   END-EVALUATE.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-A GREATER THAN 2

COBOL-ループステートメント

ファイルの各レコードを最後まで読み込むなど、何度も何度も実行する必要があるタスクがあります。 COBOLで使用されるループ文は次のとおりです-

  • 実行する
  • まで実行
  • 時間を実行
  • 変化させる

実行する

Perform Thruは、シーケンスの最初と最後の段落名を指定して一連の段落を実行するために使用されます。 最後の段落を実行した後、コントロールが返されます。

インライン実行

PERFORM内のステートメントは、END-PERFORMに達するまで実行されます。

構文

以下は、インライン実行の構文です-

PERFORM
   DISPLAY 'HELLO WORLD'
END-PERFORM.

アウトラインの実行

ここでは、文が1つの段落で実行され、その後、制御は他の段落またはセクションに移されます。

構文

以下は、行外実行の構文です-

PERFORM PARAGRAPH1 THRU PARAGRAPH2

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

PROCEDURE DIVISION.
   A-PARA.
   PERFORM DISPLAY 'IN A-PARA'
   END-PERFORM.
   PERFORM C-PARA THRU E-PARA.

   B-PARA.
   DISPLAY 'IN B-PARA'.
   STOP RUN.

   C-PARA.
   DISPLAY 'IN C-PARA'.

   D-PARA.
   DISPLAY 'IN D-PARA'.

   E-PARA.
   DISPLAY 'IN E-PARA'.

上記のCOBOLプログラムを実行する JCL

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

IN A-PARA
IN C-PARA
IN D-PARA
IN E-PARA
IN B-PARA

まで実行

「実行まで」では、指定された条件が満たされるまで段落が実行されます。 「with before before」はデフォルトの条件であり、段落内のステートメントの実行前に条件がチェックされることを示します。

構文

以下は、perform untilの構文です-

PERFORM A-PARA UNTIL COUNT=5

PERFORM A-PARA WITH TEST BEFORE UNTIL COUNT=5

PERFORM A-PARA WITH TEST AFTER UNTIL COUNT=5

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-CNT PIC 9(1) VALUE 0.

PROCEDURE DIVISION.
   A-PARA.
   PERFORM B-PARA WITH TEST AFTER UNTIL WS-CNT>3.
   STOP RUN.

   B-PARA.
   DISPLAY 'WS-CNT : 'WS-CNT.
   ADD 1 TO WS-CNT.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-CNT : 0
WS-CNT : 1
WS-CNT : 2
WS-CNT : 3

時間を実行

「実行時間」では、指定した回数だけ段落が実行されます。

構文

実行時間の構文は次のとおりです-

PERFORM A-PARA 5 TIMES.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

PROCEDURE DIVISION.
   A-PARA.
   PERFORM B-PARA 3 TIMES.
   STOP RUN.

   B-PARA.
   DISPLAY 'IN B-PARA'.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

IN B-PARA
IN B-PARA
IN B-PARA

変化させる

可変実行では、Until句の条件がtrueになるまで段落が実行されます。

構文

以下は、可変実行の構文です-

PERFORM A-PARA VARYING A FROM 1 BY 1 UNTIL A = 5.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 0.

PROCEDURE DIVISION.
   A-PARA.
   PERFORM B-PARA VARYING WS-A FROM 1 BY 1 UNTIL WS-A=5
   STOP RUN.

   B-PARA.
   DISPLAY 'IN B-PARA ' WS-A.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

IN B-PARA 1
IN B-PARA 2
IN B-PARA 3
IN B-PARA 4

GO TOステートメント

GO TOステートメントは、プログラムの実行フローを変更するために使用されます。 GO TOステートメントでは、転送は順方向にのみ行われます。 段落を終了するために使用されます。 使用されるGO TOステートメントの種類は次のとおりです-

無条件のGO TO

GO TO para-name.

条件付きGO TO

GO TO para-1 para-2 para-3 DEPENDING ON x.

「x」が1に等しい場合、コントロールは最初の段落に転送されます。 「x」が2に等しい場合、コントロールは2番目の段落に移され、以下同様に続きます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-A PIC 9 VALUE 2.

PROCEDURE DIVISION.
   A-PARA.
   DISPLAY 'IN A-PARA'
   GO TO B-PARA.

   B-PARA.
   DISPLAY 'IN B-PARA '.
   GO TO C-PARA D-PARA DEPENDING ON WS-A.

   C-PARA.
   DISPLAY 'IN C-PARA '.

   D-PARA.
   DISPLAY 'IN D-PARA '.
   STOP RUN.

上記のCOBOLプログラムを実行する JCL

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます。

IN A-PARA
IN B-PARA
IN D-PARA

COBOL-文字列処理

COBOLの文字列処理ステートメントは、文字列に対して複数の機能操作を実行するために使用されます。 以下は、文字列処理ステートメントです-

  • 調べる
  • ひも
  • 紐を外す

調べる

Inspect verbは、ストリング内の文字をカウントまたは置換するために使用されます。 文字列操作は、英数字、数値、またはアルファベットの値に対して実行できます。 検査操作は左から右に実行されます。 文字列操作に使用されるオプションは次のとおりです-

集計

集計オプションは、文字列の文字をカウントするために使用されます。

構文

以下は、集計オプションの構文です-

INSPECT input-string
TALLYING output-count FOR ALL CHARACTERS

使用されるパラメータは-

  • 入力文字列-文字がカウントされる文字列。
  • output-count-文字数を保持するデータ項目。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-CNT1 PIC 9(2) VALUE 0.
   01 WS-CNT2 PIC 9(2) VALUE 0.
   01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.

PROCEDURE DIVISION.
   INSPECT WS-STRING TALLYING WS-CNT1 FOR CHARACTER.
   DISPLAY "WS-CNT1 : "WS-CNT1.
   INSPECT WS-STRING TALLYING WS-CNT2 FOR ALL 'A'.
   DISPLAY "WS-CNT2 : "WS-CNT2

STOP RUN.

上記のCOBOLプログラムを実行する JCL

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-CNT1 : 15
WS-CNT2 : 06

交換する

置換オプションは、文字列文字を置換するために使用されます。

構文

以下は、オプションの置換の構文です-

INSPECT input-string REPLACING ALL char1 BY char2.

使用されるパラメータは-

  • input-string -文字がchar1からchar2に置き換えられる文字列。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.

PROCEDURE DIVISION.
   DISPLAY "OLD STRING : "WS-STRING.
   INSPECT WS-STRING REPLACING ALL 'A' BY 'X'.
   DISPLAY "NEW STRING : "WS-STRING.

STOP RUN.

上記のCOBOLプログラムを実行する JCL

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

OLD STRING : ABCDACDADEAAAFF
NEW STRING : XBCDXCDXDEXXXFF

ひも

文字列動詞は、文字列を連結するために使用されます。 STRINGステートメントを使用すると、2つ以上の文字列を組み合わせて長い文字列を作成できます。 「区切り」句は必須です。

構文

以下は、文字列動詞の構文です-

STRING ws-string1 DELIMITED BY SPACE
   ws-string2 DELIMITED BY SIZE
   INTO ws-destination-string
   WITH POINTER ws-count
   ON OVERFLOW DISPLAY message1
   NOT ON OVERFLOW DISPLAY message2
END-STRING.

以下は、使用されるパラメータの詳細です-

  • ws-string1およびws-string2:連結される入力文字列
  • ws-string:出力文字列
  • ws-count:新しい連結文字列の長さをカウントするために使用されます
  • 区切り文字は、文字列の終わりを指定します
  • ポインターとオーバーフローはオプションです

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STRING PIC A(30).
   01 WS-STR1 PIC A(15) VALUE 'finddevguides'.
   01 WS-STR2 PIC A(7) VALUE 'Welcome'.
   01 WS-STR3 PIC A(7) VALUE 'To AND'.
   01 WS-COUNT PIC 99 VALUE 1.

PROCEDURE DIVISION.
   STRING WS-STR2 DELIMITED BY SIZE
      WS-STR3 DELIMITED BY SPACE
      WS-STR1 DELIMITED BY SIZE
      INTO WS-STRING
      WITH POINTER WS-COUNT
      ON OVERFLOW DISPLAY 'OVERFLOW!'
   END-STRING.

   DISPLAY 'WS-STRING : 'WS-STRING.
   DISPLAY 'WS-COUNT : 'WS-COUNT.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-STRING : WelcomeTofinddevguides
WS-COUNT : 25

紐を外す

Unstring verbは、1つのストリングを複数のサブストリングに分割するために使用されます。 Delimited By句は必須です。

構文

以下は、Unstring verbの構文です-

UNSTRING ws-string DELIMITED BY SPACE
INTO ws-str1, ws-str2
WITH POINTER ws-count
ON OVERFLOW DISPLAY message
NOT ON OVERFLOW DISPLAY message
END-UNSTRING.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STRING PIC A(30) VALUE 'WELCOME TO finddevguides'.
   01 WS-STR1 PIC A(7).
   01 WS-STR2 PIC A(2).
   01 WS-STR3 PIC A(15).
   01 WS-COUNT PIC 99 VALUE 1.

PROCEDURE DIVISION.
   UNSTRING WS-STRING DELIMITED BY SPACE
      INTO WS-STR1, WS-STR2, WS-STR3
   END-UNSTRING.

   DISPLAY 'WS-STR1 : 'WS-STR1.
   DISPLAY 'WS-STR2 : 'WS-STR2.
   DISPLAY 'WS-STR3 : 'WS-STR3.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-STR1 : WELCOME
WS-STR2 : TO
WS-STR3 : finddevguides

COBOL-テーブル処理

COBOLの配列はテーブルと呼ばれます。 配列は線形データ構造であり、同じタイプの個々のデータ項目のコレクションです。 テーブルのデータ項目は内部的にソートされます。

テーブル宣言

テーブルはデータ部で宣言されています。 Occurs 句は、テーブルを定義するために使用されます。 Occurs句は、データ名定義の繰り返しを示します。 02から49までのレベル番号でのみ使用できます。 Redefinesでは発生句を使用しないでください。 一次元と二次元の表の説明は次のとおりです-

一次元テーブル

1次元テーブルでは、 occurs 句は宣言で1回だけ使用されます。 WSTABLEは、テーブルを含むグループアイテムです。 WS-Bは、10回出現するテーブル要素に名前を付けます。

構文

以下は、一次元のテーブルを定義するための構文です-

01 WS-TABLE.
   05 WS-A PIC A(10) OCCURS 10 TIMES.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A PIC A(10) VALUE 'TUTORIALS' OCCURS 5 TIMES.

PROCEDURE DIVISION.
   DISPLAY "ONE-D TABLE : "WS-TABLE.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS

二次元テーブル

両方のデータ要素が可変長である2次元テーブルが作成されます。 参考のため、構文を確認してから、テーブルの分析を試みてください。 最初の配列(WS-A)は1〜10回発生し、内部配列(WS-C)は1〜5回発生します。 WS-Aの各エントリには、WS-Cの対応する5つのエントリがあります。

構文

以下は、2次元テーブルを定義するための構文です-

01 WS-TABLE.
   05 WS-A OCCURS 10 TIMES.
      10 WS-B PIC A(10).
      10 WS-C OCCURS 5 TIMES.
         15 WS-D PIC X(6).

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 2 TIMES.
         10 WS-B PIC A(10) VALUE ' TUTORIALS'.
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(6) VALUE ' POINT'.

PROCEDURE DIVISION.
   DISPLAY "TWO-D TABLE : "WS-TABLE.

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

TWO-D TABLE :  TUTORIALS POINT POINT TUTORIALS POINT POINT

添字

テーブルの個々の要素には、添え字を使用してアクセスできます。 添え字の値の範囲は、1からテーブルの出現回数までです。 添字には任意の正数を指定できます。 データ分割での宣言は必要ありません。 occurs句で自動的に作成されます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   DISPLAY 'WS-TABLE  : ' WS-TABLE.
   DISPLAY 'WS-A(1)   : ' WS-A(1).
   DISPLAY 'WS-C(1,1) : ' WS-C(1,1).
   DISPLAY 'WS-C(1,2) : ' WS-C(1,2).
   DISPLAY 'WS-A(2)   : ' WS-A(2).
   DISPLAY 'WS-C(2,1) : ' WS-C(2,1).
   DISPLAY 'WS-C(2,2) : ' WS-C(2,2).
   DISPLAY 'WS-A(3)   : ' WS-A(3).
   DISPLAY 'WS-C(3,1) : ' WS-C(3,1).
   DISPLAY 'WS-C(3,2) : ' WS-C(3,2).

STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

WS-TABLE  : 12ABCDEF34GHIJKL56MNOPQR
WS-A(1)   : 12ABCDEF
WS-C(1,1) : ABC
WS-C(1,2) : DEF
WS-A(2)   : 34GHIJKL
WS-C(2,1) : GHI
WS-C(2,2) : JKL
WS-A(3)   : 56MNOPQR
WS-C(3,1) : MNO
WS-C(3,2) : PQR

索引

インデックスを使用してテーブル要素にアクセスすることもできます。 インデックスは、テーブルの先頭からの要素の変位です。 インデックスは、INDEXED BY句を使用してOccurs句で宣言されます。 インデックスの値は、SETステートメントとPERFORM Varyingオプションを使用して変更できます。

構文

以下は、テーブルでインデックスを定義するための構文です-

01 WS-TABLE.
   05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   PERFORM A-PARA VARYING I FROM 1 BY 1 UNTIL I >3
   STOP RUN.

   A-PARA.
   PERFORM C-PARA VARYING J FROM 1 BY 1 UNTIL J>2.

   C-PARA.
   DISPLAY WS-C(I,J).
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

ABC
DEF
GHI
JKL
MNO
PQR

セットステートメント

Setステートメントは、インデックス値を変更するために使用されます。 Set動詞は、インデックス値を初期化、インクリメント、またはデクリメントするために使用されます。 [検索]および[すべて検索]で使用して、テーブル内の要素を見つけます。

構文

以下は、Setステートメントを使用するための構文です-

SET I J TO positive-number
SET I TO J
SET I TO 5
SET I J UP BY 1
SET J DOWN BY 5

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A OCCURS 3 TIMES INDEXED BY I.
         10 WS-B PIC A(2).
         10 WS-C OCCURS 2 TIMES INDEXED BY J.
            15 WS-D PIC X(3).

PROCEDURE DIVISION.
   MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
   SET I J TO 1.
   DISPLAY WS-C(I,J).
   SET I J UP BY 1.
   DISPLAY WS-C(I,J).

STOP RUN.

上記のCOBOLプログラムを実行する JCL

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

ABC
JKL

サーチ

検索は、テーブル内の要素を見つけるために使用される線形検索方法です。 ソート済みのテーブルとソートされていないテーブルの両方で実行できます。 Index句で宣言されたテーブルにのみ使用されます。 インデックスの初期値から始まります。 検索された要素が見つからない場合、インデックスは自動的に1ずつ増加し、テーブルの最後まで続きます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-A PIC X(1) OCCURS 18 TIMES INDEXED BY I.
   01 WS-SRCH PIC A(1) VALUE 'M'.

PROCEDURE DIVISION.
   MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE.
   SET I TO 1.
   SEARCH WS-A
      AT END DISPLAY 'M NOT FOUND IN TABLE'
      WHEN WS-A(I) = WS-SRCH
      DISPLAY 'LETTER M FOUND IN TABLE'
   END-SEARCH.

STOP RUN.

上記のCOBOLプログラムを実行する JCL

//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

LETTER M FOUND IN TABLE

すべて検索

すべて検索は、テーブル内の要素を見つけるために使用されるバイナリ検索方法です。 [すべて検索]オプションを使用するには、テーブルを並べ替える必要があります。 インデックスは初期化を必要としません。 バイナリ検索では、テーブルは2つの半分に分割され、検索された要素の半分が存在するかどうかを判断します。 このプロセスは、要素が見つかるか終了に達するまで繰り返されます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-TABLE.
      05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-NUM INDEXED BY I.
      10 WS-NUM PIC 9(2).
      10 WS-NAME PIC A(3).

PROCEDURE DIVISION.
   MOVE '12ABC56DEF34GHI78JKL93MNO11PQR' TO WS-TABLE.
   SEARCH ALL WS-RECORD
     AT END DISPLAY 'RECORD NOT FOUND'
     WHEN WS-NUM(I) = 93
     DISPLAY 'RECORD FOUND '
     DISPLAY WS-NUM(I)
     DISPLAY WS-NAME(I)

END-SEARCH.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

RECORD FOUND
93
MNO

COBOL-ファイル処理

COBOLのファイルの概念は、C/C ++のファイルとは異なります。 COBOLで「ファイル」の基本を学習している間、両方の言語の概念は相互に関連してはなりません。 単純なテキストファイルはCOBOLでは使用できませんが、代わりに* PS(物理シーケンシャル)および *VSAM ファイルが使用されます。 PSファイルについては、このモジュールで説明します。

COBOLでのファイル処理を理解するには、基本的な用語を知っている必要があります。 これらの用語は、ファイル処理の基本を理解するためにのみ役立ちます。 さらに詳細な用語については、「ファイル処理動詞」の章で説明します。 以下は基本的な用語です-

  • フィールド
  • 記録
  • 物理記録
  • 論理レコード
  • File

次の例は、これらの用語を理解するのに役立ちます-

プログラム構造

フィールド

フィールドは、要素に関して保存されたデータを示すために使用されます。 上記の例に示すように、学生ID、名前、マーク、合計マーク、パーセンテージなどの単一の要素を表します。 フィールドの文字数はフィールドサイズと呼ばれます。たとえば、学生名には10文字を使用できます。 フィールドは次の属性を持つことができます-

  • *主キー*は、各レコードに固有のフィールドであり、特定のレコードを識別するために使用されます。 たとえば、学生のマークファイルでは、各学生は主キーを形成する一意の学生IDを持ちます。
  • *セカンダリキー*は、関連データの検索に使用される一意または非一意のフィールドです。 たとえば、学生のマークファイルでは、学生IDが不明な場合、学生のフルネームをセカンダリキーとして使用できます。
  • *記述子*フィールドは、エンティティを記述するために使用されます。 たとえば、学生のマークファイルでは、レコードに意味を追加するマークとパーセンテージフィールドは既知の記述子です。

記録

レコードは、エンティティを記述するために使用されるフィールドのコレクションです。 1つ以上のフィールドが一緒になってレコードを形成します。 たとえば、学生のマークファイル、学生ID、名前、マーク、合計マーク、およびパーセンテージが1つのレコードを形成します。 レコード内のすべてのフィールドの累積サイズは、レコードサイズと呼ばれます。 ファイルに存在するレコードは、固定長でも可変長でもかまいません。

物理記録

物理レコードは、外部デバイスに存在する情報です。 ブロックとも呼ばれます。

論理レコード

論理レコードは、プログラムで使用される情報です。 COBOLプログラムでは、どの時点でも1つのレコードのみを処理でき、論理レコードと呼ばれます。

File

ファイルは、関連するレコードのコレクションです。 たとえば、学生のマークファイルは、すべての学生のレコードで構成されます。

COBOL-ファイル編成

ファイル編成は、レコードがファイルに編成される方法を示します。 レコードへのアクセス効率を高めるために、ファイルにはさまざまなタイプの組織があります。 以下は、ファイル編成スキームのタイプです-

  • 順次ファイル編成
  • インデックス付きの順次ファイル編成
  • 相対ファイル編成

このモジュールの構文は、それぞれの用語とともに言及され、プログラムでの使用法のみを参照しています。 これらの構文を使用する完全なプログラムについては、「ファイル処理動詞」の章で説明します。

順次ファイル編成

順次ファイルは、順次に格納およびアクセスされるレコードで構成されます。 順次ファイル編成の重要な属性は次のとおりです-

  • レコードは順番に読み取ることができます。 10番目のレコードを読み取るには、前の9つのレコードをすべて読み取る必要があります。
  • レコードは順番に書き込まれます。 新しいレコードを間に挿入することはできません。 新しいレコードは常にファイルの最後に挿入されます。
  • レコードを順次ファイルに配置した後、レコードを削除、短縮、または延長することはできません。
  • レコードの順序は、一度挿入されると変更できません。
  • 記録の更新が可能です。 新しいレコード長が古いレコード長と同じ場合、レコードは上書きできます。
  • 順次出力ファイルは、印刷に適したオプションです。

構文

順次ファイル編成の構文は次のとおりです-

INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name-jcl
   ORGANIZATION IS SEQUENTIAL

インデックス付き順次ファイル編成

インデックス付きシーケンシャルファイルは、シーケンシャルにアクセスできるレコードで構成されます。 直接アクセスも可能です。 それは2つの部分で構成されています-

  • *データファイル*にはシーケンシャルスキームのレコードが含まれます。
  • *インデックスファイル*には、データファイル内の主キーとそのアドレスが含まれています。

順次ファイル編成の重要な属性は次のとおりです-

  • レコードは、順次ファイル編成の場合と同様に順次に読み取ることができます。
  • 主キーがわかっている場合、レコードにランダムにアクセスできます。 インデックスファイルを使用してレコードのアドレスを取得し、データファイルからレコードを取得します。
  • ソートされたインデックスは、キー値をファイル内のレコードの位置に関連付けるこのファイルシステムで保持されます。
  • レコードを取得するための代替インデックスも作成できます。

構文

以下は、インデックス付き順次ファイル編成の構文です-

INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name-jcl
   ORGANIZATION IS INDEXED
   RECORD KEY IS primary-key
   ALTERNATE RECORD KEY IS rec-key

相対ファイル編成

相対ファイルは、*相対アドレス*で順序付けられたレコードで構成されます。 以下は、相対的なファイル編成の重要な属性です-

  • レコードは、シーケンシャルおよびインデックス付きファイル編成の場合と同様にシーケンシャル順序で読み取ることができます。
  • 相対キーを使用してレコードにアクセスできます。 相対キーは、ファイルの先頭のアドレスに対するレコードの位置を表します。
  • レコードは、相対キーを使用して挿入できます。 相対アドレスは、相対キーを使用して計算されます。
  • 相対ファイルは、レコードへの最速のアクセスを提供します。
  • このファイルシステムの主な欠点は、一部の中間レコードが欠落している場合、それらもスペースを占有することです。

構文

以下は、相対ファイル編成の構文です-

INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name-jcl
   ORGANIZATION IS RELATIVE
   RELATIVE KEY IS rec-key

COBOL-ファイルアクセスモード

今まで、ファイル編成スキームが議論されてきました。 ファイル編成スキームごとに、異なるアクセスモードを使用できます。 ファイルアクセスモードの種類は次のとおりです-

  • シーケンシャルアクセス
  • ランダムアクセス
  • ダイナミックアクセス

このモジュールの構文は、それぞれの用語とともに言及され、プログラムでの使用法のみを参照しています。 これらの構文を使用した完全なプログラムについては、次の章で説明します。

シーケンシャルアクセス

アクセスモードがシーケンシャルの場合、レコードの取得方法は、選択したファイル編成によって変わります。

  • *順次ファイル*の場合、レコードは挿入されたのと同じ順序でアクセスされます。
  • *インデックス付きファイル*の場合、レコードを取得するために使用されるパラメーターはレコードキー値です。
  • *相対ファイル*の場合、相対レコードキーを使用してレコードを取得します。

構文

順次アクセスモードの構文は次のとおりです-

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS SEQUENTIAL
   ACCESS MODE IS SEQUENTIAL


ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS INDEXED
   ACCESS MODE IS SEQUENTIAL
   RECORD KEY IS rec-key1
   ALTERNATE RECORD KEY IS rec-key2


ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS RELATIVE
   ACCESS MODE IS SEQUENTIAL
   RELATIVE KEY IS rec-key1

ランダムアクセス

アクセスモードがRANDOMの場合、レコードの取得方法は、選択したファイル構成に従って変更されます。

  • *インデックス付きファイル*の場合、レコードは、主キーまたは代替キーのキーフィールドに配置された値に従ってアクセスされます。 1つ以上の代替インデックスが存在する場合があります。
  • relative files の場合、レコードは相対レコードキーを通じて取得されます。

構文

ランダムアクセスモードの構文は次のとおりです-

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS INDEXED
   ACCESS MODE IS RANDOM
   RECORD KEY IS rec-key1
   ALTERNATE RECORD KEY IS rec-key2


ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS RELATIVE
   ACCESS MODE IS RANDOM
   RELATIVE KEY IS rec-key1

ダイナミックアクセス

ダイナミックアクセスは、同じプログラムでシーケンシャルアクセスとランダムアクセスの両方をサポートします。 ダイナミックアクセスでは、1つのファイル定義を使用して、キーによっていくつかのレコードにシーケンシャル順序でアクセスし、他のレコードにアクセスするなど、シーケンシャル処理とランダム処理の両方を実行します。

相対ファイルとインデックス付きファイルの場合、ダイナミックアクセスモードでは、READステートメントでNEXT句を使用して、ファイルの読み取り中にシーケンシャルアクセスモードとランダムアクセスモードを切り替えることができます。 NEXTおよびREAD機能については、次の章で説明します。

構文

ダイナミックアクセスモードの構文は次のとおりです-

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS SEQUENTIAL
   ACCESS MODE IS DYNAMIC
   RECORD KEY IS rec-key1
   ALTERNATE RECORD KEY IS rec-key2


ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT file-name ASSIGN TO dd-name
   ORGANIZATION IS RELATIVE
   ACCESS MODE IS DYNAMIC
   RELATIVE KEY IS rec-key1

COBOL-ファイル処理動詞

ファイル処理動詞は、ファイルに対してさまざまな操作を実行するために使用されます。 以下は、ファイル処理動詞です-

  • Open
  • Read
  • 書きます
  • リライト
  • 削除する
  • 開始 *閉じる

動詞を開く

オープンは、実行する必要がある最初のファイル操作です。 Openが成功した場合、ファイルに対してそれ以降の操作のみが可能です。 ファイルを開いた後にのみ、ファイル構造内の変数を処理に使用できます。* FILE STATUS *変数は、各ファイル操作の後に更新されます。

構文

OPEN "mode" file-name.

ここで、file-nameは文字列リテラルであり、ファイルに名前を付けるために使用します。 ファイルは、次のモードで開くことができます-

Sr.No. Mode & Description
1

Input

入力モードは既存のファイルに使用されます。 このモードでは、ファイルの読み取りのみが可能で、ファイルに対する他の操作は許可されていません。

2

Output

出力モードは、ファイルにレコードを挿入するために使用されます。 *順次ファイル*が使用され、ファイルがいくつかのレコードを保持している場合、既存のレコードが最初に削除されてから、新しいレコードがファイルに挿入されます。 *インデックス付きファイル*または*相対ファイル*の場合は発生しません。

3

Extend

拡張モードは、 sequential file にレコードを追加するために使用されます。 このモードでは、レコードは最後に挿入されます。 ファイルアクセスモードが*ランダム*または*ダイナミック*の場合、拡張モードは使用できません。

4

I-O

入出力モードは、ファイルのレコードを読み書きするために使用されます。

動詞を読む

読み取り動詞は、ファイルレコードを読み取るために使用されます。 読み取りの機能は、ファイルからレコードを取得することです。 読み取り動詞ごとに、ファイル構造に読み取れるレコードは1つだけです。 読み取り操作を実行するには、ファイルをINPUTモードまたはI-Oモードで開きます。 読み取りステートメントごとに、ファイルポインターがインクリメントされるため、連続するレコードが読み取られます。

構文

以下は、ファイルアクセスモードがシーケンシャルの場合にレコードを読み取る構文です-

READ file-name NEXT RECORD INTO ws-file-structure
   AT END DISPLAY 'End of File'
   NOT AT END DISPLAY 'Record Details:' ws-file-structure
END-READ.

以下は、使用されるパラメータです-

  • NEXT RECORDはオプションであり、インデックス付きシーケンシャルファイルがシーケンシャルに読み取られるときに指定されます。
  • INTO句はオプションです。 ws-file-structureはWorkingStorageセクションで定義され、READステートメントから値を取得します。
  • AT END条件は、ファイルの終わりに達するとTrueになります。

-次の例は、行順編成を使用して既存のファイルを読み取ります。 このプログラムは、ファイルに存在するすべてのレコードを表示する Live Demo オプションを使用してコンパイルおよび実行できます。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
      FILE-CONTROL.
      SELECT STUDENT ASSIGN TO 'input.txt'
      ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
   FILE SECTION.
   FD STUDENT.
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(5).
      05 NAME PIC A(25).

   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
   01 WS-EOF PIC A(1).

PROCEDURE DIVISION.
   OPEN INPUT STUDENT.
      PERFORM UNTIL WS-EOF='Y'
         READ STUDENT INTO WS-STUDENT
            AT END MOVE 'Y' TO WS-EOF
            NOT AT END DISPLAY WS-STUDENT
         END-READ
      END-PERFORM.
   CLOSE STUDENT.
STOP RUN.
*input.txt* ファイルで利用可能な入力ファイルのデータには次のものが含まれていると仮定します-
20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan

構文

以下は、ファイルアクセスモードがランダムな場合にレコードを読み取る構文です-

READ file-name RECORD INTO ws-file-structure
   KEY IS rec-key
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Details: ' ws-file-structure
END-READ.

-次の例では、インデックス化された組織を使用して既存のファイルを読み取ります。 このプログラムは、メインフレームで JCL を使用してコンパイルおよび実行でき、ファイルに存在するすべてのレコードが表示されます。 Mainframesサーバーでは、テキストファイルは使用しません。代わりに、PSファイルを使用します。

メインフレームに存在するファイルの内容が上記の例のinput.txtファイルと同じであると仮定しましょう。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO IN1
      ORGANIZATION IS INDEXED
      ACCESS IS RANDOM
      RECORD KEY IS STUDENT-ID
      FILE STATUS IS FS.

DATA DIVISION.
   FILE SECTION.
   FD STUDENT.
      01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(5).
      05 NAME PIC A(25).

   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).

PROCEDURE DIVISION.
   OPEN INPUT STUDENT.
      MOVE 20005 TO STUDENT-ID.

      READ STUDENT RECORD INTO WS-STUDENT-FILE
         KEY IS STUDENT-ID
         INVALID KEY DISPLAY 'Invalid Key'
         NOT INVALID KEY DISPLAY WS-STUDENT-FILE
      END-READ.

   CLOSE STUDENT.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = STUDENT-FILE-NAME,DISP=SHR

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

20005 Amitabh Bachhan

動詞を書く

書き込み動詞は、ファイルにレコードを挿入するために使用されます。 レコードが書き込まれると、レコードバッファで使用できなくなります。 レコードをファイルに挿入する前に、値をレコードバッファーに移動してから、書き込み動詞を実行します。

Writeステートメントを FROM オプションとともに使用して、作業用ストレージ変数からレコードを直接書き込むことができます。 Fromはオプションの句です。 アクセスモードがシーケンシャルの場合、レコードを書き込むには、ファイルを出力モードまたは拡張モードで開く必要があります。 アクセスモードがランダムまたはダイナミックの場合、レコードを書き込むには、ファイルを出力モードまたはI-Oモードで開く必要があります。

構文

以下は、ファイル編成がシーケンシャルであるときにレコードを読み取るための構文です-

WRITE record-buffer [FROM ws-file-structure]
END-WRITE.

以下は、ファイル編成がインデックス付けされているか、相対であるときにレコードを読み取るための構文です-

WRITE record-buffer [FROM ws-file-structure]
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Inserted'
END-WRITE.

-次の例は、組織がシーケンシャルであるときに新しいファイルに新しいレコードを挿入する方法を示しています。

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO OUT1
      ORGANIZATION IS SEQUENTIAL
      ACCESS IS SEQUENTIAL
      FILE STATUS IS FS.

DATA DIVISION.
   FILE SECTION.
   FD STUDENT
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(5).
      05 NAME PIC A(25).
      05 CLASS PIC X(3).

   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
      05 WS-CLASS PIC X(3).

PROCEDURE DIVISION.
   OPEN EXTEND STUDENT.
      MOVE 1000 TO STUDENT-ID.
      MOVE 'Tim' TO NAME.
      MOVE '10' TO CLASS.
      WRITE STUDENT-FILE
      END-WRITE.
   CLOSE STUDENT.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = (NEW,CATALOG,DELETE)

上記のプログラムをコンパイルして実行すると、新しいレコードが出力ファイルに追加されます。

1000 Tim         10

動詞を書き換える

Rewrite verbは、レコードを更新するために使用されます。 書き換え操作を行うには、ファイルをI-Oモードで開く必要があります。 読み取り操作が成功した後にのみ使用できます。 Rewrite verbは、最後に読み取られたレコードを上書きします。

構文

以下は、ファイル編成がシーケンシャルであるときにレコードを読み取るための構文です-

REWRITE record-buffer [FROM ws-file-structure]
END-REWRITE.

以下は、ファイル編成がインデックス付けされているか、相対であるときにレコードを読み取るための構文です-

REWRITE record-buffer [FROM ws-file-structure]
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Updated'
END-REWRITE.

-次の例は、前の書き込みステップで挿入した既存のレコードを更新する方法を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO IN1
      ORGANIZATION IS INDEXED
      ACCESS IS RANDOM
      RECORD KEY IS STUDENT-ID
      FILE STATUS IS FS.

DATA DIVISION.
   FILE SECTION.
   FD STUDENT
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(4).
      05 NAME PIC A(12).
      05 CLASS PIC X(3).

   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
      05 WS-CLASS PIC X(3).

PROCEDURE DIVISION.
   OPEN I-O STUDENT.
   MOVE '1000' TO STUDENT-ID.

   READ STUDENT
      KEY IS STUDENT-ID
      INVALID KEY DISPLAY ‘KEY IS NOT EXISTING’
   END-READ.

   MOVE 'Tim Dumais' TO NAME.
   REWRITE STUDENT-FILE
   END-REWRITE.
   CLOSE STUDENT.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR

上記のプログラムをコンパイルして実行すると、レコードが更新されます-

1000 Tim Dumais  10

動詞を削除

削除動詞は、インデックス付きファイルおよび相対ファイルでのみ実行できます。 ファイルはI-Oモードで開く必要があります。 順次ファイル編成では、レコードを削除できません。 順次アクセスモードの場合、Readステートメントによって最後に読み取られたレコードは削除されます。 ランダムアクセスモードでは、レコードキーを指定してから、削除操作を実行します。

構文

以下は、レコードを削除するための構文です-

DELETE file-name RECORD
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'Record Deleted'
END-DELETE.

-既存のレコードを削除するには-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT STUDENT ASSIGN TO OUT1
      ORGANIZATION IS INDEXED
      ACCESS IS RANDOM
      RECORD KEY IS STUDENT-ID
      FILE STATUS IS FS.

DATA DIVISION.
   FILE SECTION.
   FD STUDENT
   01 STUDENT-FILE.
      05 STUDENT-ID PIC 9(4).
      05 NAME PIC A(12).
      05 CLASS PIC X(3).
   WORKING-STORAGE SECTION.
   01 WS-STUDENT.
      05 WS-STUDENT-ID PIC 9(5).
      05 WS-NAME PIC A(25).
      05 WS-CLASS PIC X(3).

PROCEDURE DIVISION.
   OPEN I-O STUDENT.
   MOVE '1000' TO STUDENT-ID.

   DELETE STUDENT RECORD
      INVALID KEY DISPLAY 'Invalid Key'
      NOT INVALID KEY DISPLAY 'Record Deleted'
   END-DELETE.

   CLOSE STUDENT.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Record Deleted

動詞を開始

開始動詞は、インデックス付きファイルおよび相対ファイルでのみ実行できます。 特定のレコードにファイルポインターを配置するために使用されます。 アクセスモードは、シーケンシャルモードまたはダイナミックモードでなければなりません。 ファイルはI-Oまたは入力モードで開く必要があります。

構文

以下は、特定のレコードにポインタを配置するための構文です-

START file-name KEY IS [=, >, <, NOT, <= or >=] rec-key
   INVALID KEY DISPLAY 'Invalid Key'
   NOT INVALID KEY DISPLAY 'File Pointer Updated'
END-START.

動詞を閉じる

ファイルを閉じるには、閉じる動詞が使用されます。 Close操作を実行した後、ファイル構造内の変数は処理に使用できなくなります。 プログラムとファイル間のリンクは失われます。

構文

以下は、ファイルを閉じるための構文です-

CLOSE file-name.

COBOL-サブルーチン

Cobolサブルーチンは、独立してコンパイルできますが、独立して実行できないプログラムです。 サブルーチンには2つのタイプがあります: Perform ステートメントのような* internalサブルーチン*とCALL verbのような external サブルーチンです。

動詞を呼び出す

呼び出し動詞は、あるプログラムから別のプログラムに制御を転送するために使用されます。 CALL動詞を含むプログラムは Calling Program であり、呼び出されるプログラムは Called Program として知られています。 呼び出しプログラムの実行は、呼び出されたプログラムが実行を終了するまで停止します。 Exit Programステートメントは、呼び出し先プログラムで制御を戻すために使用されます。

呼び出されたプログラムの制約

以下は、呼び出されたプログラムの要件です-

  • *リンケージセクション*は、呼び出されたプログラムで定義する必要があります。 プログラムで渡されるデータ要素で構成されます。 データ項目にValue句を含めることはできません。 PIC句は、呼び出しプログラムを介して渡される変数と互換性がある必要があります。
  • *を使用した手続き除算*には、呼び出し側プログラムから渡される変数のリストがあり、呼び出し動詞で言及されている順序と同じでなければなりません。
  • Exit program ステートメントは、制御を戻すために呼び出されたプログラムで使用されます。 呼び出されたプログラムの最後のステートメントでなければなりません。

パラメータは、2つの方法でプログラム間で渡すことができます-

  • 参照により *コンテンツごと

参照による呼び出し

呼び出されたプログラムの変数の値が変更された場合、それらの新しい値は呼び出し元のプログラムに反映されます。* BY *句が指定されていない場合、変数は常に参照渡しされます。

構文

参照によってサブルーチンを呼び出す構文は次のとおりです-

CALL sub-prog-name USING variable-1, variable-2.

次の例は、メインの呼び出しプログラムであり、UTILは呼び出されたプログラムです-

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
   01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.

PROCEDURE DIVISION.
   CALL 'UTIL' USING WS-STUDENT-ID, WS-STUDENT-NAME.
   DISPLAY 'Student Id : ' WS-STUDENT-ID
   DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

呼び出されたプログラム

IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.

DATA DIVISION.
   LINKAGE SECTION.
   01 LS-STUDENT-ID PIC 9(4).
   01 LS-STUDENT-NAME PIC A(15).

PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
   DISPLAY 'In Called Program'.
   MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

In Called Program
Student Id : 1111
Student Name : Tim

コンテンツで呼び出す

呼び出されたプログラムの変数の値が変更された場合、それらの新しい値は呼び出しプログラムに反映されません。

構文

内容によってサブルーチンを呼び出す構文は次のとおりです-

CALL sub-prog-name USING
BY CONTENT variable-1, BY CONTENT variable-2.

次の例は、メインの呼び出しプログラムであり、UTILは呼び出されたプログラムです-

IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
   01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.

PROCEDURE DIVISION.
   CALL 'UTIL' USING BY CONTENT WS-STUDENT-ID, BY CONTENT WS-STUDENT-NAME.
   DISPLAY 'Student Id : ' WS-STUDENT-ID
   DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.

呼び出されたプログラム

IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.

DATA DIVISION.
   LINKAGE SECTION.
   01 LS-STUDENT-ID PIC 9(4).
   01 LS-STUDENT-NAME PIC A(15).

PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
   DISPLAY 'In Called Program'.
   MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

In Called Program
Student Id : 1000
Student Name : Tim

通話の種類

呼び出しには2つのタイプがあります-

  • *静的呼び出し*は、プログラムがNODYNAMコンパイラオプションでコンパイルされるときに発生します。 呼び出された静的プログラムは、コンパイル時にストレージにロードされます。
  • *ダイナミックコール*は、プログラムがDYNAMおよびNODLLコンパイラオプションでコンパイルされるときに発生します。 動的に呼び出されるプログラムは、実行時にストレージにロードされます。

COBOL-内部ソート

ファイル内のデータのソートまたは2つ以上のファイルのマージは、ほとんどすべてのビジネス指向のアプリケーションで共通の必要性です。 ソートは、レコードを昇順または降順で配列するために使用されるため、順次処理を実行できます。 COBOLでファイルをソートするために使用される2つの技術があります-

  • *外部ソート*は、JCLのSORTユーティリティを使用してファイルをソートするために使用されます。 これについては、JCLの章で説明しました。 今のところ、内部ソートに焦点を当てます。
  • 内部ソート*は、COBOLプログラム内のファイルをソートするために使用されます。 *SORT 動詞は、ファイルのソートに使用されます。

動詞の並べ替え

COBOLのソートプロセスでは3つのファイルが使用されます-

  • *入力ファイル*は、昇順または降順でソートする必要があるファイルです。
  • *ワークファイル*は、ソートプロセスの進行中にレコードを保持するために使用されます。 入力ファイルのレコードは、ソートプロセスのためにワークファイルに転送されます。 このファイルは、SDエントリの下のファイルセクションで定義する必要があります。
  • *出力ファイル*は、ソート処理後に取得されるファイルです。 これは、ソート動詞の最終出力です。

構文

以下は、ファイルをソートするための構文です-

SORT work-file ON ASCENDING KEY rec-key1
   [ON DESCENDING KEY rec-key2]
USING input-file GIVING output-file.

SORTは次の操作を実行します-

  • ワークファイルをI-Oモードで、入力ファイルをINPUTモードで、出力ファイルをOUTPUTモードで開きます。
  • 入力ファイルにあるレコードをワークファイルに転送します。
  • SORT-FILEをrec-keyで昇順/降順でソートします。
  • ワークファイルから出力ファイルにソートされたレコードを転送します。
  • 入力ファイルと出力ファイルを閉じて、ワークファイルを削除します。

次の例では、INPUTは入力ファイルであり、昇順でソートする必要があります-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      SELECT INPUT ASSIGN TO IN.
      SELECT OUTPUT ASSIGN TO OUT.
      SELECT WORK ASSIGN TO WRK.

DATA DIVISION.
   FILE SECTION.
   FD INPUT.
      01 INPUT-STUDENT.
         05 STUDENT-ID-I PIC 9(5).
         05 STUDENT-NAME-I PIC A(25).
   FD OUTPUT.
      01 OUTPUT-STUDENT.
         05 STUDENT-ID-O PIC 9(5).
         05 STUDENT-NAME-O PIC A(25).
   SD WORK.
      01 WORK-STUDENT.
         05 STUDENT-ID-W PIC 9(5).
         05 STUDENT-NAME-W PIC A(25).

PROCEDURE DIVISION.
   SORT WORK ON ASCENDING KEY STUDENT-ID-O
   USING INPUT GIVING OUTPUT.
   DISPLAY 'Sort Successful'.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN DD DSN = INPUT-FILE-NAME,DISP = SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP = SHR
//WRK DD DSN = &&TEMP

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Sort Successful

動詞を結合

Mergeステートメントを使用して、2つ以上の同じ順序のファイルを結合します。 マージプロセスで使用されるファイル-

  • 入力ファイル-入力1、入力2
  • ワークファイル
  • 出力ファイル

構文

以下は、2つ以上のファイルをマージするための構文です-

MERGE work-file ON ASCENDING KEY rec-key1
   [ON DESCENDING KEY rec-key2]

USING input-1, input-2 GIVING output-file.

Mergeは次の操作を実行します-

  • ワークファイルをI-Oモードで、入力ファイルをINPUTモードで、出力ファイルをOUTPUTモードで開きます。
  • 入力ファイルにあるレコードをワークファイルに転送します。
  • SORT-FILEをrec-keyで昇順/降順でソートします。
  • ワークファイルから出力ファイルにソートされたレコードを転送します。
  • 入力ファイルと出力ファイルを閉じて、ワークファイルを削除します。

次の例では、INPUT1とINPUT2は、昇順でマージされる入力ファイルです-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      SELECT INPUT1 ASSIGN TO IN1.
      SELECT INPUT2 ASSIGN TO IN2.
      SELECT OUTPUT ASSIGN TO OUT.
      SELECT WORK ASSIGN TO WRK.

DATA DIVISION.
   FILE SECTION.
   FD INPUT1.
      01 INPUT1-STUDENT.
         05 STUDENT-ID-I1 PIC 9(5).
         05 STUDENT-NAME-I1 PIC A(25).
   FD INPUT2.
      01 INPUT2-STUDENT.
         05 STUDENT-ID-I2 PIC 9(5).
         05 STUDENT-NAME-I2 PIC A(25).
   FD OUTPUT.
      01 OUTPUT-STUDENT.
         05 STUDENT-ID-O PIC 9(5).
         05 STUDENT-NAME-O PIC A(25).
   SD WORK.
      01 WORK-STUDENT.
         05 STUDENT-ID-W PIC 9(5).
         05 STUDENT-NAME-W PIC A(25).

PROCEDURE DIVISION.
   MERGE WORK ON ASCENDING KEY STUDENT-ID-O
   USING INPUT1, INPUT2 GIVING OUTPUT.
   DISPLAY 'Merge Successful'.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN=INPUT1-FILE-NAME,DISP=SHR
//IN2 DD DSN=INPUT2-FILE-NAME,DISP=SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP=SHR
//WRK DD DSN = &&TEMP

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Merge Successful

COBOL-データベースインターフェイス

今のところ、COBOLでのファイルの使用を学びました。 次に、COBOLプログラムがDB2と対話する方法について説明します。 次の用語が含まれます-

  • 埋め込みSQL
  • DB2アプリケーションプログラミング
  • ホスト変数
  • SQLCA
  • SQLクエリ
  • カーソル

埋め込みSQL

埋め込みSQLステートメントは、COBOLプログラムで標準のSQL操作を実行するために使用されます。 埋め込みSQLステートメントは、アプリケーションプログラムがコンパイルされる前に、SQLプロセッサによって前処理されます。 COBOLは*ホスト言語*として知られています。 COBOL-DB2アプリケーションは、COBOLとDB2の両方を含むアプリケーションです。

埋め込みSQLステートメントは、若干の変更を加えた通常のSQLステートメントと同様に機能します。 たとえば、クエリの出力は、 Host Variables と呼ばれる定義済みの変数セットに送られます。 追加のINTO句がSELECTステートメントに配置されます。

DB2アプリケーションプログラミング

以下は、COBOL-DB2プログラムのコーディング中に従うべき規則です-

  • すべてのSQLステートメントは、 EXEC SQL と* ENDEXEC。*で区切る必要があります。
  • SQLステートメントは、エリアBでコーディングする必要があります。
  • プログラムで使用されるすべてのテーブルは、WorkingStorageセクションで宣言する必要があります。 これは、 INCLUDE ステートメントを使用して行われます。 *INCLUDEおよびDECLARE TABLE以外のすべてのSQLステートメントは、手続き部に表示する必要があります。

ホスト変数

ホスト変数は、テーブルからデータを受信したり、テーブルにデータを挿入したりするために使用されます。 ホスト変数は、プログラムとDB2の間で受け渡されるすべての値に対して宣言する必要があります。 これらは、Working-Storage Sectionで宣言されています。

ホスト変数をグループ項目にすることはできませんが、ホスト構造内でグループ化できます。* 名前変更*または*再定義*することはできません。 SQLステートメントでホスト変数を使用し、*コロン(:)。*をプレフィックスとして付けます。

構文

以下は、ホスト変数を宣言し、Working-Storageセクションにテーブルを含めるための構文です-

DATA DIVISION.
   WORKING-STORAGE SECTION.

   EXEC SQL
   INCLUDE table-name
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.

   01 STUDENT-REC.
      05 STUDENT-ID PIC 9(4).
      05 STUDENT-NAME PIC X(25).
      05 STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

SQLCA

SQLCAは、DB2がSQL実行のフィードバックをプログラムに渡すSQL通信領域です。 実行が成功したかどうかをプログラムに伝えます。 エラーコードを含む SQLCODE のようなSQLCAの下には多くの定義済み変数があります。 SQLCODEの値 '000’は、実行が成功したことを示します。

構文

以下は、Working-StorageセクションでSQLCAを宣言する構文です-

DATA DIVISION.
WORKING-STORAGE SECTION.
    EXEC SQL
    INCLUDE SQLCA
    END-EXEC.

SQLクエリ

Student-Id、Student-Name、Student-Addressを含む 'Student’という名前のテーブルが1つあるとします。

STUDENTテーブルには、次のデータが含まれています-

Student Id      Student Name        Student Address
1001               Mohtashim M.     Hyderabad
1002               Nishant Malik        Delhi
1003               Amitabh Bachan       Mumbai
1004               Chulbul Pandey       Lucknow

次の例は、COBOLプログラムでの SELECT クエリの使用方法を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   EXEC SQL
      INCLUDE SQLCA
   END-EXEC.

   EXEC SQL
      INCLUDE STUDENT
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   EXEC SQL
      SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS
      INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS FROM STUDENT
      WHERE STUDENT-ID=1004
   END-EXEC.

   IF SQLCODE = 0
      DISPLAY WS-STUDENT-RECORD
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

1004 Chulbul Pandey     Lucknow

次の例は、COBOLプログラムでの INSERT クエリの使用方法を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.
   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.

   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 1005 TO WS-STUDENT-ID.
   MOVE 'finddevguides' TO WS-STUDENT-NAME.
   MOVE 'Hyderabad' TO WS-STUDENT-ADDRESS.

   EXEC SQL
      INSERT INTO STUDENT(STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS)
      VALUES (:WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS)
   END-EXEC.

   IF SQLCODE = 0
      DISPLAY 'Record Inserted Successfully'
      DISPLAY WS-STUDENT-REC
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT   DD SYSOUT = *
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Record Inserted Successfully
1005 finddevguides      Hyderabad

次の例は、COBOLプログラムでの UPDATE クエリの使用方法を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.

   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.

   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 'Bangalore' TO WS-STUDENT-ADDRESS.
   EXEC SQL
      UPDATE STUDENT SET STUDENT-ADDRESS=:WS-STUDENT-ADDRESS
      WHERE STUDENT-ID = 1003
   END-EXEC.

   IF SQLCODE = 0
      DISPLAY 'Record Updated Successfully'
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT   DD SYSOUT = *
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Record Updated Successfully

次の*例*は、COBOLプログラムでの DELETE クエリの使用法を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
WORKING-STORAGE SECTION.

   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.

   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 1005 TO WS-STUDENT-ID.

   EXEC SQL
      DELETE FROM STUDENT
      WHERE STUDENT-ID=:WS-STUDENT-ID
   END-EXEC.

   IF SQLCODE = 0
      DISPLAY 'Record Deleted Successfully'
   ELSE DISPLAY 'Error'
   END-IF.
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM = IKJEFT01
//STEPLIB  DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT   DD SYSOUT = *
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

Record Deleted Successfully

カーソル

カーソルは、一度に複数の行選択を処理するために使用されます。 これらは、クエリのすべての結果を保持するデータ構造です。 これらは、Working-Storage SectionまたはProcedure Divisionで定義できます。 カーソルに関連付けられている操作は次のとおりです-

  • 宣言する
  • Open
  • 閉じる
  • フェッチ

カーソルを宣言

カーソル宣言は、Working-Storage SectionまたはProcedure Divisionで実行できます。 最初のステートメントは、実行不可能なステートメントであるDECLAREステートメントです。

EXEC SQL
   DECLARE STUDCUR CURSOR FOR
   SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
   WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.

Open

カーソルを使用する前に、Openステートメントを実行する必要があります。 Openステートメントは、実行のためにSELECTを準備します。

EXEC SQL
   OPEN STUDCUR
END-EXEC.

閉じる

Closeステートメントは、カーソルが占有しているすべてのメモリを解放します。 プログラムを終了する前にカーソルを閉じることは必須です。

EXEC SQL
   CLOSE STUDCUR
END-EXEC.

フェッチ

Fetchステートメントはカーソルを識別し、値をINTO句に入れます。 Fetchステートメントは、一度に1行を取得するときにループでコーディングされます。

EXEC SQL
   FETCH STUDCUR
   INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC.

次の例は、STUDENTテーブルからすべてのレコードをフェッチするカーソルの使用法を示しています-

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
   WORKING-STORAGE SECTION.

   EXEC SQL
   INCLUDE SQLCA
   END-EXEC.

   EXEC SQL
   INCLUDE STUDENT
   END-EXEC.

   EXEC SQL BEGIN DECLARE SECTION
   END-EXEC.
      01 WS-STUDENT-REC.
         05 WS-STUDENT-ID PIC 9(4).
         05 WS-STUDENT-NAME PIC X(25).
         05 WS-STUDENT-ADDRESS X(50).
   EXEC SQL END DECLARE SECTION
   END-EXEC.

   EXEC SQL
      DECLARE STUDCUR CURSOR FOR
      SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
      WHERE STUDENT-ID >:WS-STUDENT-ID
   END-EXEC.

PROCEDURE DIVISION.
   MOVE 1001 TO WS-STUDENT-ID.
   PERFORM UNTIL SQLCODE = 100

   EXEC SQL
      FETCH STUDCUR
      INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
   END-EXEC

   DISPLAY WS-STUDENT-REC
END-PERFORM
STOP RUN.
*JCL* 上記のCOBOLプログラムを実行します-
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001  EXEC PGM=IKJEFT01
//STEPLIB  DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSIN  DD *
   DSN SYSTEM(SSID)
   RUN PROGRAM(HELLO) PLAN(PLANNAME) -
   END
/*

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

1001 Mohtashim M.       Hyderabad
1002 Nishant Malik      Delhi
1003 Amitabh Bachan     Mumbai
1004 Chulbul Pandey     Lucknow

Cobol-questions-answers