ノンストップデータベース　HiRDB Version 10 構造型データベース機能（UAP開発編）

解説・手引・文法・操作書

3020-6-579-60

前書き

対象製品

●適用OS：Red Hat(R) Enterprise Linux(R) Server 7（64-bit x86_64），Red Hat(R) Enterprise Linux(R) Server 8（64-bit x86_64），Red Hat(R) Enterprise Linux(R) Server 9（64-bit x86_64）

P-8462-C5A1 HiRDB Structured Data Access Facility Version 10 10-08

P-8462-AEA1 HiRDB Structured Data Access Facility/Developer's Kit Version 10(64) 10-08

P-F8462-C5A11 HiRDB Structured Data Access Facility Extension for XDM/SD type Version 10 10-04

輸出時の注意

本製品を輸出される場合には、外国為替及び外国貿易法の規制並びに米国輸出管理規則など外国の輸出関連法規をご確認の上、必要な手続きをお取りください。

なお、不明な場合は、弊社担当営業にお問い合わせください。

商標類

HITACHI，Cosminexus，DABroker，DBPARTNER，DocumentBroker，HAモニタ，HiRDB，Job Management Partner 1，JP1，OpenTP1，uCosminexus，XDMは，株式会社日立製作所の商標または登録商標です。

ActiveXは，マイクロソフト 企業グループの商標です。

Amazon Web Services，AWS，Powered by AWS ロゴ，Amazon Elastic Compute Cloud (Amazon EC2)は，Amazon.com, Inc. またはその関連会社の商標です。

Linuxは，Linus Torvalds氏の米国およびその他の国における登録商標です。

Oracle(R)，Java，MySQL及びNetSuiteは，Oracle，その子会社及び関連会社の米国及びその他の国における登録商標です。文中の社名，商品名等は各社の商標または登録商標である場合があります。

Red Hat, and Red Hat Enterprise Linux are registered trademarks of Red Hat, Inc. in the United States and other countries. Linux(R) is the registered trademark of Linus Torvalds in the U.S. and other countries.

Red Hat，およびRed Hat Enterprise Linuxは，米国およびその他の国におけるRed Hat, Inc.の登録商標です。Linux(R)は，米国およびその他の国におけるLinus Torvalds氏の登録商標です。

UNIXは，The Open Groupの登録商標です。

その他記載の会社名，製品名などは，それぞれの会社の商標もしくは登録商標です。

発行

2024年4月　3020-6-579-60

著作権

All Rights Reserved. Copyright (C) 2019, 2024, Hitachi, Ltd.

変更内容

変更内容（3020-6-579-60）　HiRDB Structured Data Access Facility Version 10　10-08

追加・変更内容

変更個所

UAPの再プリプロセス，再コンパイル，再リンケージが必要なケースに，次の場合を追加しました。

HiRDB/SDをバージョンアップして，HiRDB/SDの新機能を使用する場合

5.2

単なる誤字・脱字などはお断りなく訂正しました。

はじめに

このマニュアルは，HiRDB Structured Data Access Facility（以降，HiRDB/SDと略します）の構造型データベースを操作するインタフェース（DML）を使用して，COBOL言語のユーザアプリケーションプログラム（UAP）を開発する方法について説明しています。

対象読者

HiRDB/SDを使用してCOBOL言語のUAPを作成する方，UAPを実行する方（HiRDBクライアントを使用する方）を対象としています。

このマニュアルの記述は，次に示す知識があることを前提にしています。

COBOL言語のプログラミングの知識

HiRDBの基礎的な知識

Linuxのシステム管理の基礎的な知識

マニュアルの構成

このマニュアルは，次に示す章と付録から構成されています。

第1章　UAP開発の概要

UAPの形式，UAPの開発環境，UAPの実行環境，およびUAPの開発の流れなどについて説明しています。

第2章　UAPの作成

DMLによるSDBデータベースにアクセスする部分のCOBOLソースプログラムの作成方法について説明しています。

第3章　UAPの実行前準備（UAPのプリプロセス，コンパイル，リンケージ）

UAPのプリプロセス，コンパイル，およびリンケージの方法について説明しています。

第4章　UAPの実行環境の構築

HiRDBクライアントの環境設定方法，UAPをテストする際のUAPの実行方法，およびテスト環境から本番環境へのUAPの移行方法について説明しています。

第5章　UAPの運用・保守

UAPの実行方法，UAPの再プリプロセスが必要なケース，およびUAPの障害対策について説明しています。

第6章　DMLプリプロセサ（pdsdbcblコマンド）

DMLプリプロセサ（pdsdbcblコマンド）の機能と使い方について説明しています。

関連マニュアル

このマニュアルの関連マニュアルを次に示します。必要に応じてお読みください。

HiRDBマニュアル

HiRDB Version 10 構造型データベース機能（3020-6-578）

HiRDB Version 10 解説（3020-6-551）

HiRDB Version 10 システム導入・設計ガイド（UNIX(R)用）（3020-6-552）

HiRDB Version 10 システム定義（UNIX(R)用）（3020-6-554）

HiRDB Version 10 システム運用ガイド（UNIX(R)用）（3020-6-556）

HiRDB Version 10 コマンドリファレンス（UNIX(R)用）（3020-6-558）

HiRDB Version 10 UAP開発ガイド（3020-6-560）

HiRDB Version 10 SQLリファレンス（3020-6-561）

HiRDB Version 10 メッセージ（3020-6-562）

以降，HiRDB Version 10のマニュアル名は，Version 10，（UNIX(R)用）を省略して表記しています。

関連製品

COBOL2002 使用の手引　手引編（3000-3-D08）

COBOL85 使用の手引（3000-3-354）

COBOL85 言語（3020-3-782）

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成リファレンス COBOL言語編（3000-3-D55）

OpenTP1のマニュアルを本文中で参照させる場合は，「OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成リファレンス COBOL言語編」を「OpenTP1 プログラム作成リファレンス COBOL言語編」と表記します。

このマニュアルでの表記

このマニュアルでは製品名称および名称について次のように表記しています。ただし，それぞれのプログラムについての表記が必要な場合はそのまま表記しています。

製品名称または名称

表記

HiRDB Version 10

HiRDBまたはHiRDBサーバ

HiRDB Structured Data Access Facility/Run Time Version 10(64)

HiRDB Structured Data Access Facility/Run Time

HiRDBクライアント

HiRDB Structured Data Access Facility/Developer's Kit Version 10(64)

HiRDB Structured Data Access Facility/Developer's Kit

Linux(R)

Linux

Red Hat(R) Enterprise Linux(R) Server 7（64-bit x86_64）

Red Hat(R) Enterprise Linux(R) Server 8（64-bit x86_64）

Red Hat(R) Enterprise Linux(R) Server 9（64-bit x86_64）

HiRDB運用ディレクトリのパスを$PDDIRと表記します。

TCP/IPが規定するhostsファイル（/etc/hostsファイルも含む）をhostsファイルと表記します。

このマニュアルで使用する略語

このマニュアルで使用する英略語の一覧を次に示します。

英略語

英 字 の 表 記

AFM

Attached File Management Program

Amazon EC2

Amazon Elastic Compute Cloud

API

Application Programming Interface

AWS

Amazon Web Services

COBOL

Common Business Oriented Language

DB

Database

DML

Data Manipulate Language

DNS

Domain Name System

FMB

File Manager for Banks

JIS

Japanese Industrial Standard code

OLTP

On-Line Transaction Processing

OS

Operating System

RD

Relational Database

SJIS

Shift JIS

SPP

Service Providing Program

SUP

Service Using Program

UAP

User Application Program

このマニュアルで使用する記号

形式および説明で使用する記号を次に示します。ここで説明する文法記述記号は，説明のための記号なので実際には記述しないでください。

文法記述記号

意味

〔　　〕

この記号で囲まれている項目は省略できます。

（例）pdsdbcbl 〔-Xb〕

これは，pdsdbcblと指定するか，またはpdsdbcbl -Xbと指定できることを意味しています。

…

この記号直前の項目を繰り返して指定できます。

（例）SDBデータベース名〔,SDBデータベース名〕…

これは，「SDBデータベース名」を繰り返し指定できることを意味しています。

〜

この記号のあとにユーザ指定値の属性を示します。

＜　　＞

ユーザ指定値の構文要素記号を示します。

((　　))

ユーザ指定値の指定範囲を示します。

このマニュアルで使用する構文要素記号

このマニュアルで使用する構文要素記号を次に示します。

構文要素記号

意味

＜識別子＞

指定できる文字の規則については，マニュアル「HiRDB 構造型データベース機能」の「名前の規則」を参照してください。

＜パス名＞※

/，英数字，ピリオド（.），#，@で構成される文字列

注

すべて半角文字を使用してください。

注※

パス名は使用しているOSに依存します。

KB（キロバイト）などの単位表記について

1KB（キロバイト），1MB（メガバイト），1GB（ギガバイト），1TB（テラバイト）はそれぞれ1,024バイト，1,024²バイト，1,024³バイト，1,024⁴バイトです。

1　UAP開発の概要

この章では，UAPの形式，UAPの開発環境，UAPの実行環境，およびUAPの開発の流れなどについて説明します。

1.1　UAPの記述言語と形式

SDBデータベース種別がSD FMBのSDBデータベースは，UAPを使用して操作できます。SDBデータベースにアクセスするUAPの記述言語と形式を次に示します。

UAPの記述言語

COBOL85

UAPの形式

埋込み型UAP

COBOLソースプログラム中に，SDBデータベースを操作するDMLを直接記述する形式のUAPを，埋込み型UAPといいます。COBOLソースプログラム中に，次の表に示すDMLを記述できます。

表1‒1　SDBデータベースを操作するDMLの一覧

項番

分類

DML

機能

1

操作系DML

ERASE

レコード実現値を削除します。

2

FETCH

レコードを検索して，レコード実現値を取得します。また，検索したレコードに対して位置づけを行います。

3

FIND

レコード実現値に位置指示子を位置づけます。

4

MODIFY

1レコード実現値を更新します。

5

STORE

1レコード実現値を格納します。

6

GET

1レコード実現値を取得します。

各DMLの機能説明や記述形式については，マニュアル「HiRDB 構造型データベース機能」の「DMLリファレンス」を参照してください。

注意事項

DMLを使用して操作できるSDBデータベースは，SDBデータベース種別がSD FMBのSDBデータベースです。SDBデータベース種別が4V FMBまたは4V AFMのSDBデータベースは，DMLを使用して操作することはできません。

埋込み型UAPとHiRDB/SDの間では，次に示すインタフェース領域を使用して情報を受け渡しします。

SQL連絡領域

SQL連絡領域には，DMLの実行結果の詳細情報が格納されます。DMLの実行結果の判定処理をする際に使用します。

埋込み変数

埋込み変数には，DMLに指定する値や，DMLの実行結果が格納されます。DML中に埋込み変数を指定することで，埋込み型UAPとHiRDB/SDとの間で値の受け渡しをします。

1.2　UAPの開発環境

DMLを記述したUAPを開発する際，UAPのプリプロセス，コンパイル，およびリンケージを実行します。そのためには，次に示す環境のマシンが必要になります。

OS

次のどれかのOSが必要です。

Red Hat Enterprise Linux Server 7（64-bit x86_64）

Red Hat Enterprise Linux Server 8（64-bit x86_64）

Red Hat Enterprise Linux Server 9（64-bit x86_64）

HiRDBクライアント

次の製品が必要です。

HiRDB Structured Data Access Facility/Developer's Kit

COBOL製品

次の製品が必要です。COBOL2002のCOBOLコンパイラを使用します。

COBOL2002 Net Server Suite(64)

上記の製品は，「Linux版COBOL2002サポートサービス」の「レガシ文字コードShift JISサポートオプション」に対応しています。

COBOL2002レガシ文字コードShift-JISサポートオプションを適用し，Shift-JISのオブジェクトを生成してください。

OLTP製品

OLTP環境下で実行するUAPを開発する場合，次の製品が必要です。

OpenTP1

文字コード

使用する文字コードは，シフトJIS漢字コード（SJIS）です。

HiRDBサーバで使用する文字コードは，プリプロセス時の文字コードと一致させてください。

1.3　UAPの実行環境および運用形態

ここでは，UAPの実行環境および運用形態について説明します。

1.3.1　UAPの実行環境

UAPの実行環境は，次に示す条件をすべて満たす必要があります。

OS

次のどれかのOSが必要です。

Red Hat Enterprise Linux Server 7（64-bit x86_64）

Red Hat Enterprise Linux Server 8（64-bit x86_64）

Red Hat Enterprise Linux Server 9（64-bit x86_64）

HiRDBサーバ

HiRDB Structured Data Access Facility

HiRDBクライアント

次のどちらかの製品が必要です。

HiRDB Structured Data Access Facility/Run Time

HiRDB Structured Data Access Facility/Developer's Kit

COBOL製品

次のどちらかの製品が必要です。

COBOL2002 Net Server Suite(64)

COBOL2002 Net Server Runtime(64)

上記の製品は，「Linux版COBOL2002サポートサービス」の「レガシ文字コードShift JISサポートオプション」に対応しています。

OLTP製品

OLTP環境下でUAPを実行する場合，次の製品が必要です。

OpenTP1

文字コード

使用する文字コードは，シフトJIS漢字コード（SJIS）です。

1.3.2　UAPの運用形態

UAPの運用形態は，次のどちらかになります。

OpenTP1環境下でUAPを実行する

OpenTP1環境下でUAPを実行する場合，HiRDBサーバへの接続および切り離しはOpenTP1が制御し，トランザクション制御はOpenTP1のAPIで行います。

OpenTP1環境下でのUAPの運用形態については，マニュアル「HiRDB UAP開発ガイド」の「UAPの動作環境」の「OLTP下のUAPをクライアントとする運用形態」を参照してください。

UAPの実行可能ファイルを直接起動してUAPを実行する

UAPの実行可能ファイルを直接起動してUAPを実行する場合，HiRDBサーバへの接続および切り離し，トランザクション制御はSQLで行います。

UAPの実行可能ファイルを直接起動するUAPの運用形態については，マニュアル「HiRDB UAP開発ガイド」の「UAPの動作環境」の次の個所を参照してください。

「サーバマシンとは別のマシンをクライアントとする運用形態」

「HiRDBサーバと同一のサーバマシンでクライアントを実行する運用形態」

1.4　UAPの開発の流れ

ここでは，UAPの開発の流れについて説明します。

1.4.1　UAPの設計から実行までの流れ

UAPの設計から実行までの流れを次の図に示します。

ポイント

このマニュアルでは，DMLによってSDBデータベースにアクセスする部分のUAPの設計方法と作成方法について説明しています。そのため，下記のUAPの開発の流れの図は，DMLによってSDBデータベースにアクセスする部分のUAP開発の流れを示しています。

図1‒1　UAPの開発の流れ

注※1

これらの環境の構築作業は1回だけ実施します。

注※2

これらの操作を実行した場合，SDBデータベースにアクセスする部分のUAPの再プリプロセス，再コンパイル，および再リンケージが必要になります。

■各作業項目のマニュアル中の参照先

「図1-1　UAPの開発の流れ」の各作業項目は，次の表に示す参照先で説明しています。「図1-1　UAPの開発の流れ」で示している項番は，次の表の項番と対応しています。

表1‒2　UAP開発時の各作業項目の参照先

項番

作業項目

参照先

1

DMLによってSDBデータベースにアクセスする部分のUAPを設計する

「2.　UAPの作成」

2

DMLによってSDBデータベースにアクセスする部分のUAPのソースプログラムをコーディングする

「2.10　COBOLソースプログラムの記述規則」

「2.11　COBOLソースプログラムのコーディング例」

「2.12.3　COBOLソースプログラムのコーディング例（DMLとSQLの両方を実行するUAPの場合）」

3

プリプロセス，コンパイル，リンケージを実行する環境を構築する

「3.1　プリプロセス，コンパイル，およびリンケージの実行環境の構築」

4

プリプロセスを実行するための準備をする

「3.3.1　プリプロセスを実行するための準備作業」

5

プリプロセスを実行する

「3.3.2　プリプロセスの実行例」

6

コンパイルとリンケージを実行するための準備をする

「3.4.1　コンパイルおよびリンケージを実行するための準備作業」

7

コンパイルとリンケージを実行する

「3.4.2　ccbl2002コマンドの指定形式」

「3.4.3　コンパイルおよびリンケージの実行例」

8

デバッグを行う（ソースプログラムを修正する）

プリプロセスエラーが発生した場合

「3.3.3　プリプロセスエラーが発生した場合の対処」

コンパイルエラー，またはリンケージエラーが発生した場合

「3.4.4　コンパイルエラーまたはリンケージエラーが発生した場合の対処」

9

UAPの実行環境（テスト環境）を構築する

「4.1　HiRDBクライアントの環境設定」

10

UAPを実行（テスト）する

「4.2　UAPのテストの実行」

11

UAPの実行環境（本番環境）を構築する

「4.1　HiRDBクライアントの環境設定」

12

UAPを本番環境に移行する

「4.3　テスト環境から本番環境へのUAPの移行」

13

UAPを実行する

「5.1　UAPの実行」

14

次のことが発生した場合

SDBデータベースの定義を変更した場合

DMLの記述を変更した場合

機能追加などによってUAPを改修した場合

「5.2　UAPの再プリプロセス，再コンパイル，再リンケージが必要なケース」

15

UAPに障害が発生した場合，トラブルシュート機能を使用して障害要因を調査する

「5.3　UAPの障害対策」

1.4.2　目的別の参照先一覧

UAPの設計から実行までの作業の目的別の参照先一覧を次の表に示します。

表1‒3　目的別の参照先一覧

分類

知りたいこと

参照先

UAPの設計および作成

SDBデータベース節

SDBデータベース節に記述する内容や，記述例を知りたい

「2.3　SDBデータベース節の記述」

埋込み変数

埋込み変数の宣言方法，宣言例，および宣言する際の規則を知りたい

「2.4　埋込み変数の宣言」

DML

レコードを検索する方法を知りたい

「2.5　DMLによるレコードの検索」

レコードを更新，格納，または削除する方法を知りたい

「2.6　DMLによるレコードの更新，格納，または削除」

DMLの記述規則または文法を知りたい

「2.10.8　DMLの記述規則」

マニュアル「HiRDB 構造型データベース機能」の「DMLリファレンス」

DMLの実行結果の判定処理について知りたい

「2.7　DMLの実行結果の判定処理」

SQLCODEの値とその意味を知りたい

「2.7.2　SQLCODEの値と意味」

SQL連絡領域について知りたい

「2.7.4　SQL連絡領域の構成と内容」

トランザクション制御

トランザクションのコミット，ロールバックについて知りたい

「2.8　トランザクション制御」

「2.12.2　DMLとSQLの両方を実行するUAPのトランザクション制御」

排他制御

排他制御について知りたい

「2.9　排他制御」

COBOLソースプログラムの構成，記述規則，注意事項

COBOLソースプログラムの構成，記述規則について知りたい

「2.1　COBOLソースプログラムの基本構成」

「2.10　COBOLソースプログラムの記述規則」

COBOLソースプログラムを作成する際の考慮点，注意事項について知りたい

「2.2　COBOLソースプログラムを作成する際の考慮点」

「2.13　2進項目をビッグエンディアン形式にするUAPを作成する場合の注意事項」

COBOLソースプログラムの例

OpenTP1環境下で実行するUAPのCOBOLソースプログラムの記述例を知りたい

「2.11　COBOLソースプログラムのコーディング例」

DMLとSQLの両方を実行するUAPのCOBOLソースプログラムの記述例を知りたい

「2.12.3　COBOLソースプログラムのコーディング例（DMLとSQLの両方を実行するUAPの場合）」

性能向上，操作性向上

性能向上，操作性向上に関する次の機能を使用できるかどうかを知りたい

自動再接続機能

ブロック転送機能

複数接続機能

マルチスレッド対応

「2.14　性能向上，操作性向上に関する機能」

UAPのプリプロセス，コンパイル，リンケージ

プリプロセス

プリプロセスを実行する前の準備作業を知りたい

「3.1　プリプロセス，コンパイル，およびリンケージの実行環境の構築」

「3.3.1　プリプロセスを実行するための準備作業」

プリプロセスの実行方法を知りたい

「3.3.2　プリプロセスの実行例」

「3.5.2　プリプロセス，コンパイル，リンケージの実行例」

プリプロセスエラーが発生したときの対処方法を知りたい

「3.3.3　プリプロセスエラーが発生した場合の対処」

コンパイル，リンケージ

コンパイル，リンケージを実行する前の準備作業を知りたい

「3.1　プリプロセス，コンパイル，およびリンケージの実行環境の構築」

「3.4.1　コンパイルおよびリンケージを実行するための準備作業」

コンパイル，リンケージの実行方法を知りたい

「3.4.2　ccbl2002コマンドの指定形式」

「3.4.3　コンパイルおよびリンケージの実行例」

「3.5.2　プリプロセス，コンパイル，リンケージの実行例」

コンパイルエラーまたはリンケージエラーが発生したときの対処方法を知りたい

「3.4.4　コンパイルエラーまたはリンケージエラーが発生した場合の対処」

UAPの実行環境の構築（HiRDBクライアントの環境設定）

インストール，環境設定方法

HiRDBクライアントの環境設定の方法を知りたい

「4.1　HiRDBクライアントの環境設定」

クライアント環境定義

クライアント環境定義に指定するオペランドを知りたい

「4.1.3　クライアント環境定義の設定」

UAPのテスト，運用，保守

UAPの実行環境

テスト環境から本番環境にUAPを移行する手順を知りたい

「4.3　テスト環境から本番環境へのUAPの移行」

UAPの実行

UAPの実行時に設定する環境変数，およびクライアント環境定義について知りたい

「4.1.2　環境変数の設定」

「4.1.3　クライアント環境定義の設定」

UAPの実行方法を知りたい

「5.1　UAPの実行」

UAPの再プリプロセス

UAPの再プリプロセスが必要となるケースを知りたい

「5.2　UAPの再プリプロセス，再コンパイル，再リンケージが必要なケース」

トラブルシュート

UAPに障害が発生した場合に，障害要因を調査するために使用できる機能について知りたい

「5.3　UAPの障害対策」

2　UAPの作成

この章では，DMLによるSDBデータベースにアクセスする部分のCOBOLソースプログラムの作成方法について説明します。

2.1　COBOLソースプログラムの基本構成

COBOLソースプログラム中にDMLを記述してSDBデータベースにアクセスする場合，データ部でアクセス対象のSDBデータベース名の指定と埋込み変数の宣言を行い，手続き部にDMLを記述します。SDBデータベースにアクセスする部分のCOBOLソースプログラムの基本構成を次の図に示します。

図2‒1　SDBデータベースにアクセスする部分のCOBOLソースプログラムの基本構成

上記の図で示している見出し部，環境部，データ部，手続き部，およびプログラム終わり見出しについて説明します。

2.1.1　見出し部（IDENTIFICATION DIVISION）

見出し部には，COBOLソースプログラムの見出しとなる情報を記述します。見出し部の記述規則については，マニュアル「COBOL85 言語」の「見出し部」を参照してください。

「IDENTIFICATION」を「ID」と省略できます。

(1)　プログラム名段落の見出し（PROGRAM-ID.）

「PROGRAM-ID.」をプログラム名段落の見出しとして記述します。

プログラム名には，数字，または下線で始まるプログラム名を指定できません。

2.1.2　環境部（ENVIRONMENT DIVISION）

環境部には，構成節と入出力節を記述します。環境部の記述規則については，マニュアル「COBOL85 言語」の「環境部」を参照してください。

2.1.3　データ部（DATA DIVISION）

データ部には次に示す節を指定します。

SDBデータベース節（SDB-DATABASE SECTION）

作業場所節（WORKING-STORAGE SECTION）

連絡節（LINKAGE SECTION）

(1)　SDBデータベース節（SDB-DATABASE SECTION）

この節には，アクセス対象のSDBデータベース名などを記述します。SDBデータベース節の記述規則については，「2.3　SDBデータベース節の記述」を参照してください。

(2)　作業場所節（WORKING-STORAGE SECTION）

この節では，DML中に記述する埋込み変数を宣言します。埋込み変数の宣言は，LINKAGE SECTION（連絡節）でも行うことができます。

埋込み変数の宣言方法については，「2.4　埋込み変数の宣言」を参照してください。

作業場所節の記述規則については，マニュアル「COBOL85 言語」の「データ部」の「作業場所節」を参照してください。

