COBOLのDBアクセスパターンを学ぼう!「FETCH」 | 応用ガイド
COBOL(コボル)言語のDBアクセスの基本であるFETCHとは?
COBOL(コボル)言語のDBアクセス「FETCH」とは?
一般的なDBはリレーショナル型データベース(RDB)を指します。RDBは、問い合わせ言語(SQL)を利用してデータにアクセスを行います。これはこれからDBアクセスを学ぶ上での共通事項です。
今回ご紹介するFETCHはSQLの記述の1つで、指定した検索条件を元にDB(テーブル)にアクセスし、指定した項目(列)を取得するという機能を持っています。似た機能を持つSQLにSELECT INTO文がありますが、検索の結果、複数件データが取得できた場合、データ1件ごとに処理を行える点が違います。では、その書き方について見ていきましょう。
書き方:
FETCHはカーソルというものを使って処理する事が特徴です。カーソルを使うには①カーソルの宣言、②カーソルのオープン処理、③FETCH処理、④カーソルのクローズ処理を記述する必要があります。
①カーソルの宣言
DECLARE カーソル名 CURSOR FOR
SELECT 列名1,列名2・・(テーブルから取得する項目(列)を指定)
FROM テーブル名
WHERE 検索条件
②カーソルのオープン処理
OPEN カーソル名
③FETCH処理
FETCH カーソル名
INTO 変数名1,変数名2・・(取得した項目をCOBOLで利用するためのホスト変数を指定)
④カーソルのクローズ処理
CLOSE カーソル名
COBOL(コボル)言語のDBアクセス「FETCH」の処理構成
DBアクセスの基本的な処理構成について見ていきましょう。この処理構成を理解する事が今回の処理の理解につながります。
[基本的な処理構成]
1.ホスト変数の定義、2.共通領域の定義、3.データベース接続、4.データベースアクセス
各処理で実施する処理内容は以下の通りです。
1.ホスト変数の定義
COBOL、DB間のデータ連携用の変数を定義します。この変数を利用してDBから取得したデータをCOBOLで加工、編集する事ができるようになります。
2.共通領域の定義
DBのエラー情報が格納されます。エラーハンドリングする際に利用しますが、最初の内はあまり気にする必要はないでしょう。
3.データベース接続
ユーザID、パスワードを指定し、DBと接続します。
4.データベースアクセス
DBの操作(検索、追加、更新、削除など)を行います。今回ご紹介するSELECT INTOもここに記述する事になります。
FETCHは、先にご紹介した通り、カーソルの宣言、カーソルのオープン処理、FETCH処理、カーソルのクローズ処理で構成されます。
基本的な処理構成を見ていただければおわかりになるかと思いますが、1.ホスト変数の定義~3.データベース接続はDBアクセスの共通の処理になり、4.データベースアクセスを業務要件に合わせて記述する事で、様々な処理要件に対応する事ができます。では基本的な処理構成について記述したサンプルプログラム(使用例1)を用意しましたので、その書き方について見ていきましょう。
使用例1:
※今回のDBMSは、オープンソースの「PostgreSQL」を使用しています。
※USERNAME、PASSWORDはご自身の環境に合わせて指定ください。
使用例1は、DB(testdb)に、ユーザID、パスワードを指定して接続し、テーブル名(test)から項目(tid、tname)を取得し、その取得したデータを画面に表示するというプログラムです。
FETCH処理は複数件データが取得される事を想定していますので、データが取得できなくなるまでFETCH処理を行うよう繰り返し処理を記述しています。また、データが取得できなくなるまでという判断はSQLCODEで行っています。SQLCODEはSQLの実行結果の戻りコードで、SQLCODE=100の場合、データなしと判断する事ができます。
テーブル(test):
実行結果:
COBOL(コボル)言語のDBアクセス「FETCH」の応用的な使い方
DBアクセス及びFETCHの基本的な処理構成と書き方について理解いただけたでしょうか。今度は、応用的な使い方について考えていきましょう。
先ほどご紹介したサンプルプログラムは、DB(テーブル)からデータを取得し、その結果を画面に表示するというプログラムでしたが、取得したデータをファイルに出力するという処理について考えてみましょう。
具体的なサンプルプログラム(使用例2)を用意しましたので、しっかり内容を理解して実際のプログラム作成に活用いただければと思います。
使用例2:
- IDENTIFICATION DIVISION.
- PROGRAM-ID. db_fetch_sample02.
- ENVIRONMENT DIVISION.
- INPUT-OUTPUT SECTION.
- FILE-CONTROL.
- SELECT OUT01-FILE
- ASSIGN TO "out01.txt"
- ORGANIZATION IS LINE SEQUENTIAL.
- DATA DIVISION.
- FILE SECTION.
- FD OUT01-FILE.
- 01 OUT01.
- 03 OUT01-TID PIC X(04).
- 03 OUT01-TNAME PIC X(10).
- *****************************************************
- WORKING-STORAGE SECTION.
- * 1.ホスト変数の定義
- EXEC SQL BEGIN DECLARE SECTION END-EXEC.
- 01 DBNAME PIC X(32) VALUE "testdb".
- 01 USERNAME PIC X(32) VALUE "********".
- 01 PASSWORD PIC X(32) VALUE "********".
- 01 TID PIC X(4).
- 01 TNAME PIC X(10).
- 01 SW-AREA.
- 03 SW-NOTFOUND PIC X(01) VALUE SPACE.
- 01 CST-AREA.
- 03 CST-1X PIC X(01) VALUE "1".
- 03 CST-SQL-NF PIC S9(09) COMP-5 VALUE +100.
- EXEC SQL END DECLARE SECTION END-EXEC.
- *****************************************************
- * 2.共通領域の定義
- EXEC SQL INCLUDE SQLCA END-EXEC.
- *****************************************************
- PROCEDURE DIVISION.
- MAIN-RTN SECTION.
- OPEN OUTPUT OUT01-FILE.
- * 3.データベース接続
- EXEC SQL
- CONNECT :USERNAME IDENTIFIED BY :PASSWORD
- USING :DBNAME
- END-EXEC.
- * 4.データベースアクセス
- *** DB カーソルオープン処理
- PERFORM OPEN-RTN.
- *** DB FETCH処理
- PERFORM FETCH-RTN UNTIL SW-NOTFOUND = CST-1X.
- *** DB カーソルクローズ処理
- PERFORM CLOSE-RTN.
- CLOSE OUT01-FILE.
- STOP RUN.
- MAIN-EXIT.
- *****************************************************
- *** DB カーソルオープン処理
- OPEN-RTN SECTION.
- EXEC SQL
- DECLARE CSR01 CURSOR FOR
- SELECT tid,tname
- FROM test
- END-EXEC.
- EXEC SQL
- OPEN CSR01
- END-EXEC.
- OPEN-EXIT.
- *****************************************************
- *** DB FETCH処理
- FETCH-RTN SECTION.
- EXEC SQL
- FETCH CSR01
- INTO :TID,:TNAME
- END-EXEC.
- *
- IF SQLCODE = CST-SQL-NF
- THEN
- MOVE CST-1X TO SW-NOTFOUND
- ELSE
- MOVE TID TO OUT01-TID
- MOVE TNAME TO OUT01-TNAME
- WRITE OUT01
- END-IF.
- FETCH-EXIT.
- *****************************************************
- *** DB カーソルクローズ処理
- CLOSE-RTN SECTION.
- EXEC SQL
- CLOSE CSR01
- END-EXEC.
- CLOSE-EXIT.
- *****************************************************
- END PROGRAM db_fetch_sample02.
使用例2は、使用例1とほとんど同じような処理の流れになっていますが、DBから取得したデータをOUT01ファイルに出力するという記述をしています。
テーブル(test):
出力ファイル(out01.txt):
練習問題
最後に練習問題にチャレンジしてみましょう。
問)
先ほどまでのサンプルプログラムは検索条件(WHERE)を指定していませんでした。では、使用例1に検索条件を指定する場合、どのようにプログラムを修正する必要があるでしょうか。
答え)
カーソルの宣言処理に検索条件を追記(46行目と47行目の間)します。例えば、「WHERE tid='0002'」という検索条件を追記して結果を確認してみましょう。
この記事を読んだ人は、こちらの記事も読んでいます
あなたのCOBOL技術を活かしませんか?
COBOL入門のカテゴリー
1. 優良社員が多数在籍しています
2. 即日派遣、又は請負います
3. 安心価格で請負います
4. 同時、協力会社募集中です
1. 正社員
2. 契約社員
3. 個人事業主
などの 求人情報 が閲覧できます。
目指せ!COBOLダントツ一番企業。
創業当初の話や理念が閲覧できます。
応募条件
※2020年5月31日を以って、締切りました。
18歳~28歳の方。
正社員採用において、北川社長の著書『祈り方が9割』を読んで感想文を事前に提出すると、無条件で最終面接まで進むことができます。
COBOLとは、どのようなプログラミング言語なのか、初心者にもわかりやすく、文法の例をあげて解説してます。
COBOL入門の人気記事
- COBOL言語とは?プログラムの書き方やルールを解説!|基礎ガイド
- 【COBOL言語】条件分岐処理の代名詞「IF文」について知ろう|用語辞典
- COBOL言語の「MOVE文」とは?転記のルールをご紹介します|用語辞典
- COBOL言語の「STRING文」とは?文字連結の基礎知識と注意点|用語辞典
- 多枝分岐ってなに?COBOL言語の「EVALUATE文」を知ろう!|用語辞典
- COBOL言語の「PICTURE句」とは?基本事項を解説します!|用語辞典
- COBOL言語で計算処理をするなら「COMPUTE文」|用語辞典
- COBOL言語の「REDEFINES句」とは?使い方を確認しよう!|用語辞典
- 覚えておけば楽ができる?COBOL言語の「COPY文」の使い方|用語辞典
- COBOL言語の文字列操作のパターンを理解しよう!|基礎ガイド
- COBOL言語の初期化処理に重宝する「INITIALIZE文」とは?|用語辞典
- COBOL言語の「LOW-VALUE」の使い方について理解しよう!|基礎ガイド
- COBOL言語の「OCCURS句」について知ろう!学ぶべき基本とは|用語辞典
- COBOL言語初心者も安心! 難解「CALL文」をスッキリ解決|用語辞典
- COBOL言語の「PERFORM文」とは。実行制御について解説!|用語辞典
- COBOL言語の繰り返し処理のパターンを理解しよう!|基礎ガイド
- COBOL言語の「定数」の種類と使い方について理解しよう!|用語辞典
- COBOLのDBアクセスパターンを学ぼう!「FETCH」|応用ガイド
- COBOL言語の「DISPLAY文」は、ディスプレイ出力の為にある|用語辞典
- COBOL言語の「VARYING句」は便利?使用方法を学びましょう|用語辞典