【COBOL】Ubuntu22.04にOpen Cobol ESQL v.1.3をインストールする。

実行環境
Ubuntu22.04
PostgreSQL16
opensource COBOL v1.5.2J
--------------------------

COBOLでSQLを実行したいと思い、インストールを試みました。
### しかしここで問題が。。。
https://www.osscons.jp/osscobol/download
リリースインフォメーションでOpen COBOL ESQL v1.2.0がリリース日が4年前で、これをインストールしようとすると後述のmakeでコンパイルエラーになり、それを解消するとなるとC言語のファイルを修正する必要があるとのこと。

### ではどうするか・・・

そこで

https://github.com/opensourcecobol/Open-COBOL-ESQL/releases/tag/v1.3

GithubにあるSource code(tar.gz)をダウンロードします。

それを/home配下の自分のディレクトリに格納してあげましょう。

### その前にPostgeresqlをインストールしましょう。
```
sudo apt-get -y install postgresql
```
これで最新版のPostgeresqlがインストールされるはずです。
psql -Vでバージョンを確認してみしょう。
```
$ psql -V
psql (PostgreSQL) 16.1 (Ubuntu 16.1-1.pgdg22.04+1)
```
現時点の最新がインストールされています。

次にサービスを起動させてロールの作成とCREATE DATABASEをやります
```
$ sudo service postgresql start

$ su - postgres
$ psql

>create role (ユーザ名) LOGIN CREATEDB PASSWORD '(パスワード)';

>create database (DB名) with owner = (ユーザ名);
```
成功するとCREATE DATABASEとか出ると思います。

次に作成したロールでアカウントに入りましょう。
現時点のログインしているものは\q＋ENTERで抜けられて、CTRL＋Dでpostgresユーザも抜けれるかと思います。

### 次にロールで作成したアカウントで入りましょう。
```
$ psql -U (ユーザ名) -h (ホスト名) -d (DB名)
```
次にテーブル作成とINSERT文を追加していきます。
```
> create table test (
> tid    char(4) not null,
> tname  char(10) not null
> );
CREATE TABLE

> insert into test
> (tid,tname) values
> ('0001','apple');
INSERT 0 1
```
INSERTされました。次にSELECT文をやってみます。
```
> select * from test;
 tid  |   tname
------+------------
 0001 | apple
(1 row)
```
### それでは本題のOpen Cobol ESQL v.1.3をやっていきましょう。
※予めsudo apt-get install bisonやsudo apt-get install flexをやった方がいいかもしれません。Open COBOL ESQL v1.2.0ではそのコマンドがインストールしてなくてコンパイルエラーになった形跡あり。
### 後、libpq-fe.hが見つからないでコンパイル通らないことがあるので、
### sudo apt install libpq-devでlibpq-fe.hをインストールしましょう。

