COBOLのFETCH文の使い方完全ガイド!初心者でもわかるデータベースからのデータ取得手順
生徒
「先生、COBOLでデータベースから複数のデータを取り出すときはどうしたらいいですか?」
先生
「それには、FETCH文を使います。FETCH文は、データベースの結果セットから一行ずつデータを取り出す命令です。」
生徒
「一行ずつ取り出すって、どういうことですか?」
先生
「イメージとしては、データベースが郵便局で、FETCH文が一通ずつ手紙を取り出す作業のようなものです。一度に全部持ってくるのではなく、一通ずつ安全に確認しながら取り出します。」
1. FETCH文とは?
COBOLのFETCH文は、SQLで開いたカーソルから次の行を取得するための文です。カーソルとは、SQL文で取得した結果セットを順番にたどるための“目印”のようなものです。結果セットとは、データベースから条件に合う行の集合です。
FETCH文を使うことで、複数行のデータを一行ずつ処理できるため、大量のデータでも効率的に処理できます。
2. FETCH文の基本手順
データベースからデータを取得する基本的な手順は以下の通りです。
- EXEC SQLでSELECT文を準備してカーソルを宣言する。
- EXEC SQLでカーソルをOPENする。
- EXEC SQLでFETCH文を使って結果セットから1行ずつデータを取得する。
- 必要に応じてループ処理で全件を処理する。
- 処理終了後、EXEC SQLでカーソルをCLOSEする。
この手順を守ることで、COBOLでのデータベース操作が安全かつ効率的に行えます。
3. FETCH文の使い方例
EXEC SQL
DECLARE EMP_CURSOR CURSOR FOR
SELECT EMPLOYEE_ID, EMPLOYEE_NAME
FROM EMPLOYEE
WHERE DEPARTMENT = :DEPT
END-EXEC.
EXEC SQL
OPEN EMP_CURSOR
END-EXEC.
PERFORM UNTIL SQLCODE NOT = 0
EXEC SQL
FETCH EMP_CURSOR INTO :EMP-ID, :EMP-NAME
END-EXEC.
IF SQLCODE = 0
DISPLAY "社員ID:" EMP-ID " 社員名:" EMP-NAME
END-IF
END-PERFORM.
EXEC SQL
CLOSE EMP_CURSOR
END-EXEC.
この例では、EMPLOYEEテーブルから指定部署の社員情報を一件ずつ取得しています。PERFORM UNTIL SQLCODE NOT = 0のループで、FETCH文を順番に実行し、SQLCODEで結果を確認しています。
4. FETCH文使用時のポイント
- カーソルは必ずOPENしてからFETCHする。
- FETCHでデータを取得したら、SQLCODEを確認して成功かどうか判断する。
- 全件取得後は必ずカーソルをCLOSEしてリソースを解放する。
- FETCH文は結果セットの次の行を取得するため、ループ処理と組み合わせると全件取得が可能。
- FETCH文とSQLCAを組み合わせると、エラー発生時の対処も簡単に行える。
5. 初心者が覚えておくこと
COBOLでのFETCH文は、データベースから安全にデータを取り出すための基本です。まずは1行ずつ取り出すこと、SQLCODEで結果を確認すること、カーソルのOPENとCLOSEを必ず行うことを意識すると理解しやすいです。FETCH文の使い方を覚えることで、データベース処理の基礎をしっかり身につけることができます。
6. FETCH文の実践例
WORKING-STORAGE SECTION.
01 DEPT PIC X(10) VALUE "営業部".
01 EMP-ID PIC 9(4).
01 EMP-NAME PIC X(30).
PROCEDURE DIVISION.
EXEC SQL
DECLARE EMP_CURSOR CURSOR FOR
SELECT EMPLOYEE_ID, EMPLOYEE_NAME
FROM EMPLOYEE
WHERE DEPARTMENT = :DEPT
END-EXEC.
EXEC SQL
OPEN EMP_CURSOR
END-EXEC.
PERFORM UNTIL SQLCODE NOT = 0
EXEC SQL
FETCH EMP_CURSOR INTO :EMP-ID, :EMP-NAME
END-EXEC.
IF SQLCODE = 0
DISPLAY "社員ID:" EMP-ID " 社員名:" EMP-NAME
END-IF
END-PERFORM.
EXEC SQL
CLOSE EMP_CURSOR
END-EXEC.
社員ID:1001 社員名:山田太郎
社員ID:1002 社員名:佐藤花子
社員ID:1003 社員名:鈴木一郎
この例では、営業部の全社員情報をFETCH文で順番に取得し、画面に表示しています。FETCH文を理解すると、COBOLでのデータベース操作がスムーズに行えます。
まとめ
COBOLにおけるFETCH文は、データベースから一行ずつていねいに情報を取り出すための大切な仕組みであり、実務の現場でも頻繁に利用される重要な手順です。今回の記事では、FETCH文がどのような役割を持っているのか、カーソルを使った基本的なデータ取得の流れ、そして実際のプログラム例まで順を追って学びました。特に、カーソルのOPENとCLOSE、そしてSQLCODEを確認する仕組みはCOBOLのデータベース処理において欠かせない要素であり、初心者ほど早めに習得しておくと後の理解がぐっと深まります。データベースの結果セットを一行ずつ安全に読みだすFETCH文は、大量データを扱うときでも整然とした処理を実現できるため、多くの企業システムで重宝されています。 また、実際のコード例を何度も確認しながら理解を深めることで、プログラム上の動きがより立体的にイメージできるようになります。FETCHによって取得される情報が順番に処理されていく様子は、データを逐次管理しながら業務ロジックを組み立てる上で欠かせない基礎です。こうした仕組みをしっかりと理解しておくと、単純な検索処理だけでなく、ループを用いた柔軟なデータ処理や、条件を踏まえた動的なロジックにも対応できるようになります。 FETCH文はあくまで「一行ずつ取得する」という明確な役割を持ち、その動く仕組みを知ることで、COBOLのデータベース操作全体の流れを把握する糸口にもなります。カーソルの宣言、OPEN、FETCH、CLOSEという一連の流れを手順として自然に覚えてしまうと、より複雑なSQLを扱うときにも慌てず確実に処理できるようになります。下記には記事と同じ構造で簡単なサンプルコードをまとめておきますので、実際の現場で応用しやすいベースとして役立ててください。
サンプルプログラム(まとめ)
EXEC SQL
DECLARE EMP_CURSOR CURSOR FOR
SELECT EMPLOYEE_ID, EMPLOYEE_NAME
FROM EMPLOYEE
WHERE DEPARTMENT = :DEPT
END-EXEC.
EXEC SQL
OPEN EMP_CURSOR
END-EXEC.
PERFORM UNTIL SQLCODE NOT = 0
EXEC SQL
FETCH EMP_CURSOR INTO :EMP-ID, :EMP-NAME
END-EXEC.
IF SQLCODE = 0
DISPLAY "社員ID:" EMP-ID " 社員名:" EMP-NAME
END-IF
END-PERFORM.
EXEC SQL
CLOSE EMP_CURSOR
END-EXEC.
このサンプルは、FETCH文の流れを整理し直したもので、データベースから必要な情報を順番に取り出す処理がどのように組み立てられるのかを理解しやすい構成になっています。COBOLのプログラムは一見すると厳格な形式に見えますが、ルールさえ掴んでしまえば読みやすく、そして修正もしやすい言語です。FETCH文を使った処理は、その中でも実務で最も利用頻度の高い部分ですので、自分の手で書きながら自然に覚えていくことが大切です。 これまで学んだ内容を踏まえて、自分なりに別のテーブルを使ったFETCH文を試してみたり、条件を変えて取得件数がどう変わるかを観察することで、いっとう深い理解に繋がっていきます。FETCH文とカーソル操作はCOBOLのデータ処理における基礎のひとつであり、これを理解しておくと後々のバッチ処理や業務アプリケーション作成の際にも必ず役立ちます。ぜひ繰り返し読み返し、実行しながら身につけてください。
生徒「FETCH文って、一行ずつ順番に取り出す動きが実際にプログラムで見ると理解しやすかったです!」
先生「そうだね。カーソルを使った処理の流れをつかめば、COBOLのデータベース処理はぐっと身近に感じられるはずだよ。」
生徒「カーソルのOPEN、FETCH、CLOSEの順番もようやく覚えられました。SQLCODEを確認する意味もよくわかりました。」
先生「一度身につければ応用しやすいから、これからも別の条件でFETCHを使って試してみるといい。実務で困らない力がしっかりつくよ。」
生徒「はい!また別のテーブルや条件でも試してみます。」