実行環境
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言語のファイルを修正する必要があるとのこと。
ではどうするか・・・
そこで
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
これでインストールの方は完了です。
次にプログラムをプリコンパイルしてみましょう
プログラムはこちら
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でそのことを検証していく企画も考えております。
最後までご覧いただきありがとうございました!