COBOLのDBアクセスパターンを学ぼう!「FETCH」 | 応用ガイド

COBOL(コボル)言語のDBアクセスの基本であるFETCHとは?

応用-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はご自身の環境に合わせて指定ください。

応用-FETCH-使用例1

応用-FETCH-使用例

使用例1は、DB(testdb)に、ユーザID、パスワードを指定して接続し、テーブル名(test)から項目(tid、tname)を取得し、その取得したデータを画面に表示するというプログラムです。

FETCH処理は複数件データが取得される事を想定していますので、データが取得できなくなるまでFETCH処理を行うよう繰り返し処理を記述しています。また、データが取得できなくなるまでという判断はSQLCODEで行っています。SQLCODEはSQLの実行結果の戻りコードで、SQLCODE=100の場合、データなしと判断する事ができます。

テーブル(test):

応用-FETCH-テーブル

実行結果:

応用-FETCH-実行結果

COBOL(コボル)言語のDBアクセス「FETCH」の応用的な使い方

DBアクセス及びFETCHの基本的な処理構成と書き方について理解いただけたでしょうか。今度は、応用的な使い方について考えていきましょう。

先ほどご紹介したサンプルプログラムは、DB(テーブル)からデータを取得し、その結果を画面に表示するというプログラムでしたが、取得したデータをファイルに出力するという処理について考えてみましょう。

具体的なサンプルプログラム(使用例2)を用意しましたので、しっかり内容を理解して実際のプログラム作成に活用いただければと思います。

使用例2:

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. db_fetch_sample02.
  3. ENVIRONMENT DIVISION.
  4. INPUT-OUTPUT SECTION.
  5. FILE-CONTROL.
  6. SELECT OUT01-FILE
  7. ASSIGN TO "out01.txt"
  8. ORGANIZATION IS LINE SEQUENTIAL.
  9. DATA DIVISION.
  10. FILE SECTION.
  11. FD OUT01-FILE.
  12. 01 OUT01.
  13. 03 OUT01-TID PIC X(04).
  14. 03 OUT01-TNAME PIC X(10).
  15. *****************************************************
  16. WORKING-STORAGE SECTION.
  17. * 1.ホスト変数の定義
  18. EXEC SQL BEGIN DECLARE SECTION END-EXEC.
  19. 01 DBNAME PIC X(32) VALUE "testdb".
  20. 01 USERNAME PIC X(32) VALUE "********".
  21. 01 PASSWORD PIC X(32) VALUE "********".
  22. 01 TID PIC X(4).
  23. 01 TNAME PIC X(10).
  24. 01 SW-AREA.
  25. 03 SW-NOTFOUND PIC X(01) VALUE SPACE.
  26. 01 CST-AREA.
  27. 03 CST-1X PIC X(01) VALUE "1".
  28. 03 CST-SQL-NF PIC S9(09) COMP-5 VALUE +100.
  29. EXEC SQL END DECLARE SECTION END-EXEC.
  30. *****************************************************
  31. * 2.共通領域の定義
  32. EXEC SQL INCLUDE SQLCA END-EXEC.
  33. *****************************************************
  34. PROCEDURE DIVISION.
  35. MAIN-RTN SECTION.
  36. OPEN OUTPUT OUT01-FILE.
  37. * 3.データベース接続
  38. EXEC SQL
  39. CONNECT :USERNAME IDENTIFIED BY :PASSWORD
  40. USING :DBNAME
  41. END-EXEC.
  42. * 4.データベースアクセス
  43. *** DB カーソルオープン処理
  44. PERFORM OPEN-RTN.
  45. *** DB FETCH処理
  46. PERFORM FETCH-RTN UNTIL SW-NOTFOUND = CST-1X.
  47. *** DB カーソルクローズ処理
  48. PERFORM CLOSE-RTN.
  49. CLOSE OUT01-FILE.
  50. STOP RUN.
  51. MAIN-EXIT.
  52. *****************************************************
  53. *** DB カーソルオープン処理
  54. OPEN-RTN SECTION.
  55. EXEC SQL
  56. DECLARE CSR01 CURSOR FOR
  57. SELECT tid,tname
  58. FROM test
  59. END-EXEC.
  60. EXEC SQL
  61. OPEN CSR01
  62. END-EXEC.
  63. OPEN-EXIT.
  64. *****************************************************
  65. *** DB FETCH処理
  66. FETCH-RTN SECTION.
  67. EXEC SQL
  68. FETCH CSR01
  69. INTO :TID,:TNAME
  70. END-EXEC.
  71. *
  72. IF SQLCODE = CST-SQL-NF
  73. THEN
  74. MOVE CST-1X TO SW-NOTFOUND
  75. ELSE
  76. MOVE TID TO OUT01-TID
  77. MOVE TNAME TO OUT01-TNAME
  78. WRITE OUT01
  79. END-IF.
  80. FETCH-EXIT.
  81. *****************************************************
  82. *** DB カーソルクローズ処理
  83. CLOSE-RTN SECTION.
  84. EXEC SQL
  85. CLOSE CSR01
  86. END-EXEC.
  87. CLOSE-EXIT.
  88. *****************************************************
  89. END PROGRAM db_fetch_sample02.

使用例2は、使用例1とほとんど同じような処理の流れになっていますが、DBから取得したデータをOUT01ファイルに出力するという記述をしています。

テーブル(test):

応用-FETCH-テーブル

出力ファイル(out01.txt):

応用-FETCH-出力ファイル

練習問題

最後に練習問題にチャレンジしてみましょう。

問)

先ほどまでのサンプルプログラムは検索条件(WHERE)を指定していませんでした。では、使用例1に検索条件を指定する場合、どのようにプログラムを修正する必要があるでしょうか。

答え)

カーソルの宣言処理に検索条件を追記(46行目と47行目の間)します。例えば、「WHERE tid='0002'」という検索条件を追記して結果を確認してみましょう。

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

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

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

COBOL入門のカテゴリー

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