(3)　連絡節（LINKAGE SECTION）

この節では，DML中に記述する埋込み変数を宣言します。埋込み変数の宣言は，連絡節か作業場所節のどちらかで行ってください。

連絡節の記述規則については，マニュアル「COBOL85 言語」の「データ部」の「連絡節」を参照してください。

(4)　埋込み変数のデータ記述項

埋込み変数，埋込み変数の下位項目として使用する変数のデータ記述には，次に示すデータ記述項が指定できます。そのほかのデータ記述項を指定した変数は埋込み変数として使用できません。そのほかの埋込み変数についての記述規則については，「2.4.2(4)　埋込み変数の規則」を参照してください。

レベル番号
　　┌データ名　　　┐
　　┤　　　　　　　├
　　└ＦＩＬＬＥＲ句┘
　　〔ＲＥＤＥＦＩＮＥＳ句〕
　　┌〔ＥＸＴＥＲＮＡＬ句〕　　　　┐
　　│〔ＧＬＯＢＡＬ句〕　　　　　　│
　　│〔ＰＩＣＴＵＲＥ句〕　　　　　│
　　┤〔ＵＳＡＧＥ句〕　　　　　　　├
　　│〔ＯＣＣＵＲＳ句〕　　　　　　│
　　│〔ＳＹＮＣＨＲＯＮＩＺＥＤ句〕│
　　└〔ＶＡＬＵＥ句〕　　　　　　　┘
　　.

項番

データ記述項

指定内容

1

レベル番号

01〜49（集団項目）または77（独立項目）

2

データ名

｛データ名｜FILLER｝

埋込み変数名を指定します。

データ名は30文字以下の名前が指定できます。※1

FILLERは埋込み変数の名前としては使用できません。下位項目のデータ名には指定できます。

数字，または下線で始まるデータ名は指定できません。

3

REDEFINES句

REDEFINES データ名

データ名は30文字以下の名前が指定できます。※1

埋込み変数または埋込み変数の下位項目に指定できます。

4

EXTERNAL句

EXTERNAL

補助語のISは指定できません。

5

GLOBAL句

GLOBAL

補助語のISは指定できません。

6

PICTURE句

「表2-3　DMLのデータ型とCOBOL言語のデータ記述項の対応」のレコード型の構成要素のデータ型に対応するデータ記述に記載されている記述以外は指定できません。

PICTURE句に指定する文字列は30バイトまでです。

7

USAGE句

「表2-3　DMLのデータ型とCOBOL言語のデータ記述項の対応」のレコード型の構成要素のデータ型に対応するデータ記述に記載されている記述以外は指定できません。

8

OCCURS句

「表2-4　データ記述項の句の記述形式」に記載されている記述以外は指定できません。

9

SYNCHRONIZED句

｛SYNCHRONIZED｜SYNC｝

埋込み変数が独立項目（レベル番号77）の場合だけ指定できます。

LEFT，RIGHTの指定はできません。

10

VALUE句

VALUE 〔IS〕 定数

次の定数を指定できます。

文字定数※2，※3

数字定数※2

表意定数※4

16進文字定数※2

注※1

DMLプリプロセサ（pdsdbcbl）は，名前の最大長を60バイトとしてチェックします。

注※2

ポストソースのコンパイルに使用するCOBOLコンパイラで指定できる長さ・桁数で指定してください。

注※3

文字列を囲む記号には，アポストロフィ（ ' ），引用符（ " ）のどちらも使用できます。

注※4

記号文字を指定した表意定数は指定できません。

(5)　埋込み変数以外のデータ記述項

埋込み変数以外のデータ記述項には，数字，または下線で始まるデータ名は指定できません。

(6)　COPY文

COPY文は，次の構文で記述します。

COPY文を使用することで，登録集原文をCOBOLソースプログラムに取り込むことができます。

　　　　　　　　　　　┌ＯＦ┐
　ＣＯＰＹ　原文名　〔┤　　├　登録集名〕　〔ＳＵＰＰＲＥＳＳ〕.
　　　　　　　　　　　└ＩＮ┘

次に示す節に記述された構文が，COPY文として解析されます。

作業場所節（WORKING-STORAGE SECTION）

連絡節（LINKAGE SECTION）

上記の節に記述されたCOPY文が，登録集原文内に入れ子の形で記述されている場合，そのCOPY文も解析対象となります。

COPY文の入れ子の形については，「2.10.7　登録集原文の制限」の「図2-10　COPY文の入れ子のレベルの数え方」を参照してください。

COPY文の記述規則については，COBOLの仕様に従います。ただし，HiRDB/SDでの記述規則でCOBOLの仕様と異なる点があります。COBOLの仕様と異なる点については，次の表を参照してください。

表2‒1　COPY文の記述規則およびCOBOLの仕様と異なる点

項番

オペランド

指定内容

1

原文名

登録集原文が登録されているファイルの名称を，拡張子を付けないで指定します。

30文字以下の文字列で指定します。※2

次の文字で始まる原文名は指定できません。

数字（0〜9）

下線（_）

英小文字は使用できません。

登録集原文のファイルが登録されているディレクトリ，およびファイルの検索順位は次のとおりです。そのため，次に示すどれかのファイルに登録しておいてください。

ディレクトリの検索順位※1

環境変数PDCBLLIBに設定したディレクトリ（ディレクトリは絶対パスで指定します※2，※3）

カレントディレクトリ

ファイルの検索順位※1

ファイル名.cbl

ファイル名.CBL

プリプロセス時とコンパイル時で，参照する登録集原文を一致させる必要があります。そのため，上記で登録した登録集原文と同じファイルを，コンパイル時に登録集原文を検索するディレクトリに格納しておいてください。

コンパイル時に登録集原文を検索するディレクトリについては，マニュアル「COBOL85 使用の手引」の「登録集原文の使用方法」を参照してください。

COPY文の入れ子は最大10レベルまで記述できます。※4

登録集原文は，COBOLの固定形式正書法で記述してください。

2

登録集名

｛OF｜IN｝ 登録集名

任意の登録集名を指定します。

なお，プリプロセス時は，登録集名の指定に関係なく，次に示す順位でディレクトリが検索されます。

環境変数PDCBLLIBに設定したディレクトリ

カレントディレクトリ

3

SUPPRESS

SUPPRESS

原始プログラムの出力印刷時に，該当するCOPY文に複写される原文の印刷を抑止する場合に指定します。

注※1

登録集原文のファイルの検索順位の方が，ディレクトリの検索順位より優先されます。

（例）

登録集原文名：LIB1

環境変数PDCBLLIBに設定したディレクトリ：/USER/A:/USER/B

カレントディレクトリ：C

この場合，次の順序で登録集原文名が検索されます。

検索順序

検索時に使用するファイル名

検索対象ディレクトリ

1

LIB1.cbl

/USER/A

2

LIB1.cbl

/USER/B

3

LIB1.cbl

C

4

LIB1.CBL

/USER/A

5

LIB1.CBL

/USER/B

6

LIB1.CBL

C

注※2

登録集原文名長と，環境変数PDCBLLIBで指定したディレクトリ名の最大長の合計が，1,018バイト以下になるように指定してください。1,018バイトを超えるとエラーになります。

注※3

環境変数PDCBLLIBで指定するディレクトリ名の末尾にスラッシュ（/）を記述しないでください。記述した場合，登録集原文ファイルのオープン時にエラーになるおそれがあります。

注※4

UAPソースファイルに記述したCOPY文で直接展開する登録集原文内に記述したCOPY文をレベル1と数えます。

COPY文の入れ子のレベルの数え方の詳細については，「2.10.7　登録集原文の制限」の「図2-10　COPY文の入れ子のレベルの数え方」を参照してください。

2.1.4　手続き部（PROCEDURE DIVISION）

手続き部には，プログラムの処理を記述します。手続き部にDMLを記述してSDBデータベースにアクセスすることができます。手続き部の記述規則については，マニュアル「COBOL85 言語」の「手続き部」を参照してください。

手続き部に記述する，SDBデータベースにアクセスする部分のプログラムの処理の流れの例を次の図に示します。

図2‒2　SDBデータベースにアクセスする部分のプログラムの処理の流れの例

［説明］

DMLによるレコードの操作

DMLを記述して，レコードに対する操作を実行します。DMLによるレコードに対する操作方法の詳細については，次の個所を参照してください。

「2.5　DMLによるレコードの検索」

「2.6　DMLによるレコードの更新，格納，または削除」

DMLは，DML先頭子とDML終了子で囲む必要があります。

EXEC DML（DML先頭子）

DML先頭子は，DMLの始まりを示します。

END-DML（DML終了子）

DML終了子は，DMLの終わりを示します。

DMLの実行結果の判定

次の情報がDMLの実行結果として，SQL連絡領域（SQLCA）に返されます。返された情報を基にDMLの実行結果の判定処理を行います。

SQLCODE（リターンコード）

SQLWARN0〜SQLWARNF（警告情報）

DMLの実行結果の判定処理の詳細については，「2.7　DMLの実行結果の判定処理」を参照してください。

トランザクションのコミット，またはトランザクションの取り消し

DMLの実行結果の判定に従って，トランザクションが更新したレコードの内容を有効にするか，または取り消します。トランザクションのコミット，または取り消しについては，「2.8　トランザクション制御」を参照してください。

2.1.5　プログラム終わり見出し（END PROGRAM）

「END PROGRAM」をプログラム終わり見出しとして記述します。

プログラム名には，数字，または下線で始まるプログラム名を指定できません。

2.2　COBOLソースプログラムを作成する際の考慮点

SDBデータベースにアクセスする部分のCOBOLソースプログラムを作成する際の考慮点を次に示します。

COBOLソースプログラム中のデータ部のSDBデータベース節に，アクセス対象のSDBデータベース名を記述する必要があります。次に示す理由のため，アクセス対象のSDBデータベースごとにUAPソースファイルを分けることを推奨します。

理由

COBOLソースプログラム中に記述しているSDBデータベースの定義を変更した場合，UAPの再プリプロセスと再コンパイルが必要になります。再コンパイルをするとオブジェクトが変わるため，オブジェクトが変わった部分のテストを実施する必要があります。テストを実施する影響範囲を限定するために，アクセス対象のSDBデータベースごとにUAPソースファイルを分けることを推奨します。

2.3　SDBデータベース節の記述

COBOLソースプログラムの主プログラム部分のデータ部に，SDBデータベース節を記述します。SDBデータベース節には，UAPがアクセスするSDBデータベースの名称と，DMLを使用してアクセスしたレコードのレコード型名とレコード長を受け取る埋込み変数を記述します。

2.3.1　SDBデータベース節の記述例

SDBデータベース節の記述例を次に示します。

記述例

SDB-DATABASE SECTION.                ...1
  SDB            DATABASE01          ...2
  RECORD NAME    RECNAME             ...3
  RECORD LENGTH  RECLENGTH           ...4
.                                    ...5

［説明］

SDBデータベース節の開始を宣言します。

UAPがアクセスするSDBデータベースの名称を指定します。この例では，DATABASE01を指定しています。

FETCH文，FIND文，またはGET文で操作したレコードのレコード名を受け取る埋込み変数の名称を指定します。この例では，RECNAMEを指定しています。

FETCH文，MODIFY文，STORE文，またはGET文で操作したレコードのレコード長を受け取る埋込み変数の名称を指定します。この例では，RECLENGTHを指定しています。

SDBデータベース節の終了を示す終止符を指定します。

2.3.2　SDBデータベース節の記述内容と構文規則

SDBデータベース節に記述する内容とその構文規則を説明します。

形式

SDB-DATABASE SECTION.
   SDB SDBデータベース名〔,SDBデータベース名〕…
 〔RECORD NAME 埋込み変数〕
 〔RECORD LENGTH 埋込み変数〕
  .（終止符）

SDB-DATABASE SECTION.

SDBデータベース節の開始を宣言します。

SDB-DATABA SESECTION.は1行に記述してください。複数行にわたって記述した場合，SDBデータベース節として認識されません。

SDB SDBデータベース名〔,SDBデータベース名〕…

〜＜識別子＞((1〜30文字))

UAPがアクセスするSDBデータベースの名称を指定します。

SDBデータベース名は，最大64個指定できます。

注意事項

SDBデータベース名に英小文字がある場合は，SDBデータベース名を引用符（"）で囲んでください。引用符で囲まない場合，SDBデータベース名はすべて英大文字と見なされます。例えば，SDBデータベース名に「Database01」を指定した場合，「DATABASE01」を指定したと見なされます。

SDBデータベース名がpdsdbcblコマンドの予約語に該当する場合は，SDBデータベース名を引用符（"）で囲んでください。pdsdbcblコマンドの予約語は，pdsdbcblコマンドの機能拡張によって追加されることがあります。そのため，SDBデータベース名は予約語に該当しない場合でも，あらかじめ引用符で囲んでおくことを推奨します。

次のどちらかの条件を満たす場合，「2.10.9　SDBデータベースの特定規則」で説明している規則に従って，定義情報を参照するSDBデータベースが決まります。よって，SDBデータベース名の指定順序に注意が必要です。

・DMLに指定したレコード名と同一のレコード型名が，複数のSDBデータベースに定義されている場合

・DMLに指定した親子集合型名と同一の親子集合型名が，複数のSDBデータベースに定義されている場合

また，「2.10.9　SDBデータベースの特定規則」で説明しているように，異なるSDBデータベースに定義された同一名称のレコード型は，1つのUAPソースファイルで同時に操作できません。親子集合型も同様に，DMLにレコード名と同時に指定する場合を除いて，異なるSDBデータベースに定義された同一名称の親子集合型は，1つのUAPソースファイルで同時に操作できません。

SDBデータベース名の指定規則については，マニュアル「HiRDB 構造型データベース機能」の「HiRDB/SD定義ユティリティ（pdsdbdef）」の「名前の規則」を参照してください。

pdsdbcblコマンドの予約語については，マニュアル「HiRDB 構造型データベース機能」の「pdsdbcblコマンドの予約語」を参照してください。

RECORD NAME 埋込み変数

〜＜識別子＞((1〜30文字))

FETCH文，FIND文，またはGET文で操作したレコードのレコード型名を受け取る埋込み変数を指定します。FETCH文，FIND文，またはGET文で操作したレコードのレコード型名を受け取る場合にこのオプションを指定してください。

留意事項を次に示します。

レコード型名が返されるのは，「SQLCODE≧0かつSQLCODE≠100」のときに限ります。「SQLCODE＜0またはSQLCODE＝100」の場合は，埋込み変数に空白が返されます。

SQLCODEについては，「2.7.2　SQLCODEの値と意味」を参照してください。

埋込み変数に付ける名前の規則については，マニュアル「COBOL85 言語」の「利用者語」を参照してください。ただし，数字，または下線で始まる名前は指定できません。

RECORD LENGTH 埋込み変数

〜＜識別子＞((1〜30文字))

FETCH文，MODIFY文，STORE文，またはGET文で操作したレコードのレコード長を受け取る埋込み変数を指定します。FETCH文，MODIFY文，STORE文，またはGET文で操作したレコードのレコード長を受け取る場合にこのオプションを指定してください。

留意事項を次に示します。

レコード長が返されるのは，「SQLCODE≧0かつSQLCODE≠100」のときに限ります。「SQLCODE＜0またはSQLCODE＝100」の場合は，埋込み変数に0が返されます。

SQLCODEについては，「2.7.2　SQLCODEの値と意味」を参照してください。

埋込み変数に付ける名前の規則については，マニュアル「COBOL85 言語」の「利用者語」を参照してください。ただし，数字，または下線で始まる名前は指定できません。

．（終止符）

SDBデータベース節の終了を示す終止符を指定します。

注意事項

SDBデータベース節は，主プログラム部分のデータ部に記述します。

SDBデータベース節は，データ部のほかの節より先に記述してください。

SDBデータベース節を記述した行に，ほかの命令を記述しないでください。

SDBデータベース節は第8欄から第72欄までの間に記述してください。字句の途中で改行する場合は，COBOLの行のつなぎの規則に従ってください。SDBデータベース名を引用符で囲む場合は，COBOLの文字列定数の行のつなぎの規則に従ってください。

2.3.3　SDBデータベース節で指定する埋込み変数の宣言

SDBデータベース節のRECORD NAMEおよびRECORD LENGTHで指定する埋込み変数を，主プログラムの作業場所節で宣言する必要があります。作業場所節以外で宣言した場合，動作は保証されません。

SDBデータベース節のRECORD NAMEおよびRECORD LENGTHで指定する埋込み変数と，COBOL言語のデータ記述項の対応を次の表に示します。

表2‒2　SDBデータベース節で指定する埋込み変数と，COBOL言語のデータ記述項の対応

SDBデータベース節で指定する埋込み変数

COBOL言語のデータ記述項

項目の記述

RECORD NAMEに指定する埋込み変数

L1 基本項目名※

　　PICTURE X(30)

　〔〔USAGE〕 DISPLAY〕

基本項目

独立項目

RECORD LENGTHに指定する埋込み変数

INTEGER型に対応する埋込み変数を宣言します。INTEGER型のCOBOL言語のデータ記述項については，「表2-3　DMLのデータ型とCOBOL言語のデータ記述項の対応」を参照してください。

（凡例）

L1：レベル番号01〜49，または77

注※

基本項目名は，60バイト以内で，COBOLコンパイラで使用できる名称にしてください。

SDBデータベース節で指定する埋込み変数の宣言例を次に示します。

SDBデータベース節の記述例（データ部のSDBデータベース節）

SDB-DATABASE SECTION.
  SDB             DATABASE01
  RECORD NAME     RECNAME
  RECORD LENGTH   RECLENGTH
.

埋込み変数の宣言例（データ部の作業場所節）

WORKING-STORAGE SECTION.

 77  RECNAME           PIC X(30)      VALUE SPACE.
 77  RECLENGTH         PIC S9(8) COMP VALUE ZERO.

SDBデータベース節のRECORD NAMEおよびRECORD LENGTHで指定する埋込み変数の使用例については，「2.4.3(5)　SDBデータベース節で指定する埋込み変数の使用例」を参照してください。

注意事項

プログラムにDMLを記述する場合は，SDBデータベース節で指定した埋込み変数のデータ記述項にGLOBAL句を指定して埋込み変数の名前を大域名にしてください。このとき，DMLを実行する副プログラムから主プログラムまでの間に，より優先順位が高い同一名称のデータ項目がないようにしてください。例を次に示します。

2.4　埋込み変数の宣言

DML中に記述する埋込み変数の宣言方法と，埋込み変数の使用方法について説明します。

2.4.1　埋込み変数とは

埋込み変数とは，UAPとHiRDB/SDの間で，DMLを使用して値の受け渡しをする際に使用する変数です。埋込み変数は，次の用途で使用します。

DML中に条件値を指定する際に埋込み変数を使用する

DML中に更新値を指定する際に埋込み変数を使用する

SDBデータベースの検索結果のレコード実現値を受け取る際に埋込み変数を使用する

レコード名を受け取る際（FETCH文，FIND文，またはGET文の正常終了時）に埋込み変数を使用する

レコード長を受け取る際（FETCH文，MODIFY文，STORE文，またはGET文の正常終了時）に埋込み変数を使用する

埋込み変数の使用例を次に示します。

EXEC DML
  MODIFY "REC01" FROM :REC01_DATA
END-DML.

［説明］

上記は，REC01のレコードのレコード実現値をMODIFY文で更新している例です。MODIFY文中に記述しているREC01_DATAが埋込み変数です。

DML中に埋込み変数を指定する場合，「:埋込み変数」の形式で指定します。指定形式の詳細については，マニュアル「HiRDB 構造型データベース機能」の「DMLリファレンス」の「埋込み変数」を参照してください。

2.4.2　埋込み変数の宣言方法

DML中に記述する埋込み変数は，データ部の次のどちらかの節で宣言する必要があります。

作業場所節（WORKING-STORAGE SECTION）

連絡節（LINKAGE SECTION）

上記以外の節で宣言した変数は，埋込み変数として使用できません。

(1)　埋込み変数の宣言例

埋込み変数はレコード型，構成要素のデータ型に合わせて宣言します。埋込み変数の宣言例を次に示します。

レコード型の定義

RECORD FMBDT_ROOT
  2 DBKEY
   3  KEYDATA1           XCHARACTER  1  TYPE  K,L
  2  CHR_L01             CHARACTER   1  TYPE  U,D
  2  CHR_L30             CHARACTER  30  TYPE  U,D
  2  XCHR_L01            XCHARACTER  1  TYPE  U,D
  2  XCHR_L30            XCHARACTER 30  TYPE  U,D
  2  PACK_38_0           PACKED 38,0    TYPE  U,D
  2  PACK_10_5           PACKED 10,5    TYPE  U,D
  2  PACK_0_38           PACKED 0,38    TYPE  U,D
  2  INT                 INTEGER        TYPE  U,D
  2  SINT                SMALLINT       TYPE  U,D
RECORD FMBDT_CHILD
  2  KEYDATA1            XCHARACTER 1   TYPE  K,L
  2  DBKEY               INTEGER        TYPE  K,N
  2  CHR_L01             CHARACTER   1  TYPE  U,D
  2  CHR_L30             CHARACTER  30  TYPE  U,D
  2  XCHR_L01            XCHARACTER  1  TYPE  U,D
  2  XCHR_L30            XCHARACTER 30  TYPE  U,D
  2  PACK_38_0           PACKED 38,0    TYPE  U,D
  2  PACK_10_5           PACKED 10,5    TYPE  U,D
  2  PACK_0_38           PACKED 0,38    TYPE  U,D
  2  INT                 INTEGER        TYPE  U,D
  2  SINT                SMALLINT       TYPE  U,D

埋込み変数の宣言例

 WORKING-STORAGE SECTION.
*
 77  RECNAME            PIC X(30)      VALUE SPACE.        ...1
 77  RECLENG            PIC S9(8) COMP VALUE ZERO.         ...2
*
 01  FMBDT_ROOT.                                           ...3
   02  PDBKEYRT.
     03  PKEYDATA1      PIC X          VALUE SPACE.
   02  PCHR_L01         PIC X          VALUE SPACE.
   02  PCHR_L30         PIC X(30)      VALUE SPACE.
   02  PXCHR_L01        PIC X          VALUE SPACE.
   02  PXCHR_L30        PIC X(30)      VALUE SPACE.
   02  PPACK_38_0       PIC S9(38)       COMP-3 VALUE 0.
   02  PPACK_10_5       PIC S9(10)V9(5)  COMP-3 VALUE 0.
   02  PPACK_0_38       PIC SV9(38)      COMP-3 VALUE 0.
   02  PINT             PIC S9(5)        COMP   VALUE 0.
   02  PSINT            PIC S9(1)        COMP   VALUE 0.
*
 01  FMBDT_CHILD.                                          ...4
   02  CKEYDATA1        PIC X          VALUE SPACE.
   02  CDBKEY           PIC S9(8)        COMP   VALUE 0.
   02  CCHR_L01         PIC X          VALUE SPACE.
   02  CCHR_L30         PIC X(30)      VALUE SPACE.
   02  CXCHR_L01        PIC X          VALUE SPACE.
   02  CXCHR_L30        PIC X(30)      VALUE SPACE.
   02  CPACK_38_0       PIC S9(38)       COMP-3 VALUE 0.
   02  CPACK_10_5       PIC S9(10)V9(5)  COMP-3 VALUE 0.
   02  CPACK_0_38       PIC SV9(38)      COMP-3 VALUE 0.
   02  CINT             PIC S9(9)        COMP   VALUE 0.
   02  CSINT            PIC S9(4)        COMP   VALUE 0.

［説明］

FETCH文，FIND文，またはGET文で操作したレコードのレコード名を受け取るための埋込み変数（RECNAME）を宣言します。

FETCH文，MODIFY文，STORE文，またはGET文で操作したレコードのレコード長を受け取るための埋込み変数（RECLENG）を宣言します。

レコード型FMBDT_ROOTとデータの受け渡しをする埋込み変数を宣言します。

レコード型FMBDT_CHILDとデータの受け渡しをする埋込み変数を宣言します。

COBOL言語のデータ記述項で埋込み変数を宣言します。データ記述項の指定形式および構文規則については，マニュアル「COBOL85 言語」の「データ記述項」を参照してください。

(2)　DMLのデータ型とCOBOL言語のデータ記述項の対応

