COBOLのDBを扱うためのコミットとロールバックとは?|応用ガイド | 応用ガイド

COBOL(コボル)言語のDB更新処理を確定、取り消しする方法とは?

応用-COMMIT-イメージ

COBOL(コボル)言語のDB更新に利用する「コミットとロールバック」とは?

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

今回ご紹介するコミット、ロールバックはSQLの記述の1つで、コミットはある処理によるDBへの変更を確定し、変更を永続的なものにする機能を持ちます。逆にロールバックはDBへの変更を取り消しし、変更されたデータを処理開始前の状態に戻す機能を持ちます。では、順にこれらの機能の書き方について見ていきましょう。

書き方(コミット):

COMMIT

書き方(ロールバック):

ROLLBACK

COBOL(コボル)言語のDBアクセスと「コミットとロールバック」の処理構成

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

[基本的な処理構成]

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

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

1.ホスト変数の定義

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

2.共通領域の定義

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

3.データベース接続

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

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

DBの操作(検索、追加、更新、削除など)を行います。今回ご紹介するコミット、ロールバックはこれらDBの変更を行った後、処理を確定、取り消しするために記述します。

では基本的な処理構成について記述したサンプルプログラム(使用例1)を用意しましたので、その書き方について見ていきましょう。

使用例1:

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

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

※ご使用の環境によっては、明示的にCOMMIT、ROLLBACKを記述しなくても、プログラム終了時に自動的にコミットがかかったり、ロールバックがかかったりする事があります。

応用-COMMIT-使用例1

使用例1は、DB(testdb)に、ユーザID、パスワードを指定して接続し、テーブル「test」の列名「tid」が「'0001'、'0002'」の場合、列名「tname」を「peach」に更新するプログラムです。ただし、「tid='0001'」の場合は、更新処理後にロールバックを実行しているため、列名「tname」の値が変わらない事がご確認いただけるかと思います。

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

応用-COMMIT-テーブル

実行結果:

応用-COMMIT-実行結果

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

応用-COMMIT-テーブル

COBOL(コボル)言語の「コミットとロールバック」の応用的な使い方

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

先ほどご紹介したサンプルプログラムは、コミット、ロールバックのそれぞれの機能のご紹介でしたが、通常はDBの更新結果を見ながら、正常ならばコミットして処理を確定し、異常ならばロールバックして処理を取り消すという機能を組み合わせた使い方をします。

応用編では、入力データを基にしてDBの新設処理を行いますが、IN01-TID='0003'の場合、コミットせずに処理を終了させるというプログラムを考えてみましょう。具体的なサンプルプログラム(使用例2)を用意しましたので、しっかり内容を理解して実際のプログラム作成に活用いただければと思います。

使用例2:

  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. db_commit_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. FILE STATUS IS IN-FILE-STATUS.
  10. DATA DIVISION.
  11. FILE SECTION.
  12. FD IN01-FILE.
  13. 01 IN01.
  14. 03 IN01-TID PIC X(04).
  15. 03 IN01-TNAME PIC X(10).
  16. WORKING-STORAGE SECTION.
  17. 01 IN-FILE-STATUS PIC XX.
  18. * 1.ホスト変数の定義
  19. EXEC SQL BEGIN DECLARE SECTION END-EXEC.
  20. 01 DBNAME PIC X(32) VALUE "testdb".
  21. 01 USERNAME PIC X(32) VALUE "********".
  22. 01 PASSWORD PIC X(32) VALUE "********".
  23. 01 WK-IN01.
  24. 03 TID PIC X(4).
  25. 03 TNAME PIC X(10).
  26. EXEC SQL END DECLARE SECTION END-EXEC.
  27.  
  28. * 2.共通領域の定義
  29. EXEC SQL INCLUDE SQLCA END-EXEC.
  30.  
  31. PROCEDURE DIVISION.
  32. OPEN INPUT IN01-FILE.
  33.  
  34. * 3.データベース接続
  35. EXEC SQL
  36. CONNECT :USERNAME IDENTIFIED BY :PASSWORD
  37. USING :DBNAME
  38. END-EXEC.
  39.  
  40. PERFORM UNTIL IN-FILE-STATUS NOT = "00"
  41. READ IN01-FILE
  42. AT END
  43. DISPLAY "READ END"
  44. NOT AT END
  45. MOVE IN01 TO WK-IN01
  46.  
  47. * 4.データベースアクセス
  48. EXEC SQL
  49. INSERT INTO test
  50. (tid,tname)
  51. VALUES (:TID,:TNAME)
  52. END-EXEC
  53.  
  54. IF TID = '0003'
  55. THEN
  56. EXEC SQL
  57. ROLLBACK
  58. END-EXEC
  59. ELSE
  60. EXEC SQL
  61. COMMIT
  62. END-EXEC
  63. END-IF
  64. END-READ
  65. END-PERFORM.
  66. CLOSE IN01-FILE.
  67. STOP RUN.
  68. END PROGRAM db_commit_sample02.

使用例2は、入力データを基にして、テーブル「test」にデータを新設する処理になります。ただし「IN01-TID='0003」'の場合はロールバックを実行しているため、この入力データについては、新設処理が行われずに処理が終了します。

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

応用-COMMIT-テーブル

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

応用-COMMIT-入力ファイル

実行結果:

応用-COMMIT-実行結果

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

応用-COMMIT-テーブル

練習問題

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

問)

使用例1では、「tid='0001'、tname='peach'」に更新後ロールバックし、「tid='0002'、tname='peach'」に更新後コミットする処理を行いました。これを「tid='0001'、tname='grape'」に更新後コミット、さらに「tid='0001'、tname='lemon'」に更新後ロールバックというように、「tid='0001'」の更新処理を続けて行った場合、処理後の「tid='0001'」の「tname」はどのような値が設定されているでしょう。「実際にプログラムを修正して確認してみましょう。

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

答え)

「tname='grape'」が設定されます。

このようにロールバックはDBへの変更を取り消す機能を持ちますが、一度コミット処理が実行されるとそれ以前の状態まで変更を取り消す事はできませんので注意する必要があります。

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

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

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

COBOL入門のカテゴリー

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