技術とか戦略とか

証券レガシーシステムを8年間いじった普通のSEによるブログ。技術のみではなく趣味の戦略考察についても。PCから見た方が色々見やすいと思います。

COBOLでのデータベース連携概論

COBOLOracleDB2等のリレーショナルデータベースと連携することが可能です。
単に opensource COBOL を入れただけだとデータベース連携はできませんが、書き方の簡単な紹介だけでもしてみます。
 
【参考文献】
今回の記事は以下のページを参考にして作成しています。
COBOLOracleと接続する際のマニュアルです。
 
ProCOBOL プログラマーズ・ガイド -- 目次

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/E05652-01/toc.html
 
【基本的なプログラムの作り方】
業務プログラムを製造する者としては、最低限以下の文法を抑えておけば良いでしょう。
以下の文法だけでは不十分ですが、これで足りない分は現場毎で補足されるはずです。
 
・単発のSQL発行
以下のように EXEC SQL文でSQL発行が可能です。
:がついている変数はCOBOL中で定義された変数(ワークエリア)を指しています。
SELECT文のINTO句はSELECT文の発行結果をCOBOLの変数に入れるためのもので、ENAME列の値がEMP-NAME、JOB列の値がJOB-TITLE、SAL列の値がSALARYにセットされます。
 
以下はSELECT文を発行する例ですが、INSERT文やUPDATE文やDELETE文、COMMIT文やROLLBACK文も発行可能です。
 
なお、本当はSQLの戻り値に応じたエラーハンドルやNULL値が返された場合のロジック(多くの場合はLOW-VALUEに置き換える)が必要です。
また、複数行返されるSELECT文の場合は、後述するカーソルが必要です。
 
     EXEC SQL EXECUTE
     BEGIN
        SELECT ENAME, JOB, SAL
            INTO :EMP-NAME, :JOB-TITLE, :SALARY
            FROM EMP
            WHERE EMPNO = :EMP-NUMBER;
     END;
     END-EXEC.
 
・カーソルの使用
複数行返されるSELECT文を発行する場合は、カーソルを使用して1行1行取得する必要があります。
 
まず、下記のようにCURSOR文を発行し、カーソルを定義します。
下記の例ではカーソル名は「EMPCURSOR」になります。
 
     EXEC SQL DECLARE EMPCURSOR CURSOR
         FOR SELECT ENAME, JOB, SAL
         FROM EMP
         WHERE DEPTNO = :DEPTNO
     END-EXEC.
 
次に、定義したカーソルをOPENします。
これでデータ取得が可能になります。
 
     EXEC SQL OPEN EMPCURSOR END-EXEC.
 
次に、SELECT文の結果をFETCH文で1行1行取得します。
(ロジック中では、ファイルで言うREAD文と同じように、1件先読み及びループ中で使用します)
 
     EXEC SQL FETCH EMPCURSOR INTO :EMP-NAME, :JOB-TITLE, :SALARY  END-EXEC.
 
必要な結果をFETCH文で取得したら、最後にカーソルをCLOSEします。
 
     EXEC SQL CLOSE EMPCURSOR END-EXEC.