埋込み変数を宣言する際は，埋込み変数のデータ型に合わせてデータ記述項を記述してください。埋込み変数のデータ型は，埋込み変数を使用するDMLのデータ型によって決まります。DMLのデータ型とは，レコード型の各構成要素のデータ型のことです。DMLのデータ型によって埋込み変数のデータ型が決まり，埋込み変数のデータ型に従って埋込み変数を宣言する際のデータ記述項を記述します。

DMLのデータ型とCOBOL言語のデータ記述項の対応を次の表に示します。

表2‒3　DMLのデータ型とCOBOL言語のデータ記述項の対応

DMLのデータ型

COBOL言語のデータ記述項

項目の種類

備考

CHARACTER n

L1 基本項目名

　　PICTURE X(n)

　〔〔USAGE〕 DISPLAY〕

基本項目

独立項目

1≦n≦30,000

XCHARACTER n

L1 基本項目名

　　PICTURE X(n)

　〔〔USAGE〕 DISPLAY〕

基本項目

独立項目

1≦n≦30,000

PACKED 〔DECIMAL FIXED〕 m〔,n〕

m＞0，かつn＞0の場合

L1 基本項目名

　　PICTURE S9(m)V9(n)

　〔USAGE〕

　　COMPUTATIONAL-3.

m＞0，かつn＝0の場合

L1 基本項目名

　　PICTURE S9(m)

　〔USAGE〕

　　COMPUTATIONAL-3.

m＝0の場合

L1 基本項目名

　　PICTURE SV9(n)

　〔USAGE〕

　　COMPUTATIONAL-3.

基本項目

独立項目

1≦m＋n≦38※1

SMALLINT

L1 基本項目名

　　PICTURE S9(n)

　　COMPUTATIONAL.※2

基本項目

独立項目

1≦n≦4

INTEGER

L1 基本項目名

　　PICTURE S9(n)

　　COMPUTATIONAL.※2

基本項目

独立項目

5≦n≦9

（凡例）

L1：レベル番号01〜49，または77

注※1

HiRDB/SDで使用可能な範囲です。埋込み変数として使用可能な範囲は，COBOLコンパイラの仕様によって決まります。

注※2

2進項目をビッグエンディアン形式にするUAPの場合，データ型がINTEGERまたはSMALLINTの埋込み変数を宣言するときは，COMPUTATIONAL-5またはCOMP-5を指定してください。

2進項目をビッグエンディアン形式にするUAPを作成する場合の注意事項については，「2.13　2進項目をビッグエンディアン形式にするUAPを作成する場合の注意事項」を参照してください。

記述規則

埋込み変数を宣言する際のデータ記述項の句は，次の表に示す形式で記述してください。

表2‒4　データ記述項の句の記述形式

データ記述項の句の記述形式

左記以外の記述形式

PICTURE

PIC

COMPUTATIONAL

COMP

COMPUTATIONAL-n

COMP-n

9(n)

999....9（n個の9の並び）

X(n)

XXX....X（n個のXの並び）

OCCURS n TIMES

OCCURS 1 TO n TIMES

OCCURS 1 TO n

OCCURS n

(3)　複数のレコード型の構成要素に対応するデータ記述項

レコード型や，複数のレコード型の構成要素から成る集団項目に対応する埋込み変数は，対象となる各レコード型の構成要素に対応する基本項目を持った集団項目で宣言します。埋込み変数の宣言例を次の図に示します。

図2‒3　ルートレコードのレコード型とレコード実現値の受け渡しの際に使用する埋込み変数の宣言例

図2‒4　子レコードのレコード型とレコード実現値の受け渡しの際に使用する埋込み変数の宣言例

記述規則

埋込み変数に使用する集団項目は，この埋込み変数下の階層構造，基本項目のデータ型およびデータ長を，対応するレコード型，構成要素と一致させてください。なお，埋込み変数の長さに対応する，次のSDBデータベース定義については，HiRDB/SDがチェックします。

・レコード長

・シーケンシャルインデクスの構成要素の合計長

集団項目を構成する基本項目のデータ記述については，「2.1.3　データ部（DATA DIVISION）」の「埋込み変数のデータ記述項」を参照してください。

埋込み変数に使用する集団項目は，ほかの集団項目の下位項目であってもかまいません。

レベル番号，変数名は一致していなくてもかまいません。埋込み変数の下位項目については，変数名にFILLERを指定できます。

(4)　埋込み変数の規則

埋込み変数の規則を次に示します。

埋込み変数は，次のどちらかの節で宣言してください。

作業場所節（WORKING-STORAGE SECTION）

連絡節（LINKAGE SECTION）

上記以外の個所で宣言した変数を埋込み変数として使用しないでください。

プログラムを入れ子で記述している場合，外側のプログラムで宣言した埋込み変数を，内側のプログラムに記述したDMLで使用するときは，埋込み変数の宣言にGLOBAL句を指定してください。

レベル番号に66は指定できません。

レベル番号に88は指定できません。

埋込み変数のデータ記述項には，JUSTIFIED句およびBLANK WHEN ZERO句は指定できません。

SYNCHRONIZED句は独立項目（レベル番号77）にだけ指定できます。

FILLERは，埋込み変数として使用できません。ただし，下位項目にはFILLERを使用できます。

PICTURE句，USAGE句，およびOCCURS句は「表2-3　DMLのデータ型とCOBOL言語のデータ記述項の対応」のレコード型の構成要素のデータ型に対応するデータ記述に記載されている記述以外は指定できません。

PICTURE句を省略し，VALUE句だけを指定したデータ項目は，埋込み変数として使用できません。

REDEFINES句は，集団項目に従属する一つ目の下位項目には指定できません。REDEFINES句が指定された記述項が，そのほかのREDEFINES句の規則に従っているかはチェックされません。

埋込み変数の名称は，プログラム単位で一意にしてください。

埋込み変数にはOCCURS句を指定できません。ただし，埋込み変数の下位項目に指定することはできます。下位項目にOCCURS句を指定する場合，指定できる反復回数の最大値は4,000です。

COBOLの文の文法に誤りのある変数宣言は，埋込み変数に指定できません。

データ記述項に埋込み変数として指定できない項目は，指定できません。

集団項目を構成する基本項目のデータ長の合計は，レコード長の最大値（30,000バイト）を超えることはできません。

上記以外にも埋込み変数の規則があります。詳細については，マニュアル「HiRDB 構造型データベース機能」の「埋込み変数」を参照してください。

2.4.3　埋込み変数の使用例

埋込み変数の使用例を次に示します。

(1)　ルートレコードを検索する際に条件値の指定で埋込み変数を使用する例

ルートレコードを検索する際に，条件値の指定で埋込み変数を使用する例を説明します。

検索結果のレコード実現値を受け取る埋込み変数の使用例については，「(2)　検索結果のレコード実現値を取得する際に埋込み変数を使用する例」を参照してください。

レコード型（ルートレコード）の定義例

RECORD TENPO
  2 DBKEY                                            ...1
   3 TENPO_CD            XCHARACTER  1  TYPE  K,L    ...2
  2  TENPO_NAME          CHARACTER  30  TYPE  U,D

［説明］

ルートレコードのデータベースキーの集団項目

キーの条件の左辺に指定する構成要素です。

ルートレコードのデータベースキーの構成要素

埋込み変数の宣言例（データ部の作業場所節）

DATA  DIVISION.
WORKING-STORAGE  SECTION.
01  X_TENPO.                      ...1
  02  X_DBKEY.
    03  X_TENPO_CD   PIC X.
  02  X_TENPO_NAME   PIC X(30).
01  Y_DBKEY.                      ...2
  02  Y_TENPO_CD    PIC X.        ...3
01  Z_DBKEY.                      ...2
  02  Z_TENPO_CD    PIC X.        ...3

［説明］

検索対象のレコード型に対応する埋込み変数の集団項目を宣言します。

ルートレコードのデータベースキーの集団項目に対応する埋込み変数の集団項目を宣言します。

ルートレコードのデータベースキーの構成要素に対応する埋込み変数の基本項目を宣言します。

埋込み変数の使用例（手続き部）

PROCEDURE DIVISION.
MOVE  X'01'  TO  Y_TENPO_CD.       ...1

EXEC DML
  FETCH FIRST TENPO
    INTO :X_TENPO
    WHERE ("DBKEY" = :Y_DBKEY)     ...2
END-DML.

MOVE  X'02'  TO  Y_TENPO_CD.       ...3
MOVE  X'05'  TO  Z_TENPO_CD.       ...4
EXEC DML
  FETCH NEXT TENPO
INTO :X_TENPO
    WHERE ("DBKEY" >= :Y_DBKEY     ...5
      AND  "DBKEY" <= :Z_DBKEY)
END-DML.

［説明］

下線の個所が埋込み変数です。

検索するレコード実現値のデータベースキーを埋込み変数に設定します。

データベースキーが条件値に指定した埋込み変数と一致するレコード実現値をFETCH文で検索して，レコード実現値を取得しています。条件式の右辺に，条件値を設定した埋込み変数を指定します。

検索するレコード実現値の範囲の下限であるデータベースキーを埋込み変数に設定します。

検索するレコード実現値の範囲の上限であるデータベースキーを埋込み変数に設定します。

データベースキーが条件値に指定した2つの埋込み変数の範囲にあるレコード実現値をFETCH文で検索して，レコード実現値を取得しています。範囲を指定するそれぞれの条件式の右辺に，条件値を設定した埋込み変数を指定します。

(2)　検索結果のレコード実現値を取得する際に埋込み変数を使用する例

(a)　例1

FETCH文で検索結果のレコード実現値を取得する際に埋込み変数を使用する例を説明します。

レコード型（子レコード）の定義例

RECORD ZAIKO                                          ...1
  2  TENPO_CD            XCHARACTER  1  TYPE  K,L     ...2
  2  DBKEY               INTEGER        TYPE  K,N     ...3
  2  SCODE               CHARACTER   4  TYPE  U,D     ...4
  2  SNAME               CHARACTER  30  TYPE  U,D     ...4
  2  TANKA               INTEGER        TYPE  U,D     ...4
  2  ZSURYO              INTEGER        TYPE  U,D     ...4

［説明］

検索対象の子レコード

親レコードのデータベースキーの構成要素

子レコードのデータベースキー（一連番号）

ユーザデータの基本項目

埋込み変数の宣言例（データ部の作業場所節）

DATA  DIVISION.
WORKING-STORAGE  SECTION.

01  X_ZAIKO.                                ...1
  02  CH_TENPO_CD      PIC X.               ...2
  02  CH_DBKEY         PIC S9(8) COMP.      ...3
  02  SCODE            PIC X(4).            ...4
  02  SNAME            PIC X(30).           ...4
  02  TANKA            PIC S9(8) COMP.      ...4
  02  ZSURYO           PIC S9(8) COMP.      ...4

［説明］

検索対象のレコード型に対応する埋込み変数の集団項目を宣言します。

親レコードのデータベースキーの構成要素に対応する埋込み変数の基本項目を宣言します。

子レコードのデータベースキー（一連番号）に対応する埋込み変数の基本項目を宣言します。

子レコードのユーザデータに対応する埋込み変数の基本項目を宣言します。

埋込み変数の使用例（手続き部）

PROCEDURE DIVISION.

EXEC DML
  FETCH FIRST ZAIKO
    INTO :X_ZAIKO                ...1
    WITHIN TENPO_ZAIKO
END-DML.

［説明］

下線の個所が埋込み変数です。

FETCH文でレコードを検索して，レコード実現値を取得しています。FETCH文のINTO句に，レコード実現値を受け取る埋込み変数を指定します。

(b)　例2

GET文でレコード実現値を取得する際に埋込み変数を使用する例を説明します。

レコード型（子レコード）の定義例

RECORD ZAIKO                                          ...1
  2  TENPO_CD            XCHARACTER  1  TYPE  K,L     ...2
  2  DBKEY               INTEGER        TYPE  K,N     ...3
  2  SCODE               CHARACTER   4  TYPE  U,D     ...4
  2  SNAME               CHARACTER  30  TYPE  U,D     ...4
  2  TANKA               INTEGER        TYPE  U,D     ...4
  2  ZSURYO              INTEGER        TYPE  U,D     ...4

［説明］

検索対象の子レコード

親レコードのデータベースキーの構成要素

子レコードのデータベースキー（一連番号）

ユーザデータの基本項目

埋込み変数の宣言例（データ部の作業場所節）

DATA  DIVISION.
WORKING-STORAGE  SECTION.

01  X_ZAIKO.                                ...1
  02  CH_TENPO_CD      PIC X.               ...2
  02  CH_DBKEY         PIC S9(8) COMP.      ...3
  02  SCODE            PIC X(4).            ...4
  02  SNAME            PIC X(30).           ...4
  02  TANKA            PIC S9(8) COMP.      ...4
  02  ZSURYO           PIC S9(8) COMP.      ...4

［説明］

検索対象のレコード型に対応する埋込み変数の集団項目を宣言します。

親レコードのデータベースキーの構成要素に対応する埋込み変数の基本項目を宣言します。

子レコードのデータベースキー（一連番号）に対応する埋込み変数の基本項目を宣言します。

子レコードのユーザデータに対応する埋込み変数の基本項目を宣言します。

埋込み変数の使用例（手続き部）

PROCEDURE DIVISION.

EXEC DML
  FIND FIRST ZAIKO
    WITHIN TENPO_ZAIKO
END-DML.

EXEC DML
  GET ZAIKO
    INTO :X_ZAIKO                ...1
END-DML.

［説明］

下線の個所が埋込み変数です。

FIND文で位置づけたレコード実現値を，GET文で取得しています。GET文のINTO句に，レコード実現値を受け取る埋込み変数を指定します。

(3)　レコードの更新処理で埋込み変数を使用する例

レコードの更新処理で埋込み変数を使用する例を説明します。

レコード型（子レコード）の定義例

RECORD ZAIKO                                           ...1
  2  TENPO_CD            XCHARACTER  1  TYPE  K,L      ...2
  2  DBKEY               INTEGER        TYPE  K,N      ...3
  2  SCODE               CHARACTER   4  TYPE  U,D      ...4
  2  SNAME               CHARACTER  30  TYPE  U,D      ...4
  2  TANKA               INTEGER        TYPE  U,D      ...4
  2  ZSURYO              INTEGER        TYPE  U,D      ...4

［説明］

更新対象の子レコード

親レコードのデータベースキーの構成要素

子レコードのデータベースキー（一連番号）

ユーザデータの基本項目

埋込み変数の宣言例（データ部の作業場所節）

DATA  DIVISION.
WORKING-STORAGE  SECTION.

01  X_ZAIKO.                                  ...1
  02  CH_TENPO_CD      PIC X.                 ...2
  02  CH_DBKEY         PIC S9(8) COMP.        ...3
  02  SCODE            PIC X(4).              ...4
  02  SNAME            PIC X(30).             ...4
  02  TANKA            PIC S9(8) COMP.        ...4
  02  ZSURYO           PIC S9(8) COMP.        ...4

［説明］

更新対象のレコード型に対応する埋込み変数の集団項目を宣言します。

親レコードのデータベースキーの構成要素に対応する埋込み変数の基本項目を宣言します。

子レコードのデータベースキー（一連番号）に対応する埋込み変数の基本項目を宣言します。

子レコードのユーザデータに対応する埋込み変数の基本項目を宣言します。

埋込み変数の使用例（手続き部）

PROCEDURE DIVISION.

EXEC DML
  FETCH FOR UPDATE FIRST ZAIKO
    INTO :X_ZAIKO                    ...1
    WITHIN TENPO_ZAIKO
END-DML.

COMPUTE ZSURYO = ZSURYO + 1.         ...2

EXEC DML
  MODIFY ZAIKO FROM :X_ZAIKO         ...3
END-DML.

［説明］

下線の個所が埋込み変数です。

FETCH文で更新対象のレコード実現値を検索し，位置づけとレコード実現値の取得をしています。FETCH文で検索したレコード実現値を受け取るために，埋込み変数X_ZAIKOを指定します。

更新する構成要素に対応する埋込み変数の基本項目に，更新値を設定します。このとき，埋込み変数の下位項目ZSURYOを使用します。

MODIFY文で位置づけしたレコード実現値を更新しています。MODIFY文のFROM句の更新値に埋込み変数を指定します。

(4)　レコードの格納処理で埋込み変数を使用する例

レコードの格納処理で埋込み変数を使用する例を説明します。

レコード型の定義例

RECORD TENPO                                            ...1
  2 DBKEY
   3 TENPO_CD            XCHARACTER  1  TYPE  K,L       ...2
  2  TENPO_NAME          CHARACTER  30  TYPE  U,D       ...3
RECORD ZAIKO                                            ...4
  2  TENPO_CD            XCHARACTER  1  TYPE  K,L       ...5
  2  DBKEY               INTEGER        TYPE  K,N       ...5
  2  SCODE               CHARACTER   4  TYPE  U,D       ...5
  2  SNAME               CHARACTER  30  TYPE  U,D       ...5
  2  TANKA               INTEGER        TYPE  U,D       ...5
  2  ZSURYO              INTEGER        TYPE  U,D       ...5

［説明］

格納するルートレコードのレコード型の定義

ルートレコードのレコード型のデータベースキーの構成要素

ルートレコードのレコード型のユーザデータの構成要素

格納する子レコードのレコード型の宣言

子レコードのレコード型のユーザデータの構成要素

埋込み変数の宣言例（データ部の作業場所節）

DATA  DIVISION.
WORKING-STORAGE  SECTION.

01  X_TENPO.                                ...1
  02  X_DBKEY.
    03  X_TENPO_CD   PIC X.                 ...2
  02  X_TENPO_NAME   PIC X(30).             ...3
01  X_ZAIKO.                                ...4
  02  CH_TENPO_CD      PIC X.
  02  CH_DBKEY         PIC S9(8) COMP.
  02  SCODE            PIC X(4).            ...5
  02  SNAME            PIC X(30).           ...5
  02  TANKA            PIC S9(8) COMP.      ...5
  02  ZSURYO           PIC S9(8) COMP.      ...5

［説明］

格納するルートレコードのレコード型に対応する埋込み変数の集団項目を宣言します。

ルートレコードのデータベースキーの構成要素に対応する埋込み変数の基本項目を宣言します。

ルートレコードのユーザデータの構成要素に対応する埋込み変数の基本項目を宣言します。

格納する子レコードのレコード型に対応する埋込み変数の集団項目を宣言します。

子レコードのユーザデータに対応する埋込み変数の基本項目を宣言します。

埋込み変数の使用例（手続き部）

PROCEDURE DIVISION.
MOVE  X'06'  TO X_TENPO_CD                   ...1
MOVE  'TOTSUKA SHITEN' TO X_TENPO_NAME.      ...2

EXEC DML
  STORE TENPO FROM :X_TENPO                  ...3
END-DML.

MOVE  'A001'     TO SCODE.                   ...4
MOVE  'PEN CASE' TO SNAME.                   ...4
MOVE  800       TO TANKA.                    ...4
MOVE  20        TO ZSURYO.                   ...4

EXEC DML
  STORE ZAIKO FROM :X_ZAIKO                  ...5
END-DML.

［説明］

ルートレコードTENPOを格納後，子レコードZAIKOを格納します。下線の個所が埋込み変数です。

格納するルートレコード実現値のデータベースキーを，ルートレコードのデータベースキーの構成要素に対応する埋込み変数の基本項目に設定します。

格納するルートレコード実現値のユーザデータを，ルートレコードのユーザデータの構成要素に対応する埋込み変数の基本項目に設定します。

STORE文でルートレコードTENPOにレコード実現値を格納しています。STORE文のFROM句の格納値に埋込み変数を指定します。

格納する子レコード実現値のユーザデータを設定しています。子レコードのユーザデータの構成要素に対応する埋込み変数の基本項目に設定します。このとき，埋込み変数の下位項目SCODE，SNAME，〜を使用します。

STORE文で子レコードZAIKOにレコード実現値を格納しています。STORE文のFROM句の格納値に埋込み変数を指定します。

(5)　SDBデータベース節で指定する埋込み変数の使用例

SDBデータベース節で指定する次の埋込み変数を使用する例を説明します。

RECORD NAME句で指定する埋込み変数

FETCH文，FIND文，GET文の正常終了後にレコード型名を受け取ります。

RECORD LENGTH句で指定する埋込み変数

FETCH文，MODIFY文，STORE文，GET文の正常終了後にレコード長を受け取ります。

SDBデータベース節の宣言例

SDB-DATABASE  SECTION.
SDB DATABASE01
  RECORD NAME    RECNAME             ...1
  RECORD LENGTH  RECLENG             ...2
.

［説明］

FETCH文，FIND文，GET文の正常終了後にレコード型名を受け取る埋込み変数を，RECORD NAME句に指定します。

FETCH文，MODIFY文，STORE文，GET文の正常終了後にレコード長を受け取る埋込み変数を，RECORD LENGTH句に指定します。

埋込み変数の宣言例（主プログラムのデータ部の作業場所節）

DATA  DIVISION.
WORKING-STORAGE  SECTION.

01  RECNAME    PIC X(30) .           ...1
02  RECLENG    PIC S9(8) COMP.       ...2

［説明］

RECORD NAME句に指定した埋込み変数をCHARCTER(30)のデータ型で宣言します。

RECORD LENGTH句に指定した埋込み変数をINTEGERのデータ型で宣言します。

埋込み変数の使用例（手続き部）

PROCEDURE DIVISION.

EXEC DML
  FETCH FIRST TENPO INTO :X_TENPO
    WHERE ("DBKEY" = :Y_DBKEY)                     ...1
END-DML.
IF SQLCODE >= 0 AND SQLCODE NOT = 100              ...2
THEN
  DISPLAY 'FETCH RECORD NAME = "' RECNAME '"'      ...3
    UPON SYSOUT
  DISPLAY 'FETCH RECORD LENGTH = ' RECLENG         ...4
    UPON SYSOUT
ELSE
  DISPLAY SQLERRMC(1:SQLERRML) UPON SYSOUT
END-IF.

［説明］

上記は，FETCH文が正常終了した場合，FETCH文の対象としたレコード型のレコード型名とレコード長を参照する処理です。下線の個所が埋込み変数です。

FETCH文を実行します。

FETCH文が正常終了したかを判定します。

FETCH文が正常終了した場合に，埋込み変数に設定されたレコード型名を参照する処理を行います。

FETCH文が正常終了した場合に，埋込み変数に設定されたレコード長を参照する処理を行います。

2.5　DMLによるレコードの検索

DMLによるレコードの検索方法について説明します。

なお，ここでの説明は，マニュアル「HiRDB 構造型データベース機能」の「SDBデータベースの操作」の内容を理解していることを前提としています。

2.5.1　レコードの検索

DMLによる子レコードの検索方法について説明します。子レコードを検索する際の処理の流れを次の図に示します。

図2‒5　子レコードを検索する際の処理の流れ

［説明］

親レコードへの位置づけ

検索対象の子レコード実現値の親レコード実現値に，位置指示子を位置づけます。

FIND FIRST 親レコード名
     WHERE キーの条件

「親レコードへの位置づけ」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号160〜162の処理が該当します。

子レコードの検索

子レコード実現値を検索します。先頭の子レコード実現値から順に，検索対象の子レコード実現値が見つかるまでFETCHを行います。

1件目の子レコードの検索

FETCH FIRST 子レコード名   ←1件目の子レコードを検索します。
      INTO :埋込み変数A
      WITHIN 親子集合名

「1件目の子レコードの検索」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号305〜308の処理が該当します。

2件目以降の子レコードの検索

検索対象の子レコード実現値と埋込み変数Aの値が一致するまで検索を繰り返します。

FETCH NEXT 子レコード名    ←位置づけしている位置から，次のレコード実現値を検索します。
      INTO :埋込み変数A
      WITHIN 親子集合名

「2件目以降の子レコードの検索」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号319〜322の処理が該当します。

FIND文およびFETCH文の記述形式および規則については，マニュアル「HiRDB 構造型データベース機能」の「操作系DML」を参照してください。

なお，レコードの検索は，FIND文でレコード実現値に位置づけを行い，そのあとにGET文でレコード実現値を取得することでも実現できます。GET文の記述形式および規則については，マニュアル「HiRDB 構造型データベース機能」の「操作系DML」を参照してください。

2.6　DMLによるレコードの更新，格納，または削除

DMLによるレコードの更新方法，格納方法，および削除方法について説明します。

なお，ここでの説明は，マニュアル「HiRDB 構造型データベース機能」の「SDBデータベースの操作」の内容を理解していることを前提としています。

2.6.1　レコードの更新

DMLによる子レコードの更新方法について説明します。子レコードを更新する際の処理の流れを次の図に示します。