それではtarで解凍しましょう。
```
tar xzvf Open-COBOL-ESQL-1.3.tar.gz

Open-COBOL-ESQL-1.3/

Open-COBOL-ESQL-1.3/.github/

Open-COBOL-ESQL-1.3/.github/workflows/

Open-COBOL-ESQL-1.3/.github/workflows/ubuntu-test-settings/

Open-COBOL-ESQL-1.3/.github/workflows/ubuntu-test-settings/atlocal

Open-COBOL-ESQL-1.3/.github/workflows/ubuntu-test-settings/cobol_runner.sh

Open-COBOL-ESQL-1.3/.github/workflows/ubuntu-test-settings/embed_db_info.sh

Open-COBOL-ESQL-1.3/.github/workflows/ubuntu-test.yml

Open-COBOL-ESQL-1.3/AUTHORS

Open-COBOL-ESQL-1.3/COPYING

Open-COBOL-ESQL-1.3/COPYING.DOC

Open-COBOL-ESQL-1.3/ChangeLog

Open-COBOL-ESQL-1.3/INSTALL

Open-COBOL-ESQL-1.3/Makefile.am

Open-COBOL-ESQL-1.3/Makefile.in

Open-COBOL-ESQL-1.3/NEWS

Open-COBOL-ESQL-1.3/README

Open-COBOL-ESQL-1.3/README_JPN

Open-COBOL-ESQL-1.3/TODO

Open-COBOL-ESQL-1.3/aclocal.m4

Open-COBOL-ESQL-1.3/config.guess

Open-COBOL-ESQL-1.3/config.h.in

Open-COBOL-ESQL-1.3/config.sub

Open-COBOL-ESQL-1.3/configure

Open-COBOL-ESQL-1.3/configure.ac

Open-COBOL-ESQL-1.3/copy/

Open-COBOL-ESQL-1.3/copy/sqlca.cbl

Open-COBOL-ESQL-1.3/dblib/

Open-COBOL-ESQL-1.3/dblib/Makefile.am

Open-COBOL-ESQL-1.3/dblib/Makefile.in

Open-COBOL-ESQL-1.3/dblib/ocdb.c

Open-COBOL-ESQL-1.3/dblib/ocdb.h

Open-COBOL-ESQL-1.3/dblib/ocdblog.c

Open-COBOL-ESQL-1.3/dblib/ocdblog.h

Open-COBOL-ESQL-1.3/dblib/ocdbutil.c

Open-COBOL-ESQL-1.3/dblib/ocdbutil.h

Open-COBOL-ESQL-1.3/dblib/ocesql.c

Open-COBOL-ESQL-1.3/dblib/ocesql.h

Open-COBOL-ESQL-1.3/dblib/ocpgsql.c

Open-COBOL-ESQL-1.3/dblib/ocpgsql.h

Open-COBOL-ESQL-1.3/depcomp

Open-COBOL-ESQL-1.3/install-sh

Open-COBOL-ESQL-1.3/ltmain.sh

Open-COBOL-ESQL-1.3/missing

Open-COBOL-ESQL-1.3/ocesql/

Open-COBOL-ESQL-1.3/ocesql/Makefile.am

Open-COBOL-ESQL-1.3/ocesql/Makefile.in

Open-COBOL-ESQL-1.3/ocesql/define.h

Open-COBOL-ESQL-1.3/ocesql/errorfile.c

Open-COBOL-ESQL-1.3/ocesql/ocesql.c

Open-COBOL-ESQL-1.3/ocesql/ocesql.h

Open-COBOL-ESQL-1.3/ocesql/ocesqlutil.c

Open-COBOL-ESQL-1.3/ocesql/ocesqlutil.h

Open-COBOL-ESQL-1.3/ocesql/parser.c

Open-COBOL-ESQL-1.3/ocesql/parser.h

Open-COBOL-ESQL-1.3/ocesql/parser.y

Open-COBOL-ESQL-1.3/ocesql/ppout.c

Open-COBOL-ESQL-1.3/ocesql/scanner.c

Open-COBOL-ESQL-1.3/ocesql/scanner.l

Open-COBOL-ESQL-1.3/sample/

Open-COBOL-ESQL-1.3/sample/FETCHTBL.cbl

Open-COBOL-ESQL-1.3/sample/INSERTTBL.cbl

Open-COBOL-ESQL-1.3/tests/

Open-COBOL-ESQL-1.3/tests/Dockerfile

Open-COBOL-ESQL-1.3/tests/Makefile

Open-COBOL-ESQL-1.3/tests/README.md

Open-COBOL-ESQL-1.3/tests/atlocal

Open-COBOL-ESQL-1.3/tests/basic

Open-COBOL-ESQL-1.3/tests/basic.at

Open-COBOL-ESQL-1.3/tests/basic.src/

Open-COBOL-ESQL-1.3/tests/basic.src/commit-rollback.at

Open-COBOL-ESQL-1.3/tests/basic.src/connect-disconnect.at

Open-COBOL-ESQL-1.3/tests/basic.src/declare.at

Open-COBOL-ESQL-1.3/tests/basic.src/delete.at

Open-COBOL-ESQL-1.3/tests/basic.src/fetch.at

Open-COBOL-ESQL-1.3/tests/basic.src/insert.at

Open-COBOL-ESQL-1.3/tests/basic.src/open-close.at

Open-COBOL-ESQL-1.3/tests/basic.src/sample.at

Open-COBOL-ESQL-1.3/tests/basic.src/select.at

Open-COBOL-ESQL-1.3/tests/basic.src/sqlca.cbl

Open-COBOL-ESQL-1.3/tests/basic.src/update.at

Open-COBOL-ESQL-1.3/tests/cobol_data

Open-COBOL-ESQL-1.3/tests/cobol_data.at

Open-COBOL-ESQL-1.3/tests/cobol_data.src/

Open-COBOL-ESQL-1.3/tests/cobol_data.src/alphanumeric.at

Open-COBOL-ESQL-1.3/tests/cobol_data.src/comp5.at

Open-COBOL-ESQL-1.3/tests/cobol_data.src/japanese.at

Open-COBOL-ESQL-1.3/tests/cobol_data.src/numeric_signed_trailing_v.at

Open-COBOL-ESQL-1.3/tests/cobol_data.src/numeric_signed_v.at

Open-COBOL-ESQL-1.3/tests/cobol_data.src/numeric_v.at

Open-COBOL-ESQL-1.3/tests/embed_db_info.sh

Open-COBOL-ESQL-1.3/tests/embed_db_info_docker.sh

Open-COBOL-ESQL-1.3/tests/generate_testcase_sql_type.py

Open-COBOL-ESQL-1.3/tests/misc

Open-COBOL-ESQL-1.3/tests/misc.at

Open-COBOL-ESQL-1.3/tests/misc.src/

Open-COBOL-ESQL-1.3/tests/misc.src/empty-string.at

Open皇族-COBOL-ESQL-1.3/tests/package.m4

Open-COBOL-ESQL-1.3/tests/sql_data

Open-COBOL-ESQL-1.3/tests/sql_data.at

Open-COBOL-ESQL-1.3/tests/sql_data.src/

Open-COBOL-ESQL-1.3/tests/sql_data.src/sql_type.at

Open-COBOL-ESQL-1.3/tests/sqlca

Open-COBOL-ESQL-1.3/tests/sqlca.at

Open-COBOL-ESQL-1.3/tests/sqlca.cbl

Open-COBOL-ESQL-1.3/tests/sqlca.src/

Open-COBOL-ESQL-1.3/tests/sqlca.src/connect-disconnect.at

Open-COBOL-ESQL-1.3/tests/sqlca.src/insert-select-update-delete.at

Open-COBOL-ESQL-1.3/tests/sqlca.src/open-fetch-close.at

Open-COBOL-ESQL-1.3/tests/sqlca.src/prepare-execute.at

Open-COBOL-ESQL-1.3/win32/

Open-COBOL-ESQL-1.3/win32/libocesql/

Open-COBOL-ESQL-1.3/win32/libocesql/libocesql.vcxproj

Open-COBOL-ESQL-1.3/win32/libocesql/libocesql.vcxproj.filters

Open-COBOL-ESQL-1.3/win32/ocesql.sln

Open-COBOL-ESQL-1.3/win32/ocesql/

Open-COBOL-ESQL-1.3/win32/ocesql/ocesql.vcxproj

Open-COBOL-ESQL-1.3/win32/ocesql/ocesql.vcxproj.filters

Open-COBOL-ESQL-1.3/ylwrap
```
tarコマンドオプションv指定でディレクトリ構成見れます。

