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

COBOL(コボル)言語のDB更新処理に利用するINSERT文とは?

応用-DELETE-イメージ

COBOL(コボル)言語のDBアクセス「INSERT」とは?

一般的なDBはリレーショナル型データベース(RDB)を指します。RDBは、問い合わせ言語(SQL)を利用してデータにアクセスを行います。これらはDBアクセスを学ぶ上での共通事項です。

今回ご紹介するINSERTはSQLの記述の1つで、DBのテーブルにレコードを追加するという機能を持っています。テーブルの列ごとにどういう値を設定するかを指定して追加するレコードの内容を確定していきます。では、その書き方について見ていきましょう。

書き方:

INSERT INTO テーブル名

(列名1、列名2、・・)

VALUES (値1、値2、・・)

COBOL(コボル)言語のDBアクセス「INSERT」の処理構成

DBアクセスの基本的な処理構成について見ていきましょう。この処理構成を理解する事が今回の処理の理解につながります。

[基本的な処理構成]

1.ホスト変数の定義、2.共通領域の定義、3.データベース接続、4.データベースアクセス

各処理で実施する処理内容は以下の通りです。

1.ホスト変数の定義

COBOL、DB間のデータ連携用の変数を定義します。この変数を利用してDBから取得したデータをCOBOLで加工、編集する事ができるようになります。

2.共通領域の定義

DBのエラー情報が格納されます。エラーハンドリングする際に利用しますが、最初の内はあまり気にする必要はないでしょう。

3.データベース接続

ユーザID、パスワードを指定し、DBと接続します。

4.データベースアクセス

DBの操作(検索、追加、更新、削除など)を行います。今回ご紹介するINSERTもここに記述する事になります。

基本的な処理構成を見ていただければおわかりになるかと思いますが、1.ホスト変数の定義~3.データベース接続はDBアクセスの共通の処理になり、4.データベースアクセスを業務要件に合わせて記述する事で、様々な処理要件に対応する事ができます。では基本的な処理構成について記述したサンプルプログラム(使用例1)を用意しましたので、その書き方について見ていきましょう。

使用例1:

※今回のDBMSは、オープンソースの「PostgreSQL」を使用しています。

※USERNAME、PASSWORDはご自身の環境に合わせて指定ください。

応用-INSERT-使用例1

使用例1は、DB(testdb)に、ユーザID、パスワードを指定して接続し、列名「tid 、tname」にそれぞれ値「'0002'、='orange'」を指定してテーブル(test)にレコードを追加するというプログラムです。

INSERT処理後に記述しているCOMMITは、DBの更新を確定するという意味があります。特に気にせずそのまま記述しておけばいいでしょう。

テーブル(test):処理実行前

応用-INSERT-テーブル

実行結果:

応用-INSERT-実行結果

テーブル(test):処理実行後

応用-INSERT-テーブル

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

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

先ほどご紹介したサンプルプログラムは、テーブルの列名に指定した値を設定しレコードを追加するというプログラムでしたが、入力ファイルの値を使ってDBの行を追加するという処理について考えてみましょう。

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

使用例2:

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. db_insert_sample02.
  3. ENVIRONMENT DIVISION.
  4. INPUT-OUTPUT SECTION.
  5. FILE-CONTROL.
  6. SELECT IN01-FILE
  7. ASSIGN TO "in01.txt"
  8. ORGANIZATION IS LINE SEQUENTIAL.
  9. DATA DIVISION.
  10. FILE SECTION.
  11. FD IN01-FILE.
  12. 01 IN01.
  13. 03 IN01-TID PIC X(04).
  14. 03 IN01-TNAME PIC X(10).
  15. WORKING-STORAGE SECTION.
  16. * 1.ホスト変数の定義
  17. EXEC SQL BEGIN DECLARE SECTION END-EXEC.
  18. 01 DBNAME PIC X(32) VALUE "testdb".
  19. 01 USERNAME PIC X(32) VALUE "********".
  20. 01 PASSWORD PIC X(32) VALUE "********".
  21. 01 WK-IN01.
  22. 03 TID PIC X(4).
  23. 03 TNAME PIC X(10).
  24. EXEC SQL END DECLARE SECTION END-EXEC.
  25.  
  26. * 2.共通領域の定義
  27. EXEC SQL INCLUDE SQLCA END-EXEC.
  28.  
  29. PROCEDURE DIVISION.
  30. OPEN INPUT IN01-FILE.
  31. READ IN01-FILE
  32. END-READ.
  33. MOVE IN01 TO WK-IN01.
  34.  
  35. * 3.データベース接続
  36. EXEC SQL
  37. CONNECT :USERNAME IDENTIFIED BY :PASSWORD
  38. USING :DBNAME
  39. END-EXEC.
  40.  
  41. * 4.データベースアクセス
  42. EXEC SQL
  43. INSERT INTO test
  44. (tid,tname)
  45. VALUES (:TID,:TNAME)
  46. END-EXEC.
  47.  
  48. DISPLAY "DB INSERT END".
  49.  
  50. EXEC SQL
  51. COMMIT
  52. END-EXEC.
  53.  
  54. CLOSE IN01-FILE.
  55. STOP RUN.
  56. END PROGRAM db_insert_sample02.

使用例2は、使用例1とほとんど同じような処理の流れになっていますが、入力ファイルの値を利用してDBの削除処理を行う記述をしています。

テーブル(test):処理実行前

応用-INSERT-テーブル

入力ファイル(in01.txt):

応用-INSERT-入力ファイル

実行結果:

応用-INSERT-実行結果

テーブル(test):処理実行後

応用-INSERT-テーブル

練習問題

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

問)

先ほどまでのサンプルプログラムは全ての列名に対して値を指定していました。では、使用例1の列名「tname」を指定しなかった場合、どのような結果になるでしょうか?実際にプログラムを修正して確認してみましょう。

※テーブル(test)の状態は使用例1と同じとします。

答え)

結果は列名「tname」がNULLの状態でテーブルにレコードが追加されます。(もしくは、列名がNULLを許容しない場合にはレコードが追加されずに終了します)このように列名を指定しないでテーブルにレコードを追加する事もありますが、COBOL言語においては、列の値の変更が発生する事や、列の値を利用して編集・加工する事はよくありますので、全ての列名を指定し、値が定まらない場合には初期値を設定するなどして対応するといいでしょう。

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

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

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

COBOL入門のカテゴリー

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