図2‒6　子レコードを更新する際の処理の流れ

［説明］

親レコードへの位置づけ

更新対象の子レコード実現値の親レコード実現値に，位置指示子を位置づけます。

FIND FIRST 親レコード名
     WHERE キーの条件

「親レコードへの位置づけ」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号160〜162の処理が該当します。

子レコードの検索

更新指定（FOR UPDATE指定）で，更新対象の子レコード実現値を検索します。先頭の子レコード実現値から順に，更新対象の子レコード実現値が見つかるまで（更新対象の子レコード実現値と埋込み変数Aの値が一致するまで）FETCHを行います。

1件目の子レコードの検索

FETCH FOR UPDATE           ←更新目的であることを指定します。
      FIRST 子レコード名   ←1件目の子レコードを検索します。
      INTO :埋込み変数A
      WITHIN 親子集合名

「1件目の子レコードの検索」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号305〜308の処理が該当します。

2件目以降の子レコードの検索

更新対象の子レコード実現値と埋込み変数Aの値が一致するまで検索を繰り返します。

FETCH FOR UPDATE           ←更新目的であることを指定します。
      NEXT 子レコード名    ←位置づけしている位置から，次のレコード実現値を検索します。
      INTO :埋込み変数A
      WITHIN 親子集合名

「2件目以降の子レコードの検索」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号319〜322の処理が該当します。

子レコードの更新

埋込み変数Aに，更新後の子レコード実現値を格納します。そのあとに，MODIFY文を実行して，埋込み変数Aの値で子レコード実現値を更新します。

MODIFY 子レコード名 FROM :埋込み変数A

「子レコードの更新」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号193〜195の処理が該当します。

FIND文，FETCH文，MODIFY文の記述形式および規則については，マニュアル「HiRDB 構造型データベース機能」の「操作系DML」を参照してください。

2.6.2　レコードの格納

DMLによる子レコードの格納方法について説明します。子レコードを格納する際の処理の流れを次の図に示します。

図2‒7　子レコードを格納する際の処理の流れ

［説明］

親レコードへの位置づけ

格納対象の子レコード実現値の親レコード実現値に，位置指示子を位置づけます。

FIND FIRST 親レコード名
     WHERE キーの条件

「親レコードへの位置づけ」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号160〜162の処理が該当します。

子レコードの格納

埋込み変数Aに子レコード実現値を格納します。そのあとに，STORE文を実行して，埋込み変数Aの値を子レコードに格納します。

STORE 子レコード名 FROM :埋込み変数A

「子レコードの格納」の処理は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号219〜221の処理が該当します。

FIND文およびSTORE文の記述形式および規則については，マニュアル「HiRDB 構造型データベース機能」の「操作系DML」を参照してください。

2.6.3　レコードの削除

DMLによる子レコードの削除方法について説明します。子レコードを削除する際の処理の流れを次の図に示します。

図2‒8　子レコードを削除する際の処理の流れ

［説明］

親レコードへの位置づけ

削除対象の子レコード実現値の親レコード実現値に，位置指示子を位置づけます。

FIND FIRST 親レコード名
     WHERE キーの条件

「親レコードへの位置づけ」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号160〜162の処理が該当します。

子レコードの検索

更新指定（FOR UPDATE指定）で，削除対象の子レコード実現値を検索します。先頭の子レコード実現値から順に，削除対象の子レコード実現値が見つかるまでFETCHを行います。

1件目の子レコードの検索

FETCH FOR UPDATE           ←更新目的であることを指定します。
      FIRST 子レコード名   ←1件目の子レコードを検索します。
      INTO :埋込み変数A
      WITHIN 親子集合名

「1件目の子レコードの検索」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号305〜308の処理が該当します。

2件目以降の子レコードの検索

削除対象の子レコード実現値と埋込み変数Aの値が一致するまで検索を繰り返します。

FETCH FOR UPDATE           ←更新目的であることを指定します。
      NEXT 子レコード名    ←位置づけしている位置から，次のレコード実現値を検索します。
      INTO :埋込み変数A
      WITHIN 親子集合名

「2件目以降の子レコードの検索」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号319〜322の処理が該当します。

子レコードの削除

ERASE文を実行して，削除対象の子レコード実現値を削除します。

ERASE 子レコード名

「子レコードの削除」は，「2.11.2　コーディング例」に記載されているCOBOLソースプログラムの例の，行番号239〜241の処理が該当します。

FIND文，FETCH文，およびERASE文の記述形式および規則については，マニュアル「HiRDB 構造型データベース機能」の「操作系DML」を参照してください。

2.7　DMLの実行結果の判定処理

DMLの実行結果の判定処理について説明します。

2.7.1　DMLの実行結果の判定処理の例

次の情報がDMLの実行結果として，SQL連絡領域（SQLCA）に返されます。返された情報を基にDMLの実行結果の判定処理を行います。

SQLCODE（リターンコード）

SQLWARN0〜SQLWARNF（警告情報）

DMLの実行結果の判定処理の例

EXEC DML
  MODIFY ZAIKO FROM :ZAIKO             ...1
END-DML
IF SQLCODE < 0                         ...2
THEN
  MOVE 8 TO RETURN-CODE
ELSE
  CONTINUE
END-IF
IF SQLWARN0 = 'W' OR
  (SQLCODE > 0 AND SQLCODE NOT = 100)  ...3
THEN
  MOVE 4 TO RETURN-CODE
ELSE
  CONTINUE
END-IF

［説明］

レコード実現値を更新するDML（MODIFY文）を実行します。

DMLの実行結果の判定処理を行います。

SQLCODEが0未満の場合は，DMLがエラーとなっているため，エラー時の処理を行います。

SQLCODEが0以上の場合は，DMLが正常終了しているため，処理を続行します。

DMLの実行結果の判定処理を行います。

DMLが警告付きで正常終了した場合は，SQLCODEに100以外の正の値が返されるか，またはSQLWARN1〜SQLWARFに警告情報が返されます。SQLWARN1〜SQLWARNFに警告情報が返された場合は，SQLWARN0に'W'が返されます。

警告が発生していない場合は処理を続行してください。警告が発生している場合は，DMLに警告が発生したときの処理を行います。

COBOLソースプログラムのコーディング例については，次の個所を参照してください。コーディング例中に，DMLの実行結果の判定処理の例が記述されています。

「2.11　COBOLソースプログラムのコーディング例」

「2.12.3　COBOLソースプログラムのコーディング例（DMLとSQLの両方を実行するUAPの場合）」

なお，SQL連絡領域（SQLCA）は，宣言を収めた登録集原文のCOPY文がポストソースに展開されます。そのため，COBOLソースプログラム中にSQL連絡領域を宣言しないでください。

2.7.2　SQLCODEの値と意味

返却されるSQLCODEの値と意味について説明します。

(1)　SQLCODE＝0の場合

DMLが正常終了した場合，SQLCODEに0が返されます。

ただし，SQLWARN0に'W'が返された場合，警告付きの正常終了になります。この場合，警告情報がSQLWARN1〜SQLWARNFに返されるため，SQLWARN1〜SQLWARNFの値を確認してください。

SQLWARN0〜SQLWARNFについては，「2.7.4　SQL連絡領域の構成と内容」を参照してください。

(2)　SQLCODE＞0かつSQLCODE≠100の場合

DMLが警告付きで正常終了した場合，SQLCODEに正の値（100を除く）が返されます。この場合，警告情報がSQLWARN1〜SQLWARNFに返されるため，SQLWARN1〜SQLWARNFの値を確認してください。

(3)　SQLCODE=100の場合

位置づけるレコードがなくなった場合，SQLCODEに100が返されます。次の項目を判定する際に利用します。

FIND文で位置づけるレコードがなくなった

FETCH文で位置づけるレコードがなくなった

(4)　SQLCODE＜0の場合

DMLの処理でエラーが発生した場合，SQLCODEに負の値が返されます。

なお，DMLの処理でエラーが発生した際，暗黙的ロールバックが発生する場合と，暗黙的ロールバックが発生しない場合があります。暗黙的ロールバックが発生した場合は，SQLWARN0とSQLWARN6に'W'が返されます。

エラーが発生したDMLを特定したい場合は，SQLトレース情報を利用してください。SQLトレース情報については，マニュアル「HiRDB 構造型データベース機能」の「SQLトレース機能」を参照してください。

2.7.3　DMLのエラーを検出したときの対処方法

DMLのエラーの発生を示すSQLCODEが返却された場合，次の手順で対処します。

手順

リターンコードを出力または表示します。

リターンコードだけではエラーの内容が判別できない場合は，各コードの付加情報を表示または出力します。また，必要に応じて，エラーになったDML，またはエラーになったDMLを識別するための情報を表示します。

リターンコードの付加情報と参照先を次の表に示します。

表2‒5　リターンコードの付加情報と参照先

付加情報

参照先

SQLCODEに対応するメッセージ

SQL連絡領域中のSQLERRMLフィールド，およびSQLERRMCフィールドの内容

トランザクションを取り消します（ROLLBACK，またはUAPを異常終了させます）。

デッドロックによって暗黙的にロールバックされたUAPは次のようになります。

通常のUAPの場合

暗黙的にロールバックされると，次に実行したDMLまたはSQLが新たなトランザクション開始となります（ROLLBACK，またはDISCONNECTもできます）。

OLTP下のUAPの場合

暗黙的にロールバックされると，OLTP下のUAPからはDISCONNECT，またはROLLBACK以外は受け付けられません。また，OLTP環境でX/Openに従ったアプリケーションプログラムをクライアントとした場合に，実行したアプリケーションプログラムがデッドロックになったときもトランザクションの終了が必要です。

UAPの終了，またはトランザクションの開始（別のトランザクションの新規実行，または同じトランザクションの再実行）をします。

なお，同じトランザクションを再実行する場合，実行前にエラーの対策をしてください。エラーの原因が取り除かれない状態でトランザクションを再実行すると，無限ループになるおそれがあります。また，再実行しても同じエラーが発生する場合は，UAPの終了を考慮する必要があります。

2.7.4　SQL連絡領域の構成と内容

DMLを実行すると，HiRDB/SDはDMLが正常に実行されたかどうかを示す情報をUAPに返します。これらの情報を受け取るための領域をSQL連絡領域といいます。SQLCODE，SQLWARN1〜SQLWARNFは，SQL連絡領域に格納されます。

(1)　SQL連絡領域の構成

SQL連絡領域の構成を次の図に示します。

図2‒9　SQL連絡領域の構成

注

(　)内は領域の長さ（単位：バイト）を示しています。

SQLCABC，SQLCODE，およびSQLERRDの長さは，long型のサイズになります。

(2)　SQL連絡領域の内容

SQL連絡領域の内容については，マニュアル「HiRDB UAP開発ガイド」の「SQL連絡領域の構成と内容」の「SQL連絡領域の内容」を参照してください。

マニュアル「HiRDB UAP開発ガイド」の記載内容と異なる部分だけ，次の表に示します。

表2‒6　SQL連絡領域の内容

レベル番号※1

連絡領域名

データ型

長さ（バイト）

内容

2

SQLCODE

long

8

DMLの実行結果を示すSQLCODEが返される領域です。

2

SQLERRM

−

256

DMLの実行結果を示すメッセージの情報が返される領域です。

3

SQLERRML

short

2

SQLERRMC領域に返されるメッセージの長さが返される領域です。

3

SQLERRMC

char

254

SQLCODEに対応するメッセージが返される領域です。

SQLCODEとメッセージの対応については，マニュアル「HiRDB メッセージ」の「メッセージの記述形式」の「メッセージに関する注意事項」を参照してください。

2

SQLERRD

long

8×6

HiRDBの内部状態を示す領域で，データ型がlongの6個の配列です。

SQLERRD[0]：未使用

SQLERRD[1]：未使用

SQLERRD[2]：

SQLCODEの値が0，または正の場合：

SDBデータベース操作のアクセス件数※2

SQLCODEの値が負の場合：

この領域は使用しないでください。

SQLERRD[3]：システムが使用します。

SQLERRD[4]：システムが使用します。

SQLERRD[5]：未使用

（凡例）

−：該当しません。

注※1

レベル番号は，SQL連絡領域の包含関係を示しています。例えば，レベル番号1の連絡領域はレベル番号2の連絡領域で構成されることを示しています。

注※2

SDBデータベース操作のアクセス件数については，マニュアル「HiRDB 構造型データベース機能」の「監査証跡表の列に格納される情報についての留意事項（SDBデータベース操作イベントの場合）」の「SDBデータベース操作イベントのアクセス件数」の表を参照してください。

(3)　SQL連絡領域の展開

SQL連絡領域のデータ記述項は，pdsdbcblコマンドによるプリプロセスの際に，登録集原文のCOPY文がポストソースに自動的に出力されます。そのため，SQL連絡領域のデータ記述項を，COBOLソースプログラム中に記述する必要はありません。

登録集原文によって展開されるデータ記述項については，マニュアル「HiRDB UAP開発ガイド」の「SQL連絡領域の展開」を参照してください。

2.8　トランザクション制御

トランザクション制御については，マニュアル「HiRDB UAP開発ガイド」の「トランザクション制御」を参照してください。

なお，マニュアル「HiRDB UAP開発ガイド」の「トランザクション制御」をお読みいただく際，次のことに留意してください。

OpenTP1環境下で実行するUAPの場合

トランザクションの開始，トランザクションのコミット，およびトランザクションの取り消しは，OpenTP1のX/Openに準拠したAPIであるTXBEGIN，TXCOMMIT，TXROLLBACKを使用します。これらのAPIの文法の詳細については，マニュアル「OpenTP1 プログラム作成リファレンス COBOL言語編」の「X/Openに準拠したアプリケーションプログラミングインタフェース」を参照してください。

COBOLの実行可能ファイルとして実行するUAPの場合

トランザクション制御はSQLで行います。また，HiRDBサーバへの接続，およびHiRDBサーバからの切り離しもSQLで行います。詳細については，「2.12.2　DMLとSQLの両方を実行するUAPのトランザクション制御」を参照してください。

2.9　排他制御

HiRDB/SDでは，複数のUAP（トランザクション）がSDBデータベースに同時にアクセスしても，SDBデータベースの整合性を保つように排他制御を行っています。HiRDB/SDの排他制御については，マニュアル「HiRDB 構造型データベース機能」の「排他制御」を参照してください。

また，SDB用UAP環境定義を使用すると，UAPグループ（OpenTP1環境下のサービスグループ）単位に，UAPの目的に応じて排他の粒度と強さを制御することなどができます。なお，DMLでレコードを更新，格納，または削除する場合は，SDB用UAP環境定義を使用する必要があります。SDB用UAP環境定義については，マニュアル「HiRDB 構造型データベース機能」の「SDB用UAP環境定義」を参照してください。

2.10　COBOLソースプログラムの記述規則

COBOLソースプログラムの記述規則について説明します。

2.10.1　文字コードと改行コード

COBOLソースプログラムは，Shift-JIS漢字コードで記述してください。

改行は，LF（X'0A'）を使用してください。

区切り文字は，次のどれかを使用してください。

空白（X'20'）

タブ（X'09'）

タブは1文字で数えます。

全角空白（X'8140'）

■使用できる文字

COBOLソースプログラムを記述する際に使用できる文字を次の表に示します。

表2‒7　COBOLソースプログラムを記述する際に使用できる文字

種別

使用できる文字

半角文字

英大文字（A〜Z，¥，@，#）

英小文字（a〜ｚ）

数字（0〜9）

空白

下線文字（ _ ）

カタカナ文字

次に示す特殊記号

タブ（X'09'）

改行（X'0A'）

'!'

'"'

'%'

'&'