それでは後続作業を

```
$ cd Open-COBOL-ESQL-1.3/
$ export CPPFLAGS="-I/usr/include/postgresql"
$ export LDFLAGS="-L/usr/lib/postgresql/16/lib"
$ ./configure
$ make
$ sudo make install
```
### これでインストールの方は完了です。

次にプログラムをプリコンパイルしてみましょう
### プログラムはこちら
```dbsample.cbl
       IDENTIFICATION DIVISION.
       PROGRAM-ID. dbsample.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  TID     PIC X(4).
       01  TNAME   PIC X(10).
      ******** (1)ホスト変数の定義 ********
       EXEC SQL BEGIN DECLARE SECTION END-EXEC.
       01  DBNAME   PIC X(32) VALUE "(DB名)".
       01  USERNAME PIC X(32) VALUE "(ユーザ名)".
       01  PASSWORD PIC X(32) VALUE "(パスワード)".
       EXEC SQL END DECLARE SECTION END-EXEC.
      *************************************
      ******** (2)共通領域の定義 **********
       EXEC SQL INCLUDE SQLCA END-EXEC.
       *************************************
       PROCEDURE DIVISION.
       MAIN.
      ******** (3)データベースと接続 ******
           EXEC SQL
             CONNECT :USERNAME IDENTIFIED BY :PASSWORD
             USING :DBNAME
           END-EXEC.
      *************************************
      ******** (4)データベースとアクセス **
           EXEC SQL
             SELECT tid,tname
               INTO :TID,:TNAME
               FROM test
               WHERE tid='0001'
           END-EXEC.
      *************************************
           DISPLAY TID TNAME.
           STOP RUN.
```

プリコンパイルのやり方としてocesql プログラム名.cbl プログラム名.cob
```
$ ocesql dbsample.cbl dbsample.cob
precompile start: dbsample.cbl
=======================================================
              LIST OF CALLED DB Library API
=======================================================
Generate:OCESQLConnect
Generate:OCESQLExecSelectIntoOne
=======================================================
```

次にコンパイルします。
```
$ export COPY=/home/opt/Open-COBOL-ESQL-1.3/copy
$ export SCR=/usr/local/share/opensource-cobol-1.5.2J/copy
$ export OC_OBJ=/home/opt/Open-COBOL-ESQL-1.3/dblib
$ cobc -x dbsample.cob $OC_OBJ/ocdb.o $OC_OBJ/ocdblog.o $OC_OBJ/ocdbutil.o $OC_OBJ/ocesql.o $OC_OBJ/ocpgsql.o -I$COPY -I$SCR -locesql -lpq
```
export COPY=/home/opt/Open-COBOL-ESQL-1.3/copyはSQLCAの定義ファイルが入っています。
この定義を忘れてしまうと「SQLCAが見つかりません。」がでます。
なので必ず環境変数に設定してあげましょう。
普通にオブジェクトファイルを指定してあげないとUbuntuの仕様でリンクがうまくいかない事象があるようでこのようにオブジェクトファイルを指定した形になります。
```
./dbsample
0001apple
```
実行結果が想定通り出力されました。

いかがでしたでしょうか。

金融システムでオープン系に携わっていますが、機会があれば、
opensource COBOLでそのことを検証していく企画も考えております。

最後までご覧いただきありがとうございました！