Mac上でCOBOLからPostgreSQLにアクセス

[OSSコンソーシアム](https://www.osscons.jp/)の[オープンCOBOLソリューション部会](https://www.osscons.jp/osscobol/)が提供する Open COBOL ESQL をMacにインストールして、PostgreSQLにアクセスするCOBOLプログラムをコンパイル・動作させます。

# 前提条件

Open COBOL ESQLのコンパイルに必要なPostgreSQLをインストールしてください。

[opensource COBOL](https://www.osscons.jp/osscobol/download/?_restful_permalink=osscobol/download/)をインストールして、COBOLプログラムをコンパイルできるようにしてください。opensource COBOLのインストールについては[こちらの記事](http://qiita.com/fujii_masao/items/ce57288ba8dd18859fbf)が参考になります。

# Open COBOL ESQL のインストール

Open COBOL ESQLの[ダウンロードサイト](https://www.osscons.jp/osscobol/download/addtools/)からOpen COBOL ESQLのソースパッケージ(2017年2月9日時点では[ocesql-1.1.0.tar.gz](http://www.osscons.jp/osscobol/files?action=cabinet_action_main_download&block_id=414&room_id=21&cabinet_id=11&file_id=313&upload_id=594))をダウンロードします。

Open COBOL ESQLのソースパッケージを展開し、```#include <malloc.h>```を```#include <stdlib.h>```に置き換えます。置き換えをしないと、```fatal error: 'malloc.h' file not found```のエラーでコンパイルが失敗します。

```bash
$ tar zxf ocesql-1.1.0.tar.gz
$ cd ocesql-1.1.0

$ sed s/"\#include \<malloc.h\>"/"\#include \<stdlib.h\>"/g dblib/ocdb.c > tmp
$ mv tmp dblib/ocdb.c
$ sed s/"\#include \<malloc.h\>"/"\#include \<stdlib.h\>"/g dblib/ocdbutil.c > tmp
$ mv tmp dblib/ocdbutil.c
$ sed s/"\#include \<malloc.h\>"/"\#include \<stdlib.h\>"/g dblib/ocesql.c > tmp
$ mv tmp dblib/ocesql.c
$ sed s/"\#include \<malloc.h\>"/"\#include \<stdlib.h\>"/g dblib/ocpgsql.c > tmp
$ mv tmp dblib/ocpgsql.c
$ sed s/"\#include \<malloc.h\>"/"\#include \<stdlib.h\>"/g ocesql/parser.c > tmp
$ mv tmp ocesql/parser.c
```

PostgreSQLインストールディレクトリのincludeとlibをCPPFLAGSとLDFLAGSに設定した上で、Open COBOL ESQLをコンパイル、インストールします。

```bash
$ export CPPFLAGS="-I/opt/pgsql/include"
$ export LDFLAGS="-L/opt/pgsql/lib"
$ ./configure
$ make
$ sudo make install
```

# PostgreSQLにアクセスするCOBOLプログラムの作成と実行

ソースファイル randomnum.cbl (拡張子はcbl) に以下のとおりコーディングします。コードの各行は8桁目以降から始まっていることに注意してください。このCOBOLプログラムは、PostgreSQLにアクセスして、ランダムな整数を取得し、表示します。

```cobol
       IDENTIFICATION DIVISION.
       PROGRAM-ID. RANDOMNUM.

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 RET       PIC 9(3).

       EXEC SQL BEGIN DECLARE SECTION END-EXEC.
       01 DBNAME    PIC X(32) VALUE "postgres".
       01 USERNAME  PIC X(32) VALUE "postgres".
       01 PASSWORD  PIC X(32) VALUE SPACE.
       EXEC SQL END DECLARE SECTION END-EXEC.

       EXEC SQL INCLUDE SQLCA END-EXEC.

       PROCEDURE DIVISION.
       MAIN.
            EXEC SQL
                CONNECT :USERNAME IDENTIFIED BY :PASSWORD
                    USING :DBNAME
            END-EXEC.

            EXEC SQL
                SELECT round(random()*100) INTO :RET
            END-EXEC.

            EXEC SQL
                DISCONNECT ALL
            END-EXEC.

            DISPLAY RET.
            STOP RUN.
```

Open COBOL ESQL でプリコンパイルします。

```bash
$ ocesql randomnum.cbl randomnum.cob
```

次に、環境変数COBCPYに Open COBOL ESQL ソースディレクトリ配下のcopyディレクトリのパスを指定した上で、コンパイル対象のファイルは、プリコンパイル結果の randomnum.cob (拡張子がcob) をコンパイルします。コンパイル時には、PostgreSQLインストールディレクトリのlibを```-L```に指定し、また```-locesql```と```-lpq```も指定してください。

```bash
$ export COBCPY=/opt/ocesql-1.1.0/copy
$ cobc -x -locesql -lpq -L/opt/pgsql/lib randomnum.cob
```

最後に、PostgreSQLを別途起動した上で、COBOLプログラムを実行します。

```bash
## 事前にPostgreSQLを起動しておくこと

$ ./randomnum
060
$ ./randomnum
083
```