'''

'('

')'

'*'

'+'

','

'-'

'.'

'/'

':'

';'

'<'

'='

'>'

'?'

'['

']'

'^'

'|'

'`' ※

'{' ※

'}' ※

'~' ※

[図データ]※

[図データ]※

[図データ]※

全角文字

全角文字コードのすべての文字（外字を含みません）

注※

文字列定数または注釈行だけで使用できる文字です。

2.10.2　ソースプログラムの正書法

ソースプログラムの正書法について説明します。

COBOLソースプログラムは，固定形式正書法で記述します。

1UAPソースファイル中のCOBOLソースプログラムに記述できる行数は，最大999,999行です。

UAPソースファイルにコンパイルリスト出力制御（EJECT，SKIP1，SKIP2，SKIP3，またはTITLE）は記述できません。

2.10.3　翻訳単位（最外側のプログラム）

1UAPソースファイル中のCOBOLソースプログラムに記述できる埋込み型UAPの翻訳単位は1つです。

2.10.4　プログラムの入れ子の上限

プログラムの入れ子の上限について説明します。

プログラム中にプログラムを入れ子で記述できます。最大16階層のプログラムを入れ子で記述できます。

1UAPソースファイル中に記述できるプログラムの最大数は64個です。

2.10.5　名前の記述規則

名前の記述規則は，COBOLの規則に従います。ただし，次の規則があります。なお，ここでいう名前とは，埋込み変数の名前のことを意味しています。

名前の長さ

名前の最大長は60バイトです。ただし，COBOLコンパイラが定める名前の最大長以下にしてください。

文字の扱い

「全角の英字，数字，記号，カタカナ，空白」と「半角の英字，数字，記号，カタカナ，空白」は，異なる文字と見なされます。

使用できない名前

次のどれかの条件を満たす名前は，外部属性を持つため使用できません。

・大文字の「SQL」で始まる名前

・小文字の「p_」で始まる名前

・小文字の「pd」で始まる名前

pdsdbまたはPDSDBで始まる名前は使用できません。

DMLの予約語と同じ名前は使用できません。DMLの予約語については，マニュアル「HiRDB 構造型データベース機能」の「DMLの予約語」を参照してください。

pdsdbcblコマンドの予約語と同じ名前は使用できません。pdsdbcblコマンドの予約語については，マニュアル「HiRDB 構造型データベース機能」の「dsdbcblコマンドの予約語」を参照してください。

数字，または下線で始まる名前は使用できません。

2.10.6　宣言が必要な節

DMLを記述する場合に宣言が必要な節を次に示します。

DMLを記述する場合，UAPソースファイル中の主プログラムにSDBデータベース節の宣言をする必要があります。SDBデータベース節は，主プログラムのデータ部の先頭の節として宣言してください。

DMLを記述する場合，UAPソースファイル中の主プログラムとDMLを記述した副プログラムに作業場所節（WORKING-STORAGE SECTION）の宣言をする必要があります。

作業場所節の見出しを記述した行では，続けてほかの命令を記述しないでください。

2.10.7　登録集原文の制限

登録集原文の制限を次に示します。

登録集原文内には，次の記述はできません。

DML

SDBデータベース節

次の節に記述したCOPY文の登録集原文内に，埋込み変数の宣言を記述できます。埋込み変数の宣言以外の文を記述した場合の動作は保証しません。

作業場所節（WORKING-STORAGE SECTION）

連絡節（LINKAGE SECTION）

次の節に記述したCOPY文で，COPY文の入れ子は最大10レベルまで記述できます。

作業場所節（WORKING-STORAGE SECTION）

連絡節（LINKAGE SECTION）

COPY文の入れ子のレベルの数え方を次の図に示します。

図2‒10　COPY文の入れ子のレベルの数え方

1つの文をUAPソースファイル，または登録集原文ファイルに分けて記述することはできません。

登録集原文ファイルでの埋込み変数の宣言で，終止符の指定の前にファイルが終了している場合，当該埋込み変数の宣言はDMLプリプロセサ（pdsdbcbl）に認識されないため，埋込み変数に指定できません。

次の節に記述したCOPY文に，原文名定数指定，PREFIXING指定，SUFFIXING指定，およびREPLACING指定はできません。指定した場合は構文エラーになります。

作業場所節（WORKING-STORAGE SECTION）

連絡節（LINKAGE SECTION）

なお，上記の節に記述したCOPY文が，登録集原文内に入れ子の形で記述されている場合，そのCOPY文も対象となります。COPY文の入れ子の形については，「図2-10　COPY文の入れ子のレベルの数え方」を参照してください。

プリプロセス時とコンパイル時で，登録集原文の内容を変えないでください。

DML中にはCOPY文を記述できません。また，SDBデータベース節にもCOPY文は記述できません。記述した場合は構文エラーになります。

次のCOBOL命令の途中にCOPY文は記述できません。

見出し部の見出し（IDENTIFICATION DIVISION.）

プログラム名段落の見出し（PROGRAM-ID. プログラム名）

環境部の見出し（ENVIRONMENT DIVISION.）

構成節の見出し（CONFIGURATION SECTION.）

入出力節の見出し（INPUT-OUTPUT SECTION.）

データ部の見出し（DATA DIVISON.）

ファイル節の見出し（FILE SECTION.）

作業場所節の見出し（WORKING-STARAGE SECTION.）

連絡節の見出し（LINKAGE SECTION.）

手続き部の見出し（PROCEDURE DIVISION〜）

宣言部分の終わり指示（END DECLARATIVES.）

プログラムの終わりの見出し（END PROGRAM プログラム名.）

データ記述項（レベル番号から，終止符まで）

2.10.8　DMLの記述規則

DMLの記述規則を次に示します。

1UAPソースファイル中に記述できるDMLの数は，最大1,024です。

DMLは手続き部（PROCEDURE DIVISION）に記述します。

UAPソースファイル中にDMLの記述がなくてもかまいません。DMLの記述がない場合，pdsdbcblコマンドは作業場所節にSQL連絡領域の登録集原文と，ハンドラ用共通エリアとハンドラ用SD固有エリアの登録集原文のCOPY命令だけを展開します。

1UAPソースファイル中にDMLとSQLを混在して記述できません。

COBOLの命令とDMLは同一行に記述できません。記述した場合は，構文エラーになります。

DML先頭子は1行に記述してください。DML先頭子を複数行にわたって記述した場合，DML先頭子として認識されません。この場合，DMLはCOBOL命令に置換されません。

DMLはDML先頭子とDML終了子を含めて，12〜72欄の間に記述してください。12〜72欄の外にDMLを記述した場合，構文エラーになります。または，DMLと認識されないので，COBOL命令に置換されません。

DML先頭子の記述にエラーがある場合，pdsdbcblコマンドはDMLと認識できないため，COBOL命令に置換されません。

DML先頭子がある行からDML終了子がある行の間のデバッグ行は，注釈行に置換されてポストソースに出力されます。それ以外のデバッグ行は，そのままポストソースに出力されます。

一連番号領域（第1〜第6欄の範囲）にタブ文字は記述できません。

文字列定数と16進文字列定数の文字列を囲む記号には，アポストロフィ（'）を使用してください。COBOL85の-Xcコンパイラオプション，COBOL2002の-DoubleQuoteコンパイラオプションを指定している場合でも，引用符（"）は使用できません。

DMLの継続規則は，COBOLの「行のつなぎ」の規則に従います。

DMLで空白を必ず挿入する個所，または空白を挿入できる個所であれば，自由に行を変えて記述できます。また，複数行にわたって記述することもできます。

DMLで空白を挿入できない個所で行を変える場合は，任意の欄まで記述したあとに次の行の標識領域にハイフン（-）を記述し，プログラム原文領域の12欄以降から行の続きを記述してください。

文字列定数の途中で行を変える場合は，72欄まで記述したあとに次の行の標識領域にハイフン（-）を記述し，プログラム原文領域の12欄以降からアポストロフィ（'）に続けて，文字列の続きを記述してください。※

引用符（"）で囲んだ識別子の途中で行を変える場合は，72欄まで記述したあとに次の行の標識領域にハイフン（-）を記述し，プログラム原文領域の12欄以降から引用符（"）に続けて，文字列の続きを記述してください。※

16進文字列定数の途中で行を変える場合は，先頭のXの直後で改行しないでください。72欄まで記述したあとに次の行の標識領域にハイフン（-）を記述し，プログラム原文領域の12欄以降からアポストロフィ（'）に続けて，16進文字列の続きを記述してください。※

段落の見出しをDMLと同一行に記述できません。記述した場合は，構文エラーになります。

表意定数はDML中に指定できません。指定した場合，表意定数の示す値として解釈されないため，構文エラーになるおそれがあります。

文字列定数は，COBOL処理系の定める最大長とDMLの定める最大長のうち，短い方が使用可能な長さの上限になります。

DMLの定める最大長を超えた場合，UAPのプリプロセス時に構文エラーになります。プリプロセスが正常終了した場合でも，COBOL処理系の定める最大長を超えているときは，UAPのコンパイル時にエラーになります。

DMLで使用可能な文字列定数の最大長については，マニュアル「HiRDB 構造型データベース機能」の「DMLのデータ型」の「変換（比較）できるデータ型」を参照してください。

標識領域（第7欄）に全角文字は記述できません。

注※

72欄以前で改行した場合，pdsdbcblコマンドは72欄までの空白を補います。

2.10.9　SDBデータベースの特定規則

pdsdbcblコマンドは，DMLに指定されたレコード名からレコード型に関する定義情報を取得しています。情報を取得する際，SDBデータベース節に指定された順にSDBデータベースの定義情報を参照します。同じレコード型名が定義されているSDBデータベースが複数指定されている場合は，最初に参照したSDBデータベースの定義情報からレコード型に関する定義情報を取得します。

なお，DMLに指定された親子集合型名について定義情報を取得する際にも，レコード型名と同様にSDBデータベースの定義情報を参照します。ただし，DMLにレコード名と親子集合型名の両方が指定されている場合は，参照するSDBデータベースの特定はレコード名によって行われます。

DMLのレコード名，親子集合型名から，SDBデータベースを特定する例を次に示します。

（例）

UAPソースファイル（SRC01）

SDB-DATABASE SECTION.
 SDB SDB1,SDB2.                ←SDB1が先に指定されている。
    ：
EXEC DML
   FETCH NEXT RECA INTO :XRECA  ←SDB1に定義されたレコード型RECAと解釈される。
END-DML.
EXEC DML
   FETCH NEXT RECB INTO :XRECB  ←SDB1に定義されたレコード型RECBと解釈される。
    WITHIN SET1
END-DML.
EXEC DML
   FIND CURRENT OWNER OF SET1  ←SDB1に定義された親子集合型SET1と解釈される。
END-DML.

UAPソースファイル（SRC02）

SDB-DATABASE SECTION.
 SDB SDB2,SDB1.                ←SDB2が先に指定されている。
    ：
EXEC DML
   FETCH NEXT RECA INTO :XRECA  ←SDB2に定義されたレコード型RECAと解釈される。
END-DML.
EXEC DML
   FETCH NEXT RECB INTO :XRECB  ←SDB2に定義されたレコード型RECBと解釈される。
    WITHIN SET1
END-DML.
EXEC DML
   FIND CURRENT OWNER OF SET1  ←SDB2に定義された親子集合型SET1と解釈される。
END-DML.

2.11　COBOLソースプログラムのコーディング例

DMLを記述した埋込み型UAP（SDBデータベースにアクセスする部分のUAP）のCOBOLソースプログラムのPADチャートとコーディング例を示します。OpenTP1環境下で実行するUAP（SPP）の例です。

2.11.1　PADチャート

UAPのPADチャートを次の図に示します。

図2‒11　UAPのPADチャート

2.11.2　コーディング例

COBOLソースプログラムのコーディング例を次に示します。

左端の番号は行番号を示しています。

1       IDENTIFICATION DIVISION.
2       PROGRAM-ID. UAPDML01.
3      *
4       ENVIRONMENT DIVISION.
5      *
6       INPUT-OUTPUT SECTION.
7      *
8       DATA DIVISION.
9      *
10       SDB-DATABASE SECTION.                     -
11         SDB                  DATABASE01          |
12         RECORD NAME          RECNAME             | 1.
13         RECORD LENGTH        RECLENG             |
14         .                                       -
15      *
16       WORKING-STORAGE SECTION.
17      *
18       77  EOF                 PIC X VALUE '0'.
19       77  ERR-FLG             PIC X VALUE '0'.
20       77  TENPO_END           PIC X VALUE '0'.
21       77  ZAIKO_END           PIC X VALUE '0'.
22       77  TENPO_NOT_1ST       PIC X VALUE '0'.
23      *
24       77  RECNAME            PIC X(30) VALUE SPACE.         ←2.
25       77  RECLENG            PIC S9(8) COMP-5 VALUE ZERO.   ←2.
26      *
27       01  OUTREC  IS  GLOBAL PIC X(132).
28      *
29       01  INREC   IS  GLOBAL PIC X(80).
30       01  INREC_W            REDEFINES INREC.
31         02  IW_SYORI         PIC X.
32         02  FILLER           PIC X.
33         02  IW_KUBUN         PIC X.
34         02  FILLER           PIC X(77).
35      *
36       01  INREC_R            REDEFINES INREC_W.
37         02  IR_SYORI         PIC X.
38         02  FILLER           PIC X.
39         02  IR_KUBUN         PIC X.
40         02  FILLER           PIC X.
41         02  IR_KSN-KUBUN     PIC X.
42         02  FILLER           PIC X.
43         02  IR_TENPO_CD      PIC X.
44         02  FILLER           PIC X.
45         02  IR_TENPO_NAME    PIC X(30).
46       01  INREC_C            REDEFINES INREC_W.
47         02  IC_SYORI         PIC X.
48         02  FILLER           PIC X.
49         02  IC_KUBUN         PIC X.
50         02  FILLER           PIC X.
51         02  IC_KSN-KUBUN     PIC X.
52         02  FILLER           PIC X.
53         02  IC_IO-KUBUN      PIC X.
54         02  FILLER           PIC X.
55         02  IC_TENPOID       PIC X.
56         02  FILLER           PIC X.
57         02  IC_SCODE         PIC X(4).
58         02  FILLER           PIC X.
59         02  IC_SNAME         PIC X(30).
60         02  FILLER           PIC X.
61         02  IC_SCOLOR        PIC X(10).
62         02  FILLER           PIC X.
63         02  IC_STANKA        PIC 9(10).
64         02  FILLER           PIC X.
65         02  IC_SSURYO        PIC 9(10).
66      *
67       01  TENPO.                                  -
68         02  RT_DBKEY.                              | 3.
69           03  TENPO_CD       PIC X.                |
70         02  TENPO_NAME       PIC X(30).           -
71      *
72       01  ZAIKO.                                  -
73         02  CH_TENPO_CD      PIC X.                |
74         02  CH_DBKEY         PIC S9(8) COMP-5.     |
75         02  SCODE            PIC X(4).             | 4.
76         02  SNAME            PIC X(30).            |
77         02  SCOLOR           PIC X(10).            |
78         02  TANKA            PIC S9(8) COMP-5.     |
79         02  ZSURYO           PIC S9(8) COMP-5.    -
80      *
81       01  MIDASHI.
82         02  FILLER           PIC X(80) VALUE
83                              '***   ZAIKO ICHIRAN   ***'.
84      *
85       01  O_TENPO.
86         02  FILLER           PIC X(15) VALUE '  TENPO CODE : '.
87         02  O_TENPO_CD       PIC X.
88         02  FILLER           PIC X(10) VALUE ', NAME : "'.
89         02  O_TENPO_NAME     PIC X(30).
90         02  FILLER           PIC X     VALUE '"'.
91      *
92       01  O_ZAIKO.
93         02  FILLER           PIC X(15) VALUE '  ZAIKO CODE : '.
94         02  O_ZAIKO_CODE     PIC X(4).
95         02  FILLER           PIC X(10) VALUE ', NAME : "'.
96         02  O_ZAIKO_NAME     PIC X(30).
97         02  FILLER           PIC X(11) VALUE '", COLOR : '.
98         02  O_ZAIKO_COLOR    PIC X(10).
99         02  FILLER           PIC X(10) VALUE ', TANKA : '.
100         02  O_ZAIKO_TANKA    PIC ZZZZZZZZ9.
101         02  FILLER           PIC X(11) VALUE ', SUURYO : '.
102         02  O_ZAIKO_SUURYO   PIC ZZZZZZZZ9.
103      *
104       01  ERR_MSG.
105         02  FILLER           PIC X(22) VALUE '***   ERROR SQLCODE : '.
106         02  EM_SQLCODE       PIC -ZZZZZZZZ9.
107         02  FILLER           PIC X(15) VALUE ', ERROR DML : "'.
108         02  EM_ERRDML        PIC X(30).
109         02  FILLER           PIC X(7) VALUE '"   ***'.
110      *
111       LINKAGE SECTION.
112      *
113       77 IN_DATA             PIC X(80).                 ←5.
114       77 IN_LENG             PIC S9(9) COMP-5.          ←6.
115       77 OUT_DATA            PIC X(32).                 ←7.
116       77 OUT_LENG            PIC S9(9) COMP-5.          ←8.
117      *
118       PROCEDURE DIVISION USING IN_DATA IN_LENG OUT_DATA OUT_LENG.
119       MAIN SECTION.
120      * test
121       MOVE IN_DATA TO INREC.
122      *
123       M-01.
124           MOVE 0 TO RETURN-CODE.
125           MOVE 'SVR01: NORMAL END' TO OUT_DATA          ←9.
126           MOVE 32 TO OUT_LENG                           ←9.
127           DISPLAY 'UAPDML01 START'.
128           DISPLAY 'IW_SYORI =' IW_SYORI.
129           DISPLAY 'IW_KUBUN =' IW_KUBUN.
130      *
131       M-02.
132           IF IW_SYORI = 'D'
133           THEN
134             PERFORM DB-KOUSHIN
135           ELSE IF IW_SYORI = 'F'
136             PERFORM FUTSUU
137           END-IF.
138      *
139           IF OUT_DATA NOT = 'SVR01: NORMAL END'
140           THEN
141             PERFORM IJYOU
142           END-IF.
143       M-EXIT.
144           EXIT PROGRAM.
145      *
146       DB-KOUSHIN SECTION.
147       D-01.
148      *    MOVE INREC TO INREC_W
149           IF IW_KUBUN = 'R'
150           THEN
151             EVALUATE IR_KSN-KUBUN
152               WHEN 'S'
153                 PERFORM TENPO-TSUIKA
154               WHEN 'E'
155                 PERFORM TENPO-SAKUJO
156             END-EVALUATE
157           ELSE
158             MOVE IC_TENPOID TO TENPO_CD
159             MOVE 'D-01:FIND TENPO' TO EM_ERRDML
160             EXEC DML                                             -
161               FIND FIRST "TENPO" WHERE ( "DBKEY" = :RT_DBKEY )    | 10.
162             END-DML                                              -
163             IF SQLCODE = 0                                        ←11.
164               EVALUATE IC_KSN-KUBUN
165                 WHEN 'M'
166                   PERFORM ZAIKO-KOUSHIN
167                 WHEN 'S'
168                   PERFORM ZAIKO-TSUIKA
169                 WHEN 'E'
170                   PERFORM ZAIKO-SAKUJO
171               END-EVALUATE
172             ELSE
173               MOVE '2' TO ERR-FLG
174               MOVE 'SVR01: DB-KOUSHIN FAILED' TO OUT_DATA         ←12.
175               MOVE 24 TO OUT_LENG
176             END-IF
177           END-IF.
178       D-EXIT.
179           EXIT.
180      *
181       ZAIKO-KOUSHIN SECTION.
182       M-01.
183           PERFORM ICHIDUKE.            ←13.
184           IF ERR-FLG = '0'
185           THEN
186             IF IC_IO-KUBUN = '1'
187             THEN
188               COMPUTE ZSURYO = ZSURYO + IC_SSURYO     ←14.
189             ELSE
190               COMPUTE ZSURYO = ZSURYO - IC_SSURYO     ←14.
191             END-IF
192             MOVE 'M-01:MODIFY ZAIKO' TO EM_ERRDML
193             EXEC DML
194               MODIFY ZAIKO FROM :ZAIKO       ←15.
195             END-DML
196             IF SQLCODE NOT = 0               ←11.
197             THEN
198               MOVE '2' TO ERR-FLG
199               MOVE 'SVR01: ZAIKO-KOUSHIN FAILED' TO OUT_DATA     ←16.
200               MOVE 27 TO OUT_LENG
201             ELSE
202               CONTINUE
203             END-IF
204           END-IF.
205       M-EXIT.
206           EXIT.
207      *
208       ZAIKO-TSUIKA SECTION.
209       S-01.
210           MOVE IC_TENPOID TO TENPO_CD.       ←17.
211           MOVE 0          TO CH_DBKEY.       ←18.
212           MOVE IC_SCODE   TO SCODE.          -
213           MOVE IC_SNAME   TO SNAME.           |
214           MOVE IC_SCOLOR  TO SCOLOR.          |17.
215           MOVE IC_STANKA  TO TANKA.           |
216           MOVE IC_SSURYO  TO ZSURYO.         -
217       S-02.
218           MOVE 'S-02:STORE ZAIKO' TO EM_ERRDML.
219           EXEC DML
220             STORE ZAIKO FROM :ZAIKO          ←19.
221           END-DML.
222           IF SQLCODE NOT = 0                 ←11.
223           THEN
224             MOVE '2' TO ERR-FLG
225             MOVE 'SVR01: ZAIKO-TSUIKA FAILED' TO OUT_DATA     ←12.
226             MOVE 26 TO OUT_LENG
227           ELSE
228             CONTINUE
229           END-IF.
230       S-EXIT.
231           EXIT.
232      *
233       ZAIKO-SAKUJO SECTION.
234       E-01.
235           PERFORM ICHIDUKE.                  ←20.
236           IF ERR-FLG = '0'
237           THEN
238             MOVE 'E-01:ERASE ZAIKO' TO EM_ERRDML
239             EXEC DML
240               ERASE ZAIKO ALL                ←21.
241             END-DML
242             IF SQLCODE NOT = 0               ←11.
243             THEN
244               MOVE '2' TO ERR-FLG
245               MOVE 'SVR01: ZAIKO-SAKUJO FAILED' TO OUT_DATA      ←12.
246               MOVE 26 TO OUT_LENG
247             ELSE
248               CONTINUE
249             END-IF
250           END-IF.
251       E-EXIT.
252           EXIT.
253      *
254       TENPO-TSUIKA SECTION.
255       A-01.
256           MOVE IR_TENPO_CD   TO TENPO_CD.           ←22.
257           MOVE IR_TENPO_NAME TO TENPO_NAME.         ←17.
258           MOVE 'A-01:STORE TENPO' TO EM_ERRDML
259           DISPLAY TENPO.
260           EXEC DML
261             STORE TENPO FROM :TENPO                 ←23.
262           END-DML.
263           IF SQLCODE NOT = 0                        ←11.
264           THEN
265             MOVE '2' TO ERR-FLG
266             MOVE 'SVR01: TENPO-TSUIKA FAILED' TO OUT_DATA      ←12.
267             MOVE 26 TO OUT_LENG
268           ELSE
269             CONTINUE
270           END-IF.
271       A-EXIT.
272           EXIT.
273      *
274       TENPO-SAKUJO SECTION.
275       K-01.
276           MOVE IR_TENPO_CD   TO TENPO_CD.           ←24.
277           MOVE 'K-01:FIND TENPO' TO EM_ERRDML
278           EXEC DML
279             FIND FOR UPDATE FIRST TENPO             ←25.
280               WHERE ( "DBKEY" = :RT_DBKEY )         ←25.
281           END-DML.
282           IF SQLCODE = 0                            ←11.
283           THEN
284             MOVE 'K-01:ERASE TENPO' TO EM_ERRDML
285             EXEC DML
286               ERASE TENPO ALL                       ←26.
287             END-DML
288           ELSE
289             CONTINUE
290           END-IF.
291           IF SQLCODE NOT = 0                        ←11.
292           THEN
293             MOVE '2' TO ERR-FLG
294             MOVE 'SVR01: TENPO-SAKUJO FAILED' TO OUT_DATA      ←12.
295             MOVE 26 TO OUT_LENG
296           ELSE
297             CONTINUE
298           END-IF.
299       K-EXIT.
300           EXIT.
301      *
302       ICHIDUKE SECTION.
303       I-01.
304           MOVE 'I-01:FETCH ZAIKO 01' TO EM_ERRDML.
305           EXEC DML
306             FETCH FOR UPDATE FIRST ZAIKO            ←27.
307               INTO :ZAIKO WITHIN TENPO_ZAIKO
308           END-DML.
309           IF SQLCODE NOT = 0                        ←11.
310           THEN
311             MOVE '2' TO ERR-FLG
312             MOVE 'SVR01: ICHIDUKE FAILED' TO OUT_DATA       ←12.
313             MOVE 22 TO OUT_LENG
314           ELSE
315             CONTINUE
316           END-IF.
317           PERFORM UNTIL ( IC_SCODE = SCODE OR ERR-FLG NOT = '0' )
318             MOVE 'I-01:FETCH ZAIKO 02' TO EM_ERRDML
319             EXEC DML
320               FETCH FOR UPDATE NEXT ZAIKO           ←28.
321                 INTO :ZAIKO WITHIN TENPO_ZAIKO
322             END-DML
323             IF SQLCODE NOT = 0                      ←11.
324             THEN
325               MOVE '2' TO ERR-FLG
326               MOVE 'SVR01: ICHIDUKE FAILED' TO OUT_DATA      ←12.
327               MOVE 22 TO OUT_LENG
328             ELSE
329               CONTINUE
330             END-IF
331           END-PERFORM.
332       I-EXIT.
333           EXIT.
334      *
335       FUTSUU SECTION.
336       F-01.
337           MOVE  MIDASHI  TO  OUTREC.
338           DISPLAY OUTREC UPON SYSOUT.
339           PERFORM UNTIL ( TENPO_END = '1' OR ERR-FLG NOT = '0'  )
340             MOVE 'F-01:FETCH TENPO' TO EM_ERRDML
341             IF TENPO_NOT_1ST = '0'
342             THEN
343               EXEC DML
344                 FETCH FOR UPDATE FIRST TENPO INTO :TENPO      ←29.
345               END-DML
346             ELSE
347               EXEC DML
348                 FETCH FOR UPDATE NEXT TENPO INTO :TENPO       ←30.
349               END-DML
350             END-IF
351             IF SQLCODE = 0                                    ←11.
352             THEN
353               MOVE TENPO_CD   TO O_TENPO_CD
354               MOVE TENPO_NAME TO O_TENPO_NAME
355               MOVE O_TENPO    TO OUTREC
356               DISPLAY OUTREC UPON SYSOUT
357               PERFORM UNTIL ( ZAIKO_END = '1' OR ERR-FLG NOT = '0' )
358                 MOVE 'F-01:FETCH ZAIKO' TO EM_ERRDML
359                 EXEC DML
360                   FETCH NEXT ZAIKO INTO :ZAIKO WITHIN TENPO_ZAIKO      ←31.
361                 END-DML
362                 IF SQLCODE = 0                                  ←11.
363                 THEN
364                   MOVE SCODE  TO O_ZAIKO_CODE                  -
365                   MOVE SNAME  TO O_ZAIKO_NAME                   |
366                   MOVE SCOLOR  TO O_ZAIKO_COLOR                 | 32.
367                   MOVE TANKA  TO O_ZAIKO_TANKA                  |
368                   MOVE ZSURYO TO O_ZAIKO_SUURYO                 |
369                   MOVE  O_ZAIKO  TO  OUTREC                    -
370                   DISPLAY OUTREC UPON SYSOUT
371                 ELSE
372                   IF SQLCODE = 100                             -
373                   THEN                                          | 33.
374                     MOVE '1' TO ZAIKO_END                      -
375                   ELSE
376                     MOVE '2' TO ERR-FLG
377                     MOVE 'SVR01: FUTSUU FAILED' TO OUT_DATA     ←12.
378                     MOVE 20 TO OUT_LENG
379                   END-IF
380                 END-IF
381               END-PERFORM
382               MOVE '1' TO TENPO_NOT_1ST
383               MOVE '0' TO ZAIKO_END
384             ELSE
385               IF SQLCODE = 100                                 -
386               THEN                                              | 34.
387                 MOVE '1' TO TENPO_END                          -
388               ELSE
389                 MOVE '2' TO ERR-FLG
390                 MOVE 'SVR01: FUTSUU FAILED' TO OUT_DATA         ←12.
391                 MOVE 20 TO OUT_LENG
392               END-IF
393             END-IF
394           END-PERFORM.
395       F-EXIT.
396           EXIT.
397      *
398       IJYOU SECTION.
399       J-01.
400           MOVE  SQLCODE TO EM_SQLCODE.                        ←35.
401           MOVE  ERR_MSG  TO  OUTREC.
402           DISPLAY OUTREC UPON SYSOUT.                         ←36.
403           DISPLAY SQLERRMC(1:SQLERRML) UPON SYSOUT.           ←37.
404           MOVE  INREC  TO  OUTREC.
405           DISPLAY OUTREC UPON SYSOUT.                         ←38.
406           MOVE  OUT_DATA  TO  OUTREC.
407           DISPLAY OUTREC UPON SYSOUT.                         ←39.
408       J-EXIT.
409           EXIT.

［説明］

SDBデータベース節を指定します。

UAP内のDMLでアクセスするSDBデータベースを指定します。

DMLの実行後にレコード名を受け取る埋込み変数の名前を指定します。

DMLの実行後にレコード長を受け取る埋込み変数の名前を指定します。

SDBデータベース節については，「2.3　SDBデータベース節の記述」を参照してください。

次の埋込み変数を宣言します。

SDBデータベース節のRECORD NAMEで指定した埋込み変数を宣言します。

SDBデータベース節のRECORD LENGTHで指定した埋込み変数を宣言します。

レコード型TENPOとデータの受け渡しを行う埋込み変数を宣言します。

埋込み変数の宣言については，「2.4　埋込み変数の宣言」を参照してください。

レコード型ZAIKOとデータの受け渡しを行う埋込み変数を宣言します。

クライアントUAPから値が渡されるデータ領域：入力パラメタ

クライアントUAPから値が渡されるデータ領域：入力パラメタ長

UAPで値を設定するデータ領域：サービスプログラムの応答

UAPで値を設定するデータ領域：サービスプログラムの応答の長さ

SUPに返すメッセージを正常時の値で初期設定します。

ルートレコードのデータベースキーの一致するTENPOレコードに位置指示子を位置づけます。

DML先頭子（EXEC DML）に続けてDMLを記述します。DMLの直後にDML終了子（END-DML）を記述します。

SQLCODEを参照してDMLの実行結果を判定します。

DMLの実行結果の判定については，「2.7　DMLの実行結果の判定処理」を参照してください。

SUPに返すメッセージにエラーを示す値を設定します。

レコード実現値の変更前に，変更するレコードに対して位置指示子を位置づけます。

変更する構成要素に対応する埋込み変数に更新値を設定します。

位置づけしたZAIKOレコードのユーザデータを埋込み変数の値に変更します。

SUP側でチェックするメッセージです。

構成要素に対応する埋込み変数に格納するデータを設定します。

一連番号はHiRDB/SDが割り当てます。

親レコードTENPOへの位置づけ後に，子レコードZAIKOを格納します。

レコードの削除をする前に，削除するレコードに位置指示子を位置づけます。

位置づけしたZAIKOレコードを削除します。

TENPOレコードはルートレコードのため，格納前にルートレコードのデータベースキーの値を埋込み変数に設定します。

ルートレコードのTENPOレコードを格納します。

キーの検索条件に指定する埋込み変数に，削除対象のルートレコードのデータベースキーの値を設定します。

レコード実現値の削除前に，削除するレコードに対して位置指示子を更新指定で位置づけます。削除するレコードはキーの検索条件で指定します。

位置指示子が位置づけられているレコードを削除します。下位レコードがある場合は，下位レコードも同時に削除されます。

子レコードZAIKOの検索は，親レコードTENPOの位置づけ後に行います。更新指定で先頭のZAIKOレコードへの位置づけを行い，レコード実現値を埋込み変数ZAIKOに取得します。

現在位置づけられているZAIKOレコードの次のレコードに更新指定で位置づけを行い，レコード実現値を埋込み変数ZAIKOに取得します。

先頭のTENPOレコードへの位置づけを行い，レコード実現値を埋込み変数TENPOに取得します。

現在位置づけられているTENPOレコードの次のレコードに位置づけを行い，レコード実現値を埋込み変数TENPOに取得します。

ZAIKOレコードに位置づけがない場合は，先頭のZAIKOレコードに位置づけを行い，レコード実現値を埋込み変数ZAIKOに取得します。

位置づけられている場合，位置づけられているZAIKOレコードの次のレコードに位置づけを行い，レコード実現値を埋込み変数ZAIKOに取得します。

埋込み変数からレコード実現値を取り出します。

SQLCODEが100かどうかを判定します。100の場合は，TENPOレコード下のすべてのZAIKOレコードの検索が完了しています。

SQLCODEが100かどうかを判定します。100の場合は，すべてのTENPOレコードの検索が完了しています。

エラー要因を取得するため，SQLCODEをエラーメッセージに含めます。

エラーメッセージを出力します。

HiRDBのエラーメッセージを出力します。

エラーが発生した入力データを出力します。

エラーが発生した手続きを出力します。

2.12　DMLとSQLの両方を実行するUAPを作成する場合の考慮点

DMLとSQLの両方を実行するUAPを作成する場合の考慮点について説明します。

2.12.1　UAPソースファイルの構成

1つのUAPソースファイル中に，DMLとSQLの両方を記述することはできません。DMLを記述するUAPソースファイルと，SQLを記述するUAPソースファイルを別々に作成してください。各UAPソースファイルをプリプロセスしたあとに，コンパイルとリンケージを実行します。

DMLとSQLの両方を実行するUAPの実行可能ファイル作成までの流れを次の図に示します。

図2‒12　DMLとSQLの両方を実行するUAPの実行可能ファイル作成までの流れ

2.12.2　DMLとSQLの両方を実行するUAPのトランザクション制御

DMLとSQLの両方を実行するUAPを作成する場合，HiRDBサーバへの接続，HiRDBサーバからの切り離し，およびトランザクション制御はSQLで行います。

HiRDBサーバに接続する場合はCONNECT文を，HiRDBサーバから切り離す場合はDISCONNECT文を実行します。トランザクションをコミットする場合はCOMMIT文を，トランザクションを取り消す場合はROLLBACK文を実行します。

「図2-12　DMLとSQLの両方を実行するUAPの実行可能ファイル作成までの流れ」で示す「SQLを記述したプログラムのUAPソースファイル」中に，CONNECT文やCOMMIT文などを記述します。

COBOLソースプログラムのコーディング例については，「2.12.3　COBOLソースプログラムのコーディング例（DMLとSQLの両方を実行するUAPの場合）」を参照してください。

2.12.3　COBOLソースプログラムのコーディング例（DMLとSQLの両方を実行するUAPの場合）

DMLを記述した埋込み型UAP（SDBデータベースにアクセスする部分のUAP）のCOBOLソースプログラムのPADチャートとコーディング例を示します。DMLとSQLの両方を実行するUAPの例です。

(1)　PADチャート

UAPのPADチャートを次の図に示します。

図2‒13　UAPのPADチャート

(2)　コーディング例

次のCOBOLソースプログラムのコーディング例を説明します。

DMLを記述したCOBOLソースプログラム（UAPDML01）

SQLを記述したCOBOLソースプログラム（UAPSQL01）

左端の番号は行番号を示しています。

■DMLを記述したCOBOLソースプログラム（UAPDML01）のコーディング例

1       IDENTIFICATION DIVISION.
2       PROGRAM-ID. UAPDML01.
3      *
4       ENVIRONMENT DIVISION.
5      *
6       INPUT-OUTPUT SECTION.
7       FILE-CONTROL.
8       SELECT O-FILE
9         ASSIGN TO './UAPDML01.log'
10         LINE SEQUENTIAL.
11       SELECT I-FILE
12         ASSIGN TO './UAPDML01.txt'
13         LINE SEQUENTIAL.
14       DATA DIVISION.
15       FILE SECTION.
16       FD  O-FILE             DATA RECORD OUTREC.
17       01  OUTREC             PIC X(132).
18       FD  I-FILE             DATA RECORD INREC.
19       01  INREC              PIC X(80).
20      *
21       SDB-DATABASE SECTION.                          -
22         SDB                  DATABASE01               |
23         RECORD NAME          RECNAME                  | 1.
24         RECORD LENGTH        RECLENG                  |
25         .                                            -
26      *
27       WORKING-STORAGE SECTION.
28      *
29       77  EOF                 PIC X VALUE '0'.
30       77  ERR-FLG             PIC X VALUE '0'.
31       77  TENPO_END           PIC X VALUE '0'.
32       77  ZAIKO_END           PIC X VALUE '0'.
33       77  TENPO_NOT_1ST       PIC X VALUE '0'.
34      *
35       77  REQSQL_CNCT        PIC X(4) VALUE 'CNCT'.
36       77  REQSQL_DISC        PIC X(4) VALUE 'DISC'.
37       77  REQSQL_COMT        PIC X(4) VALUE 'COMT'.
38       77  REQSQL_ROLB        PIC X(4) VALUE 'ROLB'.
39      *
40       77  RECNAME            PIC X(30)      VALUE SPACE.      ←2.
41       77  RECLENG            PIC S9(8) COMP VALUE ZERO.       ←2.
42      *
43       01  INREC_W.
44         02  IW_KUBUN         PIC X.
45         02  FILLER           PIC X(79).
46       01  INREC_R            REDEFINES INREC_W.
47         02  IR_KUBUN         PIC X.
48         02  FILLER           PIC X.
49         02  IR_KSN-KUBUN     PIC X.
50         02  FILLER           PIC X.
51         02  IR_TENPO_CD      PIC X.
52         02  FILLER           PIC X.
53         02  IR_TENPO_NAME    PIC X(30).
54       01  INREC_C            REDEFINES INREC_W.
55         02  IC_KUBUN         PIC X.
56         02  FILLER           PIC X.
57         02  IC_KSN-KUBUN     PIC X.
58         02  FILLER           PIC X.
59         02  IC_IO-KUBUN      PIC X.
60         02  FILLER           PIC X.
61         02  IC_TENPOID       PIC X.
62         02  FILLER           PIC X.
63         02  IC_SCODE         PIC X(4).
64         02  FILLER           PIC X.
65         02  IC_SNAME         PIC X(30).
66         02  FILLER           PIC X.
67         02  IC_SCOLOR        PIC X(10).
68         02  FILLER           PIC X.
69         02  IC_STANKA        PIC 9(10).
70         02  FILLER           PIC X.
71         02  IC_SSURYO        PIC 9(10).
72      *
73       01  TENPO.                                     ←3.
74         02  RT_DBKEY.
75           03  TENPO_CD       PIC X.
76         02  TENPO_NAME       PIC X(30).
77      *
78       01  ZAIKO.                                     ←4.
79         02  CH_TENPO_CD      PIC X.
80         02  CH_DBKEY         PIC S9(8) COMP.
81         02  SCODE            PIC X(4).
82         02  SNAME            PIC X(30).
83         02  SCOLOR           PIC X(10).
84         02  TANKA            PIC S9(8) COMP.
85         02  ZSURYO           PIC S9(8) COMP.
86      *
87       01  MIDASHI.
88         02  FILLER           PIC X(80) VALUE
89                              '***   ZAIKO ICHIRAN   ***'.
90      *
91       01  O_TENPO.
92         02  FILLER           PIC X(15) VALUE '  TENPO CODE : '.
93         02  O_TENPO_CD       PIC X.
94         02  FILLER           PIC X(10) VALUE ', NAME : "'.
95         02  O_TENPO_NAME     PIC X(30).
96         02  FILLER           PIC X     VALUE '"'.
97      *
98       01  O_ZAIKO.
99         02  FILLER           PIC X(15) VALUE '  ZAIKO CODE : '.
100         02  O_ZAIKO_CODE     PIC X(4).
101         02  FILLER           PIC X(10) VALUE ', NAME : "'.
102         02  O_ZAIKO_NAME     PIC X(30).
103         02  FILLER           PIC X(11) VALUE '", COLOR : '.
104         02  O_ZAIKO_COLOR    PIC X(10).
105         02  FILLER           PIC X(10) VALUE ', TANKA : '.
106         02  O_ZAIKO_TANKA    PIC ZZZZZZZZ9.
107         02  FILLER           PIC X(11) VALUE ', SUURYO : '.
108         02  O_ZAIKO_SUURYO   PIC ZZZZZZZZ9.
109      *
110       01  ERR_MSG.
111         02  FILLER           PIC X(22) VALUE '***   ERROR SQLCODE : '.
112         02  EM_SQLCODE       PIC -ZZZZZZZZ9.
113         02  FILLER           PIC X(15) VALUE ', ERROR DML : "'.
114         02  EM_ERRDML        PIC X(30).
115         02  FILLER           PIC X(7) VALUE '"   ***'.
116      *
117       PROCEDURE DIVISION.
118       MAIN SECTION.
119       M-01.
120           MOVE 0 TO RETURN-CODE.
121           OPEN OUTPUT O-FILE.
122           OPEN INPUT  I-FILE.
123       M-02.
124           CALL  'UAPSQL01' USING REQSQL_CNCT.         ←5.
125           IF RETURN-CODE NOT = 0
126           THEN
127             MOVE '1' TO ERR-FLG
128           ELSE
129             PERFORM DB-KOUSHIN
130           END-IF.
131       M-03.
132           EVALUATE ERR-FLG
133             WHEN '0'
134               PERFORM FUTSUU
135             WHEN '1'
136               GO TO M-EXIT
137             WHEN '2'
138               PERFORM IJYOU                           ←6.
139           END-EVALUATE.
140       M-04.
141           CALL  'UAPSQL01' USING REQSQL_DISC.         ←7.
142       M-EXIT.
143           CLOSE O-FILE.
144           CLOSE I-FILE.
145           GOBACK.
146      *
147       DB-KOUSHIN SECTION.
148       D-01.
149           PERFORM UNTIL ( EOF = '1' OR ERR-FLG NOT = '0' )
150             READ I-FILE
151               AT END MOVE '1' TO EOF
152             END-READ
153             IF EOF = '0'
154             THEN
155               MOVE INREC TO INREC_W
156               IF IW_KUBUN = 'R'
157               THEN
158                 EVALUATE IR_KSN-KUBUN
159                   WHEN 'S'
160                     PERFORM TENPO-TSUIKA
161                   WHEN 'E'
162                     PERFORM TENPO-SAKUJO
163                 END-EVALUATE
164               ELSE
165                 MOVE IC_TENPOID TO TENPO_CD
166                 MOVE 'D-01:FIND TENPO' TO EM_ERRDML
167                 EXEC DML                                              -
168                   FIND FIRST "TENPO" WHERE ( "DBKEY" = :RT_DBKEY )     |8.
169                 END-DML                                               -
170                 IF SQLCODE = 0                     ←9.
171                   EVALUATE IC_KSN-KUBUN
172                     WHEN 'M'
173                       PERFORM ZAIKO-KOUSHIN
174                     WHEN 'S'
175                       PERFORM ZAIKO-TSUIKA
176                     WHEN 'E'
177                       PERFORM ZAIKO-SAKUJO
178                   END-EVALUATE
179                 ELSE
180                   MOVE '2' TO ERR-FLG
181                 END-IF
182               END-IF
183             END-IF
184           END-PERFORM.
185       D-02.
186           IF ERR-FLG = '0'
187           THEN
188             CALL  'UAPSQL01' USING REQSQL_COMT     ←10.
189             IF RETURN-CODE NOT = 0
190             THEN
191               MOVE '3' TO ERR-FLG
192             ELSE
193               CONTINUE
194             END-IF
195           ELSE
196             CONTINUE
197           END-IF.
198       D-EXIT.
199           EXIT.
200      *
201       ZAIKO-KOUSHIN SECTION.
202       M-01.
203           PERFORM ICHIDUKE.                          ←11.
204           IF ERR-FLG = '0'
205           THEN
206             IF IC_IO-KUBUN = '1'
207             THEN
208               COMPUTE ZSURYO = ZSURYO + IC_SSURYO    ←12.
209             ELSE
210               COMPUTE ZSURYO = ZSURYO - IC_SSURYO    ←12.
211             END-IF
212             MOVE 'M-01:MODIFY ZAIKO' TO EM_ERRDML
213             EXEC DML
214               MODIFY ZAIKO FROM :ZAIKO               ←13.
215             END-DML
216             IF SQLCODE NOT = 0                       ←9.
217             THEN
218               MOVE '2' TO ERR-FLG
219             ELSE
220               CONTINUE
221             END-IF
222           END-IF.
223       M-EXIT.
224           EXIT.
225      *
226       ZAIKO-TSUIKA SECTION.
227       S-01.
228           MOVE IC_TENPOID TO TENPO_CD.               ←14.
229           MOVE 0          TO CH_DBKEY.               ←15.
230           MOVE IC_SCODE   TO SCODE.                  -
231           MOVE IC_SNAME   TO SNAME.                   |
232           MOVE IC_SCOLOR  TO SCOLOR.                  |14.
233           MOVE IC_STANKA  TO TANKA.                   |
234           MOVE IC_SSURYO  TO ZSURYO.                 -
235       S-02.
236           MOVE 'S-02:STORE ZAIKO' TO EM_ERRDML.
237           EXEC DML
238             STORE ZAIKO FROM :ZAIKO                  ←16.
239           END-DML.
240           IF SQLCODE NOT = 0                         ←9.
241           THEN
242             MOVE '2' TO ERR-FLG
243           ELSE
244             CONTINUE
245           END-IF.
246       S-EXIT.
247           EXIT.
248      *
249       ZAIKO-SAKUJO SECTION.
250       E-01.
251           PERFORM ICHIDUKE.                          ←17.
252           IF ERR-FLG = '0'
253           THEN
254             MOVE 'E-01:ERASE ZAIKO' TO EM_ERRDML
255             EXEC DML
256               ERASE ZAIKO ALL                        ←18.
257             END-DML
258             IF SQLCODE NOT = 0                       ←9.
259             THEN
260               MOVE '2' TO ERR-FLG
261             ELSE
262               CONTINUE
263             END-IF
264           END-IF.
265       E-EXIT.
266           EXIT.
267      *
268       TENPO-TSUIKA SECTION.
269       A-01.
270           MOVE IR_TENPO_CD   TO TENPO_CD.            ←19.
271           MOVE IR_TENPO_NAME TO TENPO_NAME.          ←14.
272           MOVE 'A-01:STORE TENPO' TO EM_ERRDML
273           EXEC DML
274             STORE TENPO FROM :TENPO                  ←20.
275           END-DML.
276           IF SQLCODE NOT = 0                         ←9.
277           THEN
278             MOVE '2' TO ERR-FLG
279           ELSE
280             CONTINUE
281           END-IF.
282       A-EXIT.
283           EXIT.
284      *
285       TENPO-SAKUJO SECTION.
286       K-01.
287           MOVE IR_TENPO_CD   TO TENPO_CD.            ←21.
288           MOVE 'K-01:FIND TENPO' TO EM_ERRDML
289           EXEC DML
290             FIND FOR UPDATE FIRST TENPO              ←22.
291               WHERE ( "DBKEY" = :RT_DBKEY )          ←22.
292           END-DML.
293           IF SQLCODE = 0                             ←9.
294           THEN
295             MOVE 'K-01:ERASE TENPO' TO EM_ERRDML
296             EXEC DML
297               ERASE TENPO ALL                        ←23.
298             END-DML
299           ELSE
300             CONTINUE
301           END-IF.
302           IF SQLCODE NOT = 0                         ←9.
303           THEN
304             MOVE '2' TO ERR-FLG
305           ELSE
306             CONTINUE
307           END-IF.
308       K-EXIT.
309           EXIT.
310      *
311       ICHIDUKE SECTION.
312       I-01.
313           MOVE 'I-01:FETCH ZAIKO 01' TO EM_ERRDML.
314           EXEC DML
315             FETCH FOR UPDATE FIRST ZAIKO             ←24.
316               INTO :ZAIKO WITHIN TENPO_ZAIKO
317           END-DML.
318           IF SQLCODE NOT = 0                         ←9.
319           THEN
320             MOVE '2' TO ERR-FLG
321           ELSE
322             CONTINUE
323           END-IF.
324           PERFORM UNTIL ( IC_SCODE = SCODE OR ERR-FLG NOT = '0' )
325             MOVE 'I-01:FETCH ZAIKO 02' TO EM_ERRDML
326             EXEC DML
327               FETCH FOR UPDATE NEXT ZAIKO            ←25.
328                 INTO :ZAIKO WITHIN TENPO_ZAIKO
329             END-DML
330             IF SQLCODE NOT = 0                       ←9.
331             THEN
332               MOVE '2' TO ERR-FLG
333             ELSE
334               CONTINUE
335             END-IF
336           END-PERFORM.
337       I-EXIT.
338           EXIT.
339      *
340       FUTSUU SECTION.
341       F-01.
342           WRITE OUTREC FROM MIDASHI.
343           PERFORM UNTIL ( TENPO_END = '1' OR ERR-FLG NOT = '0'  )
344             MOVE 'F-01:FETCH TENPO' TO EM_ERRDML
345             IF TENPO_NOT_1ST = '0'
346             THEN
347               EXEC DML
348                 FETCH FIRST TENPO INTO :TENPO        ←26.
349               END-DML
350             ELSE
351               EXEC DML
352                 FETCH NEXT TENPO INTO :TENPO         ←27.
353               END-DML
354             END-IF
355             IF SQLCODE = 0                           ←9.
356             THEN
357               MOVE TENPO_CD   TO O_TENPO_CD
358               MOVE TENPO_NAME TO O_TENPO_NAME
359               WRITE OUTREC FROM O_TENPO
360               PERFORM UNTIL ( ZAIKO_END = '1' OR ERR-FLG NOT = '0' )
361                 MOVE 'F-01:FETCH ZAIKO' TO EM_ERRDML
362                 EXEC DML
363                   FETCH NEXT ZAIKO INTO :ZAIKO WITHIN TENPO_ZAIKO     ←28.
364                 END-DML
365                 IF SQLCODE = 0                                        ←9.
366                 THEN
367                   MOVE SCODE  TO O_ZAIKO_CODE                        -
368                   MOVE SNAME  TO O_ZAIKO_NAME                         |
369                   MOVE SCOLOR  TO O_ZAIKO_COLOR                       | 29.
370                   MOVE TANKA  TO O_ZAIKO_TANKA                        |
371                   MOVE ZSURYO TO O_ZAIKO_SUURYO                       |
372                   WRITE OUTREC FROM O_ZAIKO                          -
373                 ELSE
374                   IF SQLCODE = 100                                   -
375                   THEN                                                | 30.
376                     MOVE '1' TO ZAIKO_END                            -
377                   ELSE
378                     MOVE '2' TO ERR-FLG
379                   END-IF
380                 END-IF
381               END-PERFORM
382               MOVE '1' TO TENPO_NOT_1ST
383               MOVE '0' TO ZAIKO_END
384             ELSE
385               IF SQLCODE = 100                -
386               THEN                             | 31.
387                 MOVE '1' TO TENPO_END         -
388               ELSE
389                 MOVE '2' TO ERR-FLG
390               END-IF
391             END-IF
392           END-PERFORM.
393       F-02.
394           IF ERR-FLG NOT = '0'
395           THEN
396             CALL  'UAPSQL01' USING REQSQL_ROLB      ←32.
397           ELSE
398             CONTINUE
399           END-IF.
400       F-EXIT.
401           EXIT.
402      *
403       IJYOU SECTION.
404       J-01.
405           MOVE SQLCODE TO EM_SQLCODE.               ←33.
406           WRITE OUTREC FROM ERR_MSG.                ←34.
407           WRITE OUTREC FROM SQLERRMC.               ←35.
408           WRITE OUTREC FROM INREC                   ←36.
409           CALL  'UAPSQL01' USING REQSQL_ROLB.       ←37.
410       J-EXIT.
411           EXIT.

［説明］

SDBデータベース節を指定します。

UAP内のDMLでアクセスするSDBデータベースを指定します。

DMLの実行後にレコード名を受け取る埋込み変数の名前を指定します。

DMLの実行後にレコード長を受け取る埋込み変数の名前を指定します。

SDBデータベース節については，「2.3　SDBデータベース節の記述」を参照してください。

次の埋込み変数を宣言します。

SDBデータベース節のRECORD NAMEで指定した埋込み変数

SDBデータベース節のRECORD LENGTHで指定した埋込み変数

SDBデータベース節で指定する埋込み変数の宣言については，「2.3.3　SDBデータベース節で指定する埋込み変数の宣言」を参照してください。

レコード型TENPOとデータの受け渡しを行う埋込み変数を宣言します。

埋込み変数の宣言については，「2.4　埋込み変数の宣言」を参照してください。

レコード型ZAIKOとデータの受け渡しを行う埋込み変数を宣言します。

HiRDBサーバに接続します。

SQLのCONNECT文を実行してHiRDBサーバに接続します。SQLのCONNECT文は，DMLを記述したUAPソースプログラムとは別のUAPソースプログラム（UAPSQL01）に記述します。

エラーが発生した場合，トランザクションの取り消し処理を行います。

HiRDBサーバから切り離します。

SQLのDISCONNECT文を実行してHiRDBサーバから切り離します。SQLのDISCONNECT文は，DMLを記述したUAPソースプログラムとは別のUAPソースプログラム（UAPSQL01）に記述します。

ルートレコードのデータベースキーの一致するTENPOレコードに位置指示子を位置づけます。

DML先頭子（EXEC DML）に続けてDMLを記述します。DMLの直後にDML終了子（END-DML）を記述します。

SQLCODEを参照してDMLの実行結果を判定します。

DMLの実行結果の判定については，「2.7　DMLの実行結果の判定処理」を参照してください。

データベースの更新がすべて正常に終了した場合は，SQLのCOMMIT文でトランザクションをコミットします。DMLを記述したUAPソースプログラムとは別のUAPソースプログラム（UAPSQL01）にCOMMIT文を記述します。

レコード実現値の変更前に，変更するレコードに対して位置指示子を位置づけます。

変更する構成要素に対応する埋込み変数に更新値を設定します。

位置づけしたZAIKOレコードのユーザデータを埋込み変数の値に変更します。

構成要素に対応する埋込み変数に格納するデータを設定します。

一連番号はHiRDB/SDが割り当てます。

親レコードTENPOへの位置づけ後に，子レコードZAIKOにレコード実現値を格納します。

レコード実現値の削除前に，削除するレコードに対して位置指示子を位置づけます。

位置づけしたZAIKOレコードのレコード実現値を削除します。

TENPOレコードはルートレコードのため，格納前にルートレコードのデータベースキーの値を埋込み変数に設定します。

ルートレコードのTENPOレコードを格納します。

キーの検索条件に指定する埋込み変数に，削除対象のルートレコードのデータベースキーの値を設定します。

レコード実現値の削除前に，削除するレコードに対して位置指示子を更新指定で位置づけます。削除するレコードはキーの検索条件で指定します。

位置指示子が位置づけられているレコード実現値を削除します。下位レコードがある場合は，下位レコードも同時に削除されます。

子レコードZAIKOの検索は，親レコードTENPOの位置づけ後に行います。更新指定で先頭のZAIKOレコードへの位置づけを行い，レコード実現値を埋込み変数ZAIKOに取得します。

現在位置づけられているZAIKOレコードの次のレコードに更新指定で位置づけを行い，レコード実現値を埋込み変数ZAIKOに取得します。

先頭のTENPOレコードへの位置づけを行い，レコード実現値を埋込み変数TENPOに取得します。

現在位置づけられているTENPOレコードの次のレコードに位置づけを行い，レコード実現値を埋込み変数TENPOに取得します。

ZAIKOレコードに位置づけがない場合は，先頭のZAIKOレコードに位置づけを行い，レコード実現値を埋込み変数ZAIKOに取得します。

位置づけられている場合は，位置づけられているZAIKOレコードの次のレコードに位置づけを行い，レコード実現値を埋込み変数ZAIKOに取得します。

埋込み変数からレコード実現値を取り出します。

SQLCODEが100かどうかを判定します。100の場合は，TENPOレコード下のすべてのZAIKOレコードの検索が完了しています。

SQLCODEが100かどうかを判定します。100の場合は，すべてのTENPOレコードの検索が完了しています。

SQLのROLLBACK文でトランザクションを取り消します。DMLを記述したUAPソースプログラムとは別のUAPソースプログラム（UAPSQL01）にROLLBACK文を記述します。

エラー要因を取得するため，SQLCODEをエラーメッセージに含めます。

エラーメッセージを出力します。

HiRDBのエラーメッセージを出力します。

エラーが発生した入力データを出力します。

トランザクションを取り消します。SQLのROLLBACK文は，DMLを記述したUAPソースプログラムとは別のUAPソースプログラム（UAPSQL01）に記述します。

■SQLを記述したCOBOLソースプログラム（UAPSQL01）のコーディング例

1       IDENTIFICATION DIVISION.
2       PROGRAM-ID. UAPSQL01.
3      *
4       ENVIRONMENT DIVISION.
5      *
6       INPUT-OUTPUT SECTION.
7       FILE-CONTROL.
8       SELECT O-FILE
9         ASSIGN TO './CT0.log'
10         LINE SEQUENTIAL.
11       DATA DIVISION.
12       FILE SECTION.
13       FD  O-FILE             DATA RECORD OUTREC.
14       01  OUTREC              PIC X(132).
15      *
16       WORKING-STORAGE SECTION.
17      *
18      *****************************************************************
19      ***   REQCODE FOR UAPSQL01                                    ***
20      *****************************************************************
21       77  REQSQL_CNCT        PIC X(4) VALUE 'CNCT'.
22       77  REQSQL_DISC        PIC X(4) VALUE 'DISC'.
23       77  REQSQL_COMT        PIC X(4) VALUE 'COMT'.
24       77  REQSQL_ROLB        PIC X(4) VALUE 'ROLB'.
25      *
26      *
27      *****************************************************************
28      ***   MESSAGE                                                 ***
29      *****************************************************************
30       01  MSG-ERRREQ.
31         02  FILLER           PIC X(80) VALUE
32                                '>>>   INVALID REQSQL "'.
33         02  ERRREQ           PIC X(4).
34         02  FILLER           PIC X(80) VALUE '" SPECIFIED'.
35      *
36       01  ERRSQL.
37         02  FILLER           PIC X(28) VALUE
38                                '>>>   SQL ERROR, SQLCODE = "'.
39         02  ERRCODE          PIC -ZZZZZZZZZ9.
40         02  FILLER           PIC X(12) VALUE '", SQLSTMT "'.
41         02  ERRSTMT          PIC X(4).
42         02  FILLER           PIC X(1) VALUE '"'.
43      *
44       LINKAGE SECTION.
45       77  REQSQL             PIC X(4).
46      *
47       PROCEDURE DIVISION     USING REQSQL. ←実行するSQLのリクエストを引数で受け取ります
48      *
49           OPEN OUTPUT O-FILE.
50      *
51           MOVE REQSQL TO ERRSTMT.
52           MOVE 0 TO RETURN-CODE.
53      *
54           EVALUATE REQSQL                  ←リクエストで実行するSQLの振り分け
55           WHEN REQSQL_CNCT
56             PERFORM PROC-CNCT              ←CONNECT処理の実行
57           WHEN REQSQL_DISC
58             PERFORM PROC-DISC              ←DISCONNECT処理の実行
59           WHEN REQSQL_COMT
60             PERFORM PROC-COMT              ←COMMIT処理の実行
61           WHEN REQSQL_ROLB
62             PERFORM PROC-ROLB              ←ROLLBACK処理の実行
63           WHEN OTHER
64             MOVE REQSQL TO ERRREQ
65             DISPLAY  MSG-ERRREQ UPON SYSOUT
66             MOVE 99 TO RETURN-CODE
67             GO TO OWARI
68           END-EVALUATE.
69      *
70       OWARI.
71           CLOSE O-FILE.
72           GOBACK.
73      *
74      *****************************************************************
75      ***   CONNECT                                                 ***
76      *****************************************************************
77       PROC-CNCT SECTION.
78           EXEC SQL
79             CONNECT
80           END-EXEC.
81           IF SQLCODE < 0                 ←SQLの実行結果の判定
82           THEN
83             MOVE SQLCODE TO ERRCODE
84             DISPLAY  ERRSQL UPON SYSOUT
85             MOVE SQLCODE TO RETURN-CODE
86           ELSE
87             CONTINUE
88           END-IF.
89      *****************************************************************
90      ***   DISCONNECT                                              ***
91      *****************************************************************
92       PROC-DISC SECTION.
93           EXEC SQL
94             DISCONNECT
95           END-EXEC.
96           IF SQLCODE < 0                 ←SQLの実行結果の判定
97           THEN
98             MOVE SQLCODE TO ERRCODE
99             DISPLAY  ERRSQL UPON SYSOUT
100             MOVE SQLCODE TO RETURN-CODE
101           ELSE
102             CONTINUE
103           END-IF.
104      *****************************************************************
105      ***   COMMIT                                                  ***
106      *****************************************************************
107       PROC-COMT SECTION.
108           EXEC SQL
109             COMMIT
110           END-EXEC.
111           IF SQLCODE < 0                 ←SQLの実行結果の判定
112           THEN
113             MOVE SQLCODE TO ERRCODE
114             DISPLAY  ERRSQL UPON SYSOUT
115             MOVE SQLCODE TO RETURN-CODE
116           ELSE
117             CONTINUE
118           END-IF.
119      *****************************************************************
120      ***   ROLLBACK                                                ***
121      *****************************************************************
122       PROC-ROLB SECTION.
123           EXEC SQL
124             ROLLBACK
125           END-EXEC.
126           IF SQLCODE < 0                 ←SQLの実行結果の判定
127           THEN
128             MOVE SQLCODE TO ERRCODE
129             DISPLAY  ERRSQL UPON SYSOUT
130             MOVE SQLCODE TO RETURN-CODE
131           ELSE
132             CONTINUE
133           END-IF.

2.13　2進項目をビッグエンディアン形式にするUAPを作成する場合の注意事項

COBOL2002のコンパイラオプションに-BigEndian,Binオプション（COBOL85のコンパイラオプションの場合は-Bbオプション）を指定して，2進項目をビッグエンディアン形式にする場合，2進項目の埋込み変数をリトルエンディアン形式にする必要があります。そのため，埋込み変数の宣言時，UAPのプリプロセスおよびコンパイル時に次のことをしてください。

埋込み変数の宣言時にすること

データ型がINTEGERまたはSMALLINTの埋込み変数を宣言する場合，データ記述項のUSAGE句にCOMPUTATIONAL-5またはCOMP-5を指定してください。詳細については，「2.4.2(2)　DMLのデータ型とCOBOL言語のデータ記述項の対応」を参照してください。

UAPのプリプロセス時にすること

UAPのプリプロセスを実行する際，-Xbオプションを指定してpdsdbcblコマンドを実行してください。-Xbオプションについては，「6.2　コマンドの形式」を参照してください。

UAPのコンパイル時にすること

UAPのコンパイルを実行する際，COBOL2002のコンパイラオプションに-Comp5オプション（COBOL85のコンパイラオプションの場合は-X5オプション）を指定してください。詳細については，「3.4.1(2)　コンパイラオプションの指定を確認する」を参照してください。

2.14　性能向上，操作性向上に関する機能

性能向上，操作性向上に関する次の機能を使用できます。

自動再接続機能

自動再接続機能とは，サーバプロセスダウン，系切り替え，ネットワーク障害などの要因によるHiRDBサーバとの接続障害を検知した場合に，自動的にUAPの再接続を行う機能です。自動再接続機能を使用すると，HiRDBサーバとの接続の切断を意識しないで，UAPの実行を継続できます。自動再接続機能については，マニュアル「HiRDB UAP開発ガイド」の「自動再接続機能」を参照してください。

なお，性能向上，操作性向上に関する次の機能は使用できません。

ブロック転送機能

複数接続機能

マルチスレッド対応

上記の機能については，マニュアル「HiRDB UAP開発ガイド」を参照してください。

3　UAPの実行前準備（UAPのプリプロセス，コンパイル，リンケージ）

この章では，UAPのプリプロセス，コンパイル，およびリンケージの方法について説明します。

3.1　プリプロセス，コンパイル，およびリンケージの実行環境の構築

DMLを記述したUAPをプリプロセス，コンパイル，およびリンケージする実行環境の構築について説明します。

プリプロセスを実行するマシンには，次の製品をインストールして環境設定をする必要があります。

HiRDB Structured Data Access Facility/Developer's Kit

上記製品のインストールおよび環境設定方法は，HiRDBクライアントのインストールおよび環境設定方法と同じです。HiRDBクライアントのインストールおよび環境設定方法については，マニュアル「HiRDB UAP開発ガイド」の「クライアントの環境設定」を参照してください。

また，コンパイルおよびリンケージを実行するマシンには，次の製品をインストールして環境設定をする必要があります。

HiRDB Structured Data Access Facility/Developer's Kit

COBOL2002 Net Server Suite(64)

3.2　UAPのプリプロセス，コンパイル，リンケージの流れ

DMLを記述したCOBOLソースプログラムを，DMLプリプロセサ（pdsdbcblコマンド）でポストソースに変換します。そのポストソースをCOBOLコンパイラでコンパイルおよびリンケージすると，UAPの実行可能ファイルが作成されます。UAPの実行可能ファイル作成までの流れを次の図に示します。

図3‒1　UAPの実行可能ファイル作成までの流れ

各工程の説明を次に示します。

プリプロセス

COBOLソースプログラム中に記述されているDMLを，COBOLコンパイラでコンパイルできるCOBOL言語の命令に置換し，その実行結果をポストソースとして出力します。

DMLが記述されたCOBOLソースプログラムは，そのままの状態ではCOBOLコンパイラでコンパイルできません。DMLプリプロセサによるプリプロセスを実行してポストソースを出力し，そのポストソースをCOBOLコンパイラでコンパイルします。

プリプロセスを実行する際には，次のファイルをDMLプリプロセサの入力情報にします。

COBOLソースプログラムを格納したUAPソースファイル

SDBディレクトリ情報ファイル

登録集原文ファイル

プリプロセスを実行するコマンドは，pdsdbcblコマンドです。

コンパイル，リンケージ

プリプロセスの結果，出力されたポストソースファイル，および登録集原文ファイルを入力情報にして，COBOLコンパイラでコンパイルおよびリンケージを実行します。

ポストソースには登録集原文を取り込むCOPY文が展開されます。そのため，ポストソースをコンパイルする際には，これらの登録集原文を格納したディレクトリの絶対パスを環境変数CBLLIBに追加してください。

コンパイルを実行すると，UAPのオブジェクトがオブジェクトファイルに出力されます。UAPのオブジェクトファイル，COBOL2002ライブラリ，およびHiRDBクライアントライブラリを入力情報にしてリンケージを実行し，UAPの実行可能ファイルを作成します。

コンパイルを実行するコマンドは，COBOLのccbl2002コマンドまたはccblコマンドです。リンケージを実行するコマンドは，ldコマンドです。

参考

COBOL2002のコンパイラオプションで，リンケージまで行うかを指定できます。リンケージを行う場合はCOBOL2002がリンカ（ldコマンド）を呼び出します。

3.3　プリプロセスの実行

DMLを記述したUAPのプリプロセスの実行方法について説明します。

3.3.1　プリプロセスを実行するための準備作業

プリプロセスを実行する前に，ここで説明する準備作業を実施してください。

(1)　環境変数を設定する

HiRDBクライアントで次の環境変数を設定してください。

PDCLTLANG

PDCLTLANGにSJIS（シフトJIS漢字コード）を指定してください。

PDCLTLANGについては，マニュアル「HiRDB UAP開発ガイド」の「クライアント環境定義の設定内容」を参照してください。

PATH

環境変数PATHに次のディレクトリを追加してください。

HiRDBクライアントのサーバマシンでプリプロセスを実行する場合

/opt/HiRDB/client/utl/

HiRDBサーバのサーバマシンでプリプロセスを実行する場合

$PDDIR/client/utl/

(2)　SDBディレクトリ情報ファイルを準備する

プリプロセスを実行する際，COBOLソースプログラム中のSDBデータベース節に記述したSDBデータベースのSDBディレクトリ情報が必要になります。そのSDBデータベースの定義が格納されているSDBディレクトリ情報ファイルを準備してください。

注意事項

HiRDB Structured Data Access Facilityのバージョン09-66以降で出力したSDBディレクトリ情報ファイルを準備してください。

3.3.2　プリプロセスの実行例

pdsdbcblコマンドでプリプロセスを実行します。プリプロセスの実行例を次に示します。

例1

DMLを記述したUAP（UAPソースファイル名：uap01.ecb）をプリプロセスして，ポストソースを作成します。

コマンドの実行例

pdsdbcbl /UAPsrc/DMLsrc/uap01.ecb -d /dirinf/pdsdbdir

［説明］

/UAPsrc/DMLsrc/uap01.ecb：

プリプロセス対象のUAPソースファイル名を指定します。

-d /dirinf/pdsdbdir：

「3.3.1(2)　SDBディレクトリ情報ファイルを準備する」で準備した，SDBディレクトリ情報ファイル名を指定します。

例2

DMLを記述したUAP（UAPソースファイル名：uap02.ecb）をプリプロセスして，ポストソースを作成します。

なお，uap02.ecbは，COBOL2002のコンパイラオプションに-BigEndian,Binオプション（COBOL85のコンパイラオプションの場合は-Bbオプション）を指定して，2進項目をビッグエンディアン形式にするUAPです。

コマンドの実行例

pdsdbcbl /UAPsrc/DMLsrc/uap02.ecb -d /dirinf/pdsdbdir -Xb

［説明］

/UAPsrc/DMLsrc/uap02.ecb：

プリプロセス対象のUAPソースファイル名を指定します。

-d /dirinf/pdsdbdir：

「3.3.1(2)　SDBディレクトリ情報ファイルを準備する」で準備した，SDBディレクトリ情報ファイル名を指定します。

-Xb：

COBOL2002のコンパイラオプションに-BigEndian,Binオプション（COBOL85のコンパイラオプションの場合は-Bbオプション）を指定して，2進項目をビッグエンディアン形式にするUAPを作成する場合に指定するオプションです。

2進項目をビッグエンディアン形式にするUAPを作成する場合の注意事項については，「2.13　2進項目をビッグエンディアン形式にするUAPを作成する場合の注意事項」を参照してください。

参考

pdsdbcblコマンドの機能詳細，各オプションについては，「6.　DMLプリプロセサ（pdsdbcblコマンド）」を参照してください。

SQLを記述したUAPのプリプロセス方法については，マニュアル「HiRDB UAP開発ガイド」の「プリプロセス」を参照してください。

3.3.3　プリプロセスエラーが発生した場合の対処

プリプロセスエラーが発生した場合，標準エラー出力にエラーメッセージが出力されます。そのエラーメッセージの対処に従って，COBOLソースプログラムのデバッグを実施してください。

プリプロセスエラーが発生した場合のエラーメッセージの出力例を次に示します。

エラーメッセージの出力例

/UAPsrc/DMLsrc/uap01.ecb:
pdsdbcbl: /UAPsrc/DMLsrc/uap01.ecb, 23: KFPB65415-E: The specified SDB database name "DATABASE01" was not found in SDB directory information
pdsdbcbl: /UAPsrc/DMLsrc/uap01.ecb, *: KFPB65000-I: DML preprocessing was ended, return code = 8

［説明］

下線部には，プリプロセスを実行したUAPソースファイル名が出力されます。pdsdbcblコマンドに指定したパスの形式で出力されます。

色が付いている部分（例中の23）には，UAPソースファイル内のエラーの原因となった行の行番号が出力されます。エラーの原因が特定の行に起因しない場合は，行番号にアスタリスク（*）が出力されます。

KFPB65000-Iメッセージには，pdsdbcblコマンドのリターンコードが出力されます。

pdsdbcblコマンドのオプション指定誤りの場合や，コマンドの実行環境によるエラーの場合などは，メッセージ中にUAPソースファイル名が出力されません。

3.4　コンパイルおよびリンケージの実行

コンパイルおよびリンケージの実行方法について説明します。

3.4.1　コンパイルおよびリンケージを実行するための準備作業

コンパイルおよびリンケージを実行する前に，ここで説明する準備作業を実施してください。

(1)　環境変数を設定する

次の環境変数を設定してください。

CBLLIB

ポストソースには，HiRDB/SDが提供する登録集原文を取り込むCOPY命令が展開されます。そのため，登録集原文を格納したディレクトリの絶対パスを，環境変数CBLLIBに追加してください。

(2)　コンパイラオプションの指定を確認する

次のことを確認してください。

UAPのプリプロセスの実行時，-Xbオプションを指定してpdsdbcblコマンドを実行した場合，COBOLコンパイラのコンパイラオプションに-BigEndian,Binオプションと-Comp5オプション※を指定してください。

注※

COBOL85のコンパイラオプションの場合は，-Bbオプションと-X5オプションを指定してください。

オプションを指定する理由については，「2.13　2進項目をビッグエンディアン形式にするUAPを作成する場合の注意事項」を参照してください。

DMLを記述したUAPをコンパイルする際，COBOL2002のコンパイラオプションの-DynamicLinkオプションの指定は次のどちらかにしてください。

-DynamicLinkオプションを指定しない

-DynamicLink,IdentCallオプションを指定する（一意名指定のCALL文だけを動的なリンクとする）

(3)　コンパイル時に指定するHiRDBが提供するライブラリを確認する

コンパイルおよびリンケージをする際，次に示すHiRDBが提供するライブラリを指定する必要があります。

XAインタフェースを使用する場合

libzcltys64.so（シングルスレッド対応）

XAインタフェースを使用しない場合

libzcltk64.so

(4)　トランザクションオブジェクトファイルを作成する

OpenTP1環境下で実行するUAPの場合，トランザクションオブジェクトファイルを作成してください。UAPのコンパイルおよびリンケージをする際に，作成したトランザクションオブジェクトファイルを指定します。

詳細については，マニュアル「HiRDB UAP開発ガイド」の「X/Openに従ったAPI（TX_関数）を使用したUAPの実行」の「OpenTP1を使用する場合」の「COBOL言語の場合」を参照してください。

3.4.2　ccbl2002コマンドの指定形式

コンパイルおよびリンケージをするには，ccbl2002コマンドを実行します。ccbl2002コマンドの指定形式を次に示します。

指定形式

ccbl2002 ［オプション］ ポストソースファイル名　ディレクトリ　提供ライブラリ

オプション：

ccbl2002コマンドのオプションを指定します。

ccbl2002コマンドのオプションについては，マニュアル「COBOL2002　使用の手引　手引編」の「ccbl2002コマンド」を参照してください。

注意事項

UAPのプリプロセスの実行時，-Xbオプションを指定してpdsdbcblコマンドを実行した場合，コンパイラオプションに-BigEndian,Binオプションと-Comp5オプション※を指定してください。

オプションを指定する理由については，「2.13　2進項目をビッグエンディアン形式にするUAPを作成する場合の注意事項」を参照してください。

注※

COBOL85のコンパイラオプションの場合は，-Bbオプションと-X5オプションを指定してください。

ポストソースファイル名：

コンパイルおよびリンケージを実行するポストソースファイルの名称を指定します。

ディレクトリ：

インクルードディレクトリ（HiRDBが提供するライブラリのヘッダファイルがあるディレクトリ）を指定します。

提供ライブラリ：

HiRDBが提供するライブラリを指定します。「3.4.1(3)　コンパイル時に指定するHiRDBが提供するライブラリを確認する」で確認したライブラリを指定します。

3.4.3　コンパイルおよびリンケージの実行例

例

ポストソースファイル（uap01.cbl）のコンパイルおよびリンケージを実行します。

CBLLIB=/HiRDB/include                                                 ...1
export CBLLIB                                                         ...2
ccbl2002 -Compati85,All uap01.cbl -L/HiRDB/client/lib -lzcltk64.so    ...3

［説明］

環境変数CBLLIBに，登録集原文の検索先ディレクトリを指定します。下線部分は，HiRDB Structured Data Access Facility/Developer's Kitのインストールディレクトリです。

環境変数CBLLIBを設定します。

ccbl2002コマンドを実行します。

3.4.4　コンパイルエラーまたはリンケージエラーが発生した場合の対処

コンパイルエラーまたはリンケージエラーが発生した場合，標準エラー出力にエラーメッセージが出力されます。出力されたメッセージに従って対処してください。

3.5　DMLとSQLを実行するUAPをプリプロセス，コンパイル，およびリンケージする場合

DMLとSQLの両方を実行するUAPをプリプロセス，コンパイル，およびリンケージする方法について説明します。

3.5.1　UAPのプリプロセス，コンパイル，リンケージの流れ

DMLとSQLの両方を実行するUAPをプリプロセス，コンパイル，およびリンケージする際の流れを次の図に示します。

図3‒2　DMLとSQLの両方を実行するUAPをプリプロセス，コンパイル，およびリンケージする際の流れ

3.5.2　プリプロセス，コンパイル，リンケージの実行例

例

DMLとSQLの両方を実行するUAPの実行可能ファイルを作成します。

DMLを記述したUAPのUAPソースファイル名をuapdml01.ecbとします。SQLを記述したUAPのUAPソースファイル名をuapsql01.ecbとします。

手順を次に示します。

(1)　DMLを記述したUAPのプリプロセスを実行する

pdsdbcblコマンドで，DMLを記述したUAPのプリプロセスを実行します。

コマンド実行例

pdsdbcbl /UAPsrc/DMLsrc/uapdml01.ecb -d /dirinf/pdsdbdir

［説明］

/UAPsrc/DMLsrc/uapdml01.ecb：

プリプロセス対象のUAPソースファイル名を指定します。

-d /dirinf/pdsdbdir：

「3.3.1(2)　SDBディレクトリ情報ファイルを準備する」で準備した，SDBディレクトリ情報ファイル名を指定します。

(2)　SQLを記述したUAPのプリプロセスを実行する

pdcblコマンドで，SQLを記述したUAPのプリプロセスを実行します。

コマンド実行例

pdcbl uapsql01.ecb -h64

［説明］

uapsql01.ecb：

プリプロセス対象のUAPソースファイル名を指定します。

-h64：

64ビットモード用のポストソースを作成するために指定します。必ず指定する必要があります。

pdcblコマンドの詳細については，マニュアル「HiRDB UAP開発ガイド」の「UNIX環境でのプリプロセス」の「COBOL言語の場合」を参照してください。

(3)　ポストソースのコンパイルおよびリンケージを実行する

ccbl2002コマンドで，(1)と(2)で作成したポストソース（uapdml01.cbl，uapsql01.cbl）のコンパイルおよびリンケージを実行します。

コマンド実行例

CBLLIB=/HiRDB/include                       ...1
export CBLLIB                               ...2
ccbl2002 -Compati85,All uapsql01.cbl uapdml01.cbl -L/HiRDB/client/lib
         -libzcltk.so -OutputFile uap01     ...3

［説明］

環境変数CBLLIBに，登録集原文の検索先ディレクトリを指定します。下線部分は，HiRDB Structured Data Access Facility/Developer's Kitのインストールディレクトリです。

環境変数CBLLIBを設定します。

ccbl2002コマンドを実行します。

4　UAPの実行環境の構築

この章では，HiRDBクライアントの環境設定方法，UAPをテストする際のUAPの実行方法，およびテスト環境から本番環境へのUAPの移行方法について説明します。

4.1　HiRDBクライアントの環境設定

DMLを記述したUAPを実行するには，HiRDBクライアントの環境設定が必要になります。UAPの実行環境（テスト環境または本番環境）を構築する際は，HiRDBクライアントの環境設定をしてください。

4.1.1　HiRDBクライアントのインストール

UAPを実行するマシンに，次のどちらかのHiRDBクライアントをインストールしてください。

HiRDB Structured Data Access Facility/Run Time

HiRDB Structured Data Access Facility/Developer's Kit

HiRDBクライアントのインストール方法については，マニュアル「HiRDB UAP開発ガイド」の「HiRDBクライアントのインストール」を参照してください。

HiRDBクライアントをインストールしたあとのディレクトリおよびファイル構成については，マニュアル「HiRDB 構造型データベース機能」の「HiRDBクライアントの環境設定」の「HiRDBクライアントのディレクトリおよびファイル構成」を参照してください。

なお，DNSを利用していない場合は，HiRDBクライアントをインストールしたあとにhostsファイルを設定する必要があります。hostsファイルの設定方法については，マニュアル「HiRDB UAP開発ガイド」の「hostsファイルの設定」を参照してください。

4.1.2　環境変数の設定

HiRDBクライアントをインストールしたマシンで，次の環境変数を設定してください。

LANG

ja_JP.SJISを指定してください。

LD_LIBRARY_PATH

$PDDIR/client/libを追加してください。

4.1.3　クライアント環境定義の設定

HiRDBクライアントをインストールしたマシンで，クライアント環境定義を設定してください。クライアント環境定義の設定方法については，マニュアル「HiRDB UAP開発ガイド」の「クライアント環境定義（環境変数の設定）」を参照してください。

クライアント環境定義の各オペランドの指定内容については，次のマニュアルを参照してください。

マニュアル「HiRDB UAP開発ガイド」の「クライアント環境定義の設定内容」

マニュアル「HiRDB 構造型データベース機能」の「クライアント環境定義（環境変数の設定）」の「そのほかのクライアント環境定義」

注意事項

クライアント環境定義のPDLANGには，SJIS（シフトJIS漢字コード）を指定してください。

クライアント環境定義のオペランドのうち，指定が無効になるオペランドがあります。詳細については，マニュアル「HiRDB 構造型データベース機能」の「クライアント環境定義（環境変数の設定）」の「クライアント環境定義の一覧」を参照してください。

4.2　UAPのテストの実行

UAPの実行環境を構築したら，UAPを実行してUAPのテストを実施してください。

OpenTP1環境下でのUAPの実行方法については，マニュアル「OpenTP1 プログラム作成リファレンス COBOL言語編」の「アプリケーションプログラムの開始と終了」を参照してください。

COBOLの実行可能ファイルとして実行するUAPの場合は，UAPの実行可能ファイルを直接起動してUAPを実行します。

SDBデータベースにアクセスする部分のUAPのCOBOLソースプログラムを修正した場合，そのUAPソースファイルの再プリプロセスと再コンパイルが必要になります。また，UAPの再リンケージも必要になります。

4.3　テスト環境から本番環境へのUAPの移行

テストが完了したUAPをテスト環境から本番環境に移行する際の手順を説明します。

例

SDBデータベース（DATABASE01）にアクセスするUAPを，テスト環境から本番環境に移行します。

DATABASE01は，新たに定義したSDBデータベースとします。

UAPをテスト環境から本番環境に移行する際の手順を次に示します。

手順

テスト環境で定義したSDBデータベース（DATABASE01）のSDB定義文を，テスト環境から本番環境にコピーします。

1.でコピーしたSDB定義文を使用して，SDBデータベース（DATABASE01）を本番環境で新たに定義します。

実行可能ファイルまたは共用ライブラリをテスト環境から本番環境にコピーします。

5　UAPの運用・保守

この章では，UAPの実行方法，UAPの再プリプロセスが必要なケース，およびUAPの障害対策について説明します。

5.1　UAPの実行

OpenTP1環境下でのUAPの実行方法については，マニュアル「OpenTP1 プログラム作成リファレンス COBOL言語編」の「アプリケーションプログラムの開始と終了」を参照してください。

COBOLの実行可能ファイルとして実行するUAPの場合は，UAPの実行可能ファイルを直接起動してUAPを実行します。

5.2　UAPの再プリプロセス，再コンパイル，再リンケージが必要なケース

次に示す場合は，SDBデータベースにアクセスする部分のUAPソースファイルの再プリプロセスと再コンパイルが必要になります。また，UAPの再リンケージも必要になります。

SDBデータベースの定義を変更した場合

SDBデータベース節に指定しているSDBデータベースの定義を変更した場合，そのUAPソースファイルの再プリプロセスと再コンパイルが必要になります。また，UAPの再リンケージも必要になります。

DMLの記述を変更した場合

DMLの記述を変更した場合，そのUAPソースファイルの再プリプロセスと再コンパイルが必要になります。また，UAPの再リンケージも必要になります。

機能追加などによって，SDBデータベースにアクセスする部分のUAPを改修した場合

機能追加などによって，SDBデータベースにアクセスする部分のUAPを改修した場合，そのUAPソースファイルの再プリプロセスと再コンパイルが必要になります。また，UAPの再リンケージも必要になります。

HiRDB/SDをバージョンアップして，HiRDB/SDの新機能を使用する場合

HiRDB/SDが提供しているAPIは上位互換性があります。そのため，基本的にはHiRDB/SDをバージョンアップしてもUAPの修正は必要ありません。ただし，HiRDB/SDの新機能を使用する場合は，UAPソースファイルの再プリプロセスと再コンパイルが必要になります。また，UAPの再リンケージも必要になります。

5.3　UAPの障害対策

UAPに障害が発生した場合，次に示すトラブルシュート機能を使用して障害要因を調査してください。

SQLトレース機能

クライアントエラーログ機能

拡張SQLエラー情報出力機能

UAP統計レポート機能

上記のトラブルシュート機能に出力される情報については，マニュアル「HiRDB 構造型データベース機能」の「UAPの障害対策」を参照してください。

ポイント

SDBデータベースにアクセスする部分のUAPのCOBOLソースプログラムを修正した場合，そのUAPソースファイルの再プリプロセスと再コンパイルが必要になります。また，UAPの再リンケージも必要になります。

6　DMLプリプロセサ（pdsdbcblコマンド）

この章では，DMLプリプロセサ（pdsdbcblコマンド）の機能と使い方について説明します。

6.1　機能

DMLプリプロセサを実行して，DMLを記述したUAPのプリプロセスを行います。

DMLプリプロセサを実行すると，COBOLソースプログラム中に記述されているDMLをCOBOL命令に置換し，その実行結果をポストソースとして出力します。これをUAPのプリプロセスといいます。

なお，この章では，DMLプリプロセサをpdsdbcblコマンドと表記します。

6.1.1　UAPのプリプロセス

DMLが記述されたCOBOLソースプログラムは，そのままの状態ではCOBOLコンパイラでコンパイルすることはできません。pdsdbcblコマンドによって，UAPのプリプロセスを実行してポストソースを出力し，そのポストソースをCOBOLコンパイラでコンパイルします。

なお，pdsdbcblコマンドによるプリプロセスを実行できるUAPは，COBOL言語で記述された埋込み型UAPです。

pdsdbcblコマンドによるプリプロセスの概要を次の図に示します。

図6‒1　pdsdbcblコマンドによるプリプロセスの概要

［説明］

SDBディレクトリ情報ファイル中のSDBデータベースの定義情報を参照し，DMLの記述内容とSDBデータベースの定義情報の整合性が取れているかをチェックします。

DMLをCOBOL命令に置換し，その実行結果（ポストソース）をポストソースファイルに出力します。

エラーを検出した場合，エラーメッセージが標準エラー出力に出力されます。pdsdbcblコマンドが異常終了した場合は，簡易ダンプが出力されます。

pdsdbcblコマンドによるプリプロセス時の入出力ファイルを次に説明します。

入力ファイル

UAPソースファイル

DMLが記述されているCOBOLソースプログラムを格納しているファイルです。UAPソースファイルのファイル拡張子は，「.ecb」になります。

SDBディレクトリ情報ファイル

pdsdbcblコマンドによるプリプロセスの際，COBOLソースプログラム中に記述されたDMLとSDBデータベース定義との整合性をチェックするために，SDBディレクトリ情報ファイルを参照します。

登録集原文ファイル

pdsdbcblコマンドによるプリプロセスの際，COBOLソースプログラム中に記述されたCOPY文に従って取り込まれる，登録集原文が登録されているファイルです。

注意事項

プリプロセスの実行時に使用するSDBデータベースの定義情報と，UAPの実行時に使用するSDBデータベースの定義情報には，同じ定義情報を使用してください。

出力ファイル

ポストソースファイル

pdsdbcblコマンドによるプリプロセスを実行すると，DMLをCOBOL命令に置換したポストソースがポストソースファイルに出力されます。ポストソースファイルの名称は，UAPソースファイルのファイル拡張子を「cbl」に変更したファイル名になります。

（例）uap01.ecb → uap01.cbl

なお，プリプロセス時に同じファイル名のポストソースファイルがある場合，そのポストソースファイルが上書きされます。

簡易ダンプファイル

pdsdbcblコマンドが異常終了した場合に，簡易ダンプが出力されるファイルです。簡易ダンプについては，「6.6　トラブルシューティング」を参照してください。

注意事項

プリプロセスで使用する入出力ファイル，およびディレクトリには，読み込み，書き込みができるように，用途ごとに権限を設定してください。

6.1.2　プリプロセス時にチェックされない項目

pdsdbcblコマンドによるプリプロセス時に，次に示す内容はチェックされません。

DMLの実行順序に起因するエラー

例えば，MODIFY文でレコード実現値を更新する際，更新対象のレコードにFIND文などで位置づけしていなくても，プリプロセス時にはチェックされません。この場合，UAPの実行時にエラーになります。

埋込み変数の内容に起因するエラー

例えば，埋込み変数の内容が，対応するレコード型の構成要素のデータ型のデータ形式に合っていなくても，プリプロセス時にはチェックされません。この場合，UAPの実行時にエラーになります。

6.2　コマンドの形式

UAPのプリプロセスを実行するpdsdbcblコマンドの形式を次に示します。

形式

pdsdbcbl UAPソースファイル名
         -d SDBディレクトリ情報ファイル名
       〔-Xb〕

UAPソースファイル名：

〜＜パス名＞

プリプロセスを実行するCOBOLソースプログラムを格納しているUAPソースファイルの名称を，絶対パスまたは相対パスで指定します。

指定できるUAPソースファイルのファイル拡張子は，「.ecb」になります。

指定規則を次に示します。

UAPソースファイルのパスの最大長は1,023バイトです。

ファイル名，およびディレクトリ名の最大長は，OSの仕様に従います。

UAPソースファイル名を複数回指定した場合，最後に指定したUAPソースファイル名が有効になります。

-d SDBディレクトリ情報ファイル名：

〜＜パス名＞

COBOLソースプログラム中に指定しているSDBデータベースの定義情報が格納されているSDBディレクトリ情報ファイルの名称を，絶対パスまたは相対パスで指定します。

注意事項

プリプロセスに使用するSDBディレクトリ情報ファイルが，pdsdbdefコマンドのdirinf文に指定しているディレクトリにある場合（-dオプションに，pdsdbdefコマンドのdirinf文に指定しているディレクトリと同じディレクトリを指定している場合），pdsdbcblコマンドとpdsdbdefコマンドを同時に実行しないでください。

指定規則を次に示します。

SDBディレクトリ情報ファイルのファイル名は，「pdsdbdir」にしてください。

SDBディレクトリ情報ファイルのパスの最大長は1,023バイトです。

ファイル名，およびディレクトリ名の最大長は，OSの仕様に従います。

-dオプションを複数回指定した場合，最後に指定した-dオプションの指定が有効になります。

-Xb：

COBOL2002のコンパイラオプションに-BigEndian,Binオプション（COBOL85のコンパイラオプションの場合は-Bbオプション）を指定して，2進項目をビッグエンディアン形式にするUAPを作成する場合に，このオプションを指定してください。

2進項目をビッグエンディアン形式にするUAPを作成する場合の注意事項については，「2.13　2進項目をビッグエンディアン形式にするUAPを作成する場合の注意事項」を参照してください。

なお，-Xbオプションは複数回指定しても有効になります。

■コマンドの指定規則

UAPソースファイル名，およびオプションの指定順序は任意です。

オプションは大文字，小文字を区別しません。

pdsdbcblコマンドに指定できる引数リストの長さの上限は，4,096バイトです。

6.3　プリプロセス実行前の準備作業

プリプロセスを実行する前に，ここで説明する準備作業をしてください。

6.3.1　環境変数の設定

プリプロセスを実行する前に，次の環境変数を設定してください。

PDCLTLANG

文字コード種別にシフトJIS漢字を使用します。PDCLTLANGにSJISを指定してください。

PDCBLLIB

COPY文を使用する場合，COPY文に従ってCOBOLソースプログラムに取り込む登録集原文を検索するディレクトリを指定します。環境変数PDCBLLIBについては，マニュアル「HiRDB UAP開発ガイド」の「UNIX環境でのプリプロセス」の「COBOL言語の場合」を参照してください。その際，「SQL」は「DML」に読み替えてください。

環境変数PDCBLLIBに複数のディレクトリを指定する場合，指定できるディレクトリのパス名の合計長は，最大で4,095バイトです（区切り文字のコロン（:）を含む）。なお，プリプロセス時に保証するディレクトリ数は，設定した順で最大10個となります。

4,095バイトを超えた場合は，環境変数PDCBLLIBの指定がない場合と同様に動作します。

ディレクトリのパス名の合計長が4,095バイトを超えている場合，プリプロセスでの最初のCOPY文解析時に，環境変数PDCBLLIBに設定したディレクトリのパス名の合計長が長過ぎる旨のメッセージが出力されます。

PDCLTPATH

pdsdbcblコマンドが異常終了した場合に，pdsdbcblコマンドが出力する簡易ダンプの出力先ディレクトリのパス名を指定します。環境変数PDCLTPATHについては，マニュアル「HiRDB UAP開発ガイド」の「クライアント環境定義の設定内容」を参照してください。

簡易ダンプについては，「6.6　トラブルシューティング」を参照してください。

PATH

環境変数PATHに次のディレクトリを追加してください。

HiRDBクライアントのサーバマシンでプリプロセスを実行する場合

/opt/HiRDB/client/utl/

HiRDBサーバのサーバマシンでプリプロセスを実行する場合

$PDDIR/client/utl/

6.3.2　SDBディレクトリ情報ファイルの準備

プリプロセス対象のUAPがアクセスするSDBデータベースの定義情報が格納されているSDBディレクトリ情報ファイルを準備してください。pdsdbcblコマンドの-dオプションに，SDBディレクトリ情報ファイルのパスを指定します。

注意事項

HiRDB Structured Data Access Facilityのバージョン09-66以降で出力したSDBディレクトリ情報ファイルを使用してください。

6.4　注意事項

DML中に記述している名前が引用符（"）で囲まれていない場合，名前中の英小文字は英大文字に変換されます。英大文字に変換された識別子は，英大文字のままメッセージやポストソースに出力されます。

例えば，SDBデータベース名や，埋込み変数の指定などが該当します。これらの指定を引用符で囲まない場合，英小文字は英大文字に変換されます。

COBOL登録集原文ファイルに次の記述はできません。

DML

SDBデータベース節

COBOL埋込み型UAPのプリプロセスでは，登録集原文を埋込み変数の宣言に使用できます。登録集原文で埋込み変数を宣言する場合，COBOLソースプログラムの次の節にCOPY文を記述して，COPY文で指定した登録集原文のファイルの中に埋込み変数を宣言する命令を記述してください。

作業場所節（WORKING-STORAGE SECTION）

連絡節（LINKAGE SECTION）

pdsdbcblコマンドでは，COBOLソースプログラムの次の節に記述されたCOPY文だけを解析します。そのほかの節に書かれたCOPY文は無視されます。

作業場所節（WORKING-STORAGE SECTION）

連絡節（LINKAGE SECTION）

なお，上記の節に記述したCOPY文が，登録集原文内に入れ子の形で記述されている場合，そのCOPY文も解析対象となります。COPY文の入れ子の形については，「2.10.7　登録集原文の制限」の「図2-10　COPY文の入れ子のレベルの数え方」を参照してください。

登録集原文の検索先ディレクトリを，環境変数PDCBLLIBに指定してください。PDCBLLIBについては，「6.3.1　環境変数の設定」を参照してください。

pdsdbcblコマンドを実行する際，カレントディレクトリは書き込みできる状態にしておいてください。

6.5　リターンコード

pdsdbcblコマンドのリターンコードの意味および対処を次の表に示します。

表6‒1　pdsdbcblコマンドのリターンコードの意味および対処

リターンコード

意味

対処

0

pdsdbcblコマンドが正常終了しました。

なし。

8

pdsdbcblコマンドの処理が完了しました。ただし，エラーを検知したため，ポストソースの出力を中止しました。

出力されたメッセージの対処に従ってエラー原因を取り除いてください。

エラーの原因を取り除いたあとで，再度プリプロセスを実行してください。

12

処理が続行できないエラーが発生し，pdsdbcblコマンドが異常終了しました。

6.6　トラブルシューティング

pdsdbcblコマンドが異常終了した場合，KFPB65400-Eメッセージが出力されます。KFPB65400-Eメッセージ中に出力されたアボートコードを参照してエラーの対処をしてください。

また，pdsdbcblコマンドが異常終了した場合，簡易ダンプが出力されます。

簡易ダンプの出力先

簡易ダンプは環境変数PDCLTPATHで指定されたディレクトリに出力されます。次の場合はカレントディレクトリに出力されます。

環境変数PDCLTPATHの定義がない場合

環境変数PDCLTPATHで指定されたディレクトリに書き込みができなかった場合

簡易ダンプファイル名

次の形式で出力されます。

pdsdbcbl.abort.yyyymmddhhmmss.プロセスID

yyyymmddhhmmss：簡易ダンプの出力日時

プロセスID：1〜10バイト

6.7　使用例

例題

DMLを記述したUAP（UAPソースファイル名：uap01.ecb）をプリプロセスして，ポストソースを作成します。

コマンドの実行例

pdsdbcbl /UAPsrc/DMLsrc/uap01.ecb -d /dirinf/pdsdbdir

［説明］

/UAPsrc/DMLsrc/uap01.ecb：

プリプロセス対象のCOBOLソースプログラムを格納しているUAPソースファイル名を絶対パスで指定します。

-d /dirinf/pdsdbdir：

SDBディレクトリ情報ファイル名を指定します。

■pdsdbcblコマンドの実行結果の出力例

pdsdbcblコマンドの実行結果の出力例を次に示します。

（例1）pdsdbcblコマンドが正常終了してプリプロセスが完了した場合

/UAPsrc/DMLsrc/uap01.ecb:
pdsdbcbl: /UAPsrc/DMLsrc/uap01.ecb, *: KFPB65000-I: DML preprocessing was ended, return code = 0

［説明］

下線部には，プリプロセスを実行したUAPソースファイル名が出力されます。pdsdbcblコマンドに指定したパスの形式で出力されます。

KFPB65000-Iメッセージには，pdsdbcblコマンドのリターンコードが出力されます。

（例2）プリプロセスエラーが発生した場合

/UAPsrc/DMLsrc/uap01.ecb:
pdsdbcbl: /UAPsrc/DMLsrc/uap01.ecb, 23: KFPB65415-E: The specified SDB database name "DATABASE01" was not found in SDB directory information
pdsdbcbl: /UAPsrc/DMLsrc/uap01.ecb, *: KFPB65000-I: DML preprocessing was ended, return code = 8

［説明］

下線部には，プリプロセスを実行したUAPソースファイル名が出力されます。pdsdbcblコマンドに指定したパスの形式で出力されます。

色が付いている部分（例中の23）には，UAPソースファイル内のエラーの原因となった行の行番号が出力されます。エラーの原因が特定の行に起因しない場合は，行番号にアスタリスク（*）が出力されます。

KFPB65000-Iメッセージには，pdsdbcblコマンドのリターンコードが出力されます。

参考

pdsdbcblコマンドのオプション指定誤りの場合や，コマンドの実行環境によるエラーの場合などは，メッセージ中にUAPソースファイル名が出力されません。

6.8　pdsdbcblコマンドが解析するCOBOL命令

pdsdbcblコマンドが解析するCOBOL命令を次に示します。

見出し部

見出し部の見出し

次の構文を見出し部の見出しとして解析します。

・IDENTIFICATION DIVISION.

IDENTIFICATIONはIDと省略できます。

プログラム名段落の見出し

次の構文をプログラム名段落の見出しとして解析します。

・PROGRAM-ID.

データ部

データ部の見出し

次の構文をデータ部の見出しとして解析します。

・DATA DIVISION.

SDBデータベース節

SDBデータベース節を解析します。

作業場所節の見出し

次の構文を作業場所節の見出しとして解析します。

・WORKING-STORAGE SECTION.

連絡節の見出し

次の構文を連絡節の見出しとして解析します。

・LINKAGE SECTION.

手続き部

手続き部の見出し

次の構文を手続き部の見出しとして解析します。

・PROCEDURE DIVISION

DML

DML先頭子とDML終了子に囲まれた範囲をDMLとして解析します。DMLに終止符を付加する場合は，DML終了子に続けて終止符を記述してください。

DML先頭子およびDML終了子については，マニュアル「HiRDB 構造型データベース機能」の「埋込み言語文法」を参照してください。

プログラム終わり見出し

次の構文をプログラム終わり見出しとして解析します。

END PROGRAM

索引

記号

-Bbオプション[1]

-BigEndian,Binオプション[1]

-dオプション〔pdsdbcblコマンド〕[1]

-Xbオプション〔pdsdbcblコマンド〕[1]

C

CBLLIB[1]

ccbl2002コマンドの指定形式[1]

COBOLソースプログラム

記述規則[1]

基本構成[1]

コーディング例〔DMLとSQLの両方を実行するUAPの場合〕[1]

コーディング例〔OpenTP1環境下のUAPの場合〕[1]

作成する際の考慮点[1]

COPY文[1]

D

DATA DIVISION[1]

DML終了子[1]

DML先頭子[1]

DMLとSQLの両方を実行するUAP[1]

DMLの一覧[1]

DMLのエラーを検出したときの対処方法[1]

DMLの記述規則[1]

DMLの実行結果の判定処理[1]

DMLのデータ型[1]

DMLのデータ型とCOBOL言語のデータ記述項の対応[1]

DMLプリプロセサ[1]

E

END PROGRAM[1]

END-DML[1]

ENVIRONMENT DIVISION[1]

EXEC DML[1]

H

HiRDBクライアントのインストール[1]

HiRDBクライアントの環境設定[1]

I

IDENTIFICATION DIVISION[1]

L

LANG[1]

LD_LIBRARY_PATH[1]

LINKAGE SECTION[1]

O

OpenTP1環境下でのUAPの実行[1]

P

PATH[1]、[2]

PDCBLLIB[1]

PDCLTLANG[1]、[2]

PDCLTPATH[1]

pdsdbcblコマンド[1]

形式[1]

準備作業[1]

使用例[1]

リターンコード[1]

PROCEDURE DIVISION[1]

PROGRAM-ID.[1]

R

RECORD LENGTH[1]

RECORD NAME[1]

S

SDBデータベース節[1]

埋込み変数の宣言[1]

記述形式[1]

記述例[1]

SDBデータベースの特定規則[1]

SDB-DATABASE SECTION[1]、[2]

SQLCODEの値と意味[1]

SQLWARN1〜SQLWARNF[1]

SQL連絡領域の構成[1]

U

UAP

DMLとSQLを実行するUAP[1]

運用形態[1]

開発環境[1]

開発の流れ[1]

記述形式[1]

記述言語[1]

実行環境[1]

プリプロセス，コンパイル，リンケージの流れ[1]

UAPソースファイル[1]

UAPの運用[1]

UAPの実行[1]

UAPの障害対策[1]

UAPのテスト[1]

UAPのプリプロセス[1]

UAPの保守[1]

W

WORKING-STORAGE SECTION[1]

い

インストール〔HiRDBクライアント〕[1]

インタフェース領域[1]

う

埋込み型UAP[1]

埋込み変数[1]

規則[1]

使用例[1]

埋込み変数以外のデータ記述項[1]

埋込み変数の宣言[1]

埋込み変数のデータ記述項[1]

か

改行コード[1]

簡易ダンプファイル[1]

環境部[1]

環境変数の設定

pdsdbcblコマンド[1]

UAPの実行前[1]

コンパイルおよびリンケージの実行前[1]

プリプロセスの実行前[1]

く

クライアント環境定義の設定〔HiRDBクライアント〕[1]

こ

コーディング例

DMLとSQLの両方を実行するUAPの場合[1]

OpenTP1環境下のUAPの場合[1]

コンパイルおよびリンケージ

エラーが発生した場合の対処[1]

実行例[1]

準備作業[1]

コンパイルおよびリンケージの実行[1]

さ

再プリプロセスが必要なケース[1]

作業場所節[1]

し

自動再接続機能[1]

終止符[1]

使用できる文字[1]

せ

正書法[1]

て

データ部[1]

テスト環境から本番環境へのUAPの移行[1]

手続き部[1]

と

登録集原文の制限[1]

登録集原文ファイル[1]

トランザクションオブジェクトファイルの作成[1]

トランザクション制御

DMLとSQLの両方を実行するUAPの場合[1]

OpenTP1環境下[1]

な

名前の記述規則[1]

は

排他制御[1]

ひ

ビッグエンディアン形式

UAPを作成する際の注意事項[1]

ふ

複数接続機能[1]

プリプロセス

エラーが発生した場合の対処[1]

実行例〔DMLとSQLを実行するUAPの場合〕[1]

実行例〔OpenTP1環境下のUAPの場合〕[1]

準備作業[1]

プリプロセス時にチェックされない項目[1]

プログラム終わり見出し[1]

プログラムの入れ子の上限[1]

プログラム名段落の見出し[1]

ブロック転送機能[1]

ほ

ポストソースファイル[1]

本番環境への移行作業〔UAPの移行作業〕[1]

翻訳単位[1]

ま

マルチスレッド対応[1]

み

見出し部[1]

も

文字コード[1]

り

リターンコード〔pdsdbcblコマンド〕[1]

れ

レコードの格納[1]

レコードの検索[1]

レコードの更新[1]

レコードの削除[1]

連絡節[1]