COBOL言語の「SELECT句」を理解してファイル操作をしよう | 用語辞典

COBOL(コボル)言語の予約語SELECT句を使った命令文の書き方とは

辞典・辞書-SELECT-イメージ

COBOL(コボル)言語のSELECT句とは?

COBOL(コボル)におけるSELECT句は、使用するファイル名を指定したり、ファイルの属性やファイルのステータスを定義するときに使用します。

プログラム内で読み書きを行うファイルの関連付けを定義するSELECT句は、ファイル管理段落(FILE-CONTROL)内で記述します。

書き方:

SELECT ファイル名項目 ASSIGN TO データ名 [ORGANIZATION IS ファイル編成].

ファイル名項目はプログラムで使用するファイル名と関連付けられたファイル項目を指定します。

データ名には実際に使用するファイル名を指定します。データ名は「/Users/COBOL/test.txt」のようにパスから指定することも可能です。

ファイル編成には使用するファイルの編成などを指定します。なお、「ORGANIZATION IS」を省略した場合は、デフォルトで順編成が指定されます。

「ORGANIZATION IS」で指定できるファイルは主に「順編成ファイル」「行順編成ファイル」「相対ファイル」「牽引ファイル」などがあります。

ファイルの編成

指定する内容

備考

順編成ファイル

SEQUENTIAL

指定したレコード長で管理するファイル

行順編成ファイル

LINE SEQUENTIAL

レコードを改行区切りで管理するファイル

相対ファイル

RELATIVE

レコードをファイル内の順位によって識別するファイル

牽引ファイル

INDEXED

各レコードを主キーによって管理するファイル

例えば行順編成のファイルを指定する場合は、以下のように記述します。

SELECT ファイル名項目 ASSIGN TO データ名 ORGANIZATION IS LINE SEQUENTIAL.

使用例:

実際にSELECT句を使用してファイル項目を指定し、ファイルを読み込む簡単なプログラムを紹介します。

読み込むファイルは事前に用意しておきます。ここでは、行順編成のフラット形式で以下のようにレコードを記述します。

test.txt-------------------

AAAAA

BBBBB

CCCCC

DDDDD

----------------------------

辞典・辞書-SELECT-使用例

実行結果:

辞典・辞書-SELECT-実行結果

サンプルでは、行順編成のファイルを読み込むために、「ORGANIZATION IS LINE SEQUENTIAL」を指定しています。

また、SELECT句以下にはFILE STATUS句(ファイル状態コード)を指定しています。これはファイル操作の度にファイルの状態コードが返されます。

そのため、行順編成のような改行区切りでレコードを読み込むファイルでは、ファイルのレコードが正常に読み込む度に状態コードが"00"を返しますので、PERFORM文などのループ処理の条件式として使用することができます。

SELECT句のCOBOL(コボル)言語における基本事項やルールについて

 
  1. SELECT、ファイル名項目、ASSIGNなどの間の空白や改行は自由に指定できます。
  2. 複数のファイルを扱う場合には、個々のファイルにてそれぞれSELECT句を定義します。
  3. 「ORGANIZATION IS ファイル編成」を省略した場合は順編成のファイルとみなされます。
  4. ファイル管理段落(FILE-CONTROL)を省略した場合はSELECT句も省略します。

COBOL(コボル)言語のSELECT句を扱う上での注意点

 
  1. ファイルを読み書きする場合には、必ずSELECT句を指定しなければいけません。
  2. SELECT句はMOVE文のように、複数のデータをまとめて1つのSELECT句で定義することはできません。

例えば以下のように記述するとコンパイルエラーとなります。

SELECT ファイル名項目 ASSIGN TO データ名1 データ名2 [ORGANIZATION IS ファイル編成].

<コンパイルエラー>

辞典・辞書-SELECT-注意点

SELECT句を使ったCOBOL(コボル)プログラムの活用法

SELECT句の活用法として、書き込むファイルと読み込むファイルを個々にSELECT句で指定して、それぞれ書き込み、読み込みを行う簡単なサンプルを以下に紹介します。

読み込みで使用するファイルは、使用例で紹介したものと同じ内容となります。

   
  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. SELECT_SAMPLE02.
  3. ENVIRONMENT DIVISION.
  4. INPUT-OUTPUT SECTION.
  5.  
  6.  
  7. *>ファイル管理段落
  8. FILE-CONTROL.
  9. *>書き込むファイルを指定する
  10. SELECT WRITE-FILE ASSIGN TO 'write.txt'.
  11.  
  12. *>読み込むファイルを指定する
  13. SELECT READ-FILE ASSIGN TO 'read.txt'
  14. ORGANIZATION IS LINE SEQUENTIAL
  15. FILE STATUS IS IN-FILE-STATUS.
  16.  
  17. DATA DIVISION.
  18. FILE SECTION.
  19. FD WRITE-FILE.
  20. 01 OUT-FILE-REC PIC 99. *>書き込みレコード
  21. FD READ-FILE.
  22. 01 IN-FILE-REC PIC X(5). *>読み込みレコード
  23.  
  24.  
  25. WORKING-STORAGE SECTION.
  26. 01 IN-FILE-STATUS PIC XX.
  27. 01 TEST_NUM PIC 9(2).
  28.  
  29. PROCEDURE DIVISION.
  30.  
  31. *>------------------------------
  32. *> ファイルの書き込み
  33. *>------------------------------
  34.  
  35. OPEN OUTPUT WRITE-FILE.
  36.  
  37. *>書き込み用データの作成
  38. MOVE 10 TO TEST_NUM.
  39. MOVE TEST_NUM TO OUT-FILE-REC.
  40.  
  41. *>ファイルに書きこむ
  42. WRITE OUT-FILE-REC.
  43.  
  44. DISPLAY "WRITE: "OUT-FILE-REC
  45.  
  46. CLOSE WRITE-FILE
  47.  
  48. *>------------------------------
  49. *> ファイルの読み込み
  50. *>------------------------------
  51.  
  52. OPEN INPUT READ-FILE.
  53.  
  54. *>1レコードずつ読み込む
  55. PERFORM UNTIL IN-FILE-STATUS NOT = "00"
  56.  
  57. READ READ-FILE
  58.  
  59. AT END
  60. DISPLAY "READ END";
  61. NOT AT END
  62. DISPLAY IN-FILE-REC
  63. END-READ
  64.  
  65. END-PERFORM.
  66.  
  67.  
  68. CLOSE READ-FILE.
  69.  
  70. STOP RUN.

実行結果:

辞典・辞書-SELECT-実行結果

サンプルでは、SELECT句で書き込み用ファイル、読み込み用ファイルをそれぞれ定義しています。

書き込み用ファイルは「ORGANIZATION IS」を省略しているため、順編成ファイルとなります。

読み込み用ファイルは「ORGANIZATION IS LINE SEQUENTIAL」を指定しているため、行順編成ファイルとなります。

このサンプルを実行すると、write.txtが作成されてファイルに書き込みを行い、read.txtを読み込んでレコードを1行ずつ取得できていることがわかります。

なお、書き込みファイルと読み込みファイルが同一ファイルの場合は、SELECT句を個々に指定する必要はありません。

この記事を読んだ人は、こちらの記事も読んでいます

【未経験者歓迎】COBOLプログラマー・システムエンジニアの募集

株式会社COBOLの求人・転職・募集情報を見る

COBOL入門のカテゴリー

取引企業様 募集中
COBOL技術者 募集
COBOL魂
読者採用
COBOL入門