アプリケーション開発ガイド (埋込みSQL編)

Size: px
Start display at page:

Download "アプリケーション開発ガイド (埋込みSQL編)"

Transcription

1 ymfoware erver アプリケーション開発ガイド ( 埋込み QL 編 ) Windows/olaris/Linux J2X Z0(00) 2008 年 12 月

2 まえがき 本書の目的 本書は 埋込み QL を利用したデータ操作のためのプログラムの開発方法について説明します 本書の読者 本書は ymfoware/rdb のデータベースを利用する方および ymfoware/rdb のデータベースを処理するアプリケーションを開発する方に読んでいただくように書かれています 本書を読むには 以下に示す技術および知識が必要です ymfoware/rdb の機能およびデータベースの概要を理解している ymfoware/rdb を適用する業務について知識をもっている C 言語または COBOL 言語でアプリケーションを開発することができる olaris(tm) オペレーティングシステムを使用できる Linux システムを使用できる Windows(R) システムを使用できる 参照 グローバルサーバ上のデータベースを利用する場合には アプリケーション開発ガイド ( 埋込み QL 編 ) グローバルサーバ連携 を参照してください 本書の構成 本書の構成と内容は以下のとおりです 第 1 章アプリケーション開発の概要 埋込み QL を利用したアプリケーション開発の概要を説明します クライアント サーバモデルの概要およびアプリケーション開発作業の流れを説明します 第 2 章アプリケーションの設計 埋込み QL を利用したアプリケーションの設計時に考慮すべき点について説明します コネクション 文字コード系およびトランザクションと排他制御について説明します 第 3 章アプリケーションの作成 埋込み QL を利用したアプリケーションの作成方法を 言語別に説明します C 言語および COBOL 言語のプログラムに QL 文をコーディングする場合の規則 コーディング位置および QL 文の実行結果の確認の方法について説明します 第 4 章ルーチンを利用するアプリケーションの作成 プロシジャルーチンおよびファンクションルーチンを利用するアプリケーションの作成方法について説明します 第 5 章アプリケーションのコンパイル リンク 埋込み QL を利用した C 言語または COBOL 言語のアプリケーションを コンパイルおよびリンクし 実行可能ファイルを作成する方法について説明します 第 6 章アプリケーションの実行 埋込み QL を利用した C 言語または COBOL 言語のアプリケーションの実行方法および動作環境のチューニング方法について説明します 付録 A C 言語のサンプルプログラム 埋込み QL を利用した C 言語のサンプルプログラムを記載します i

3 付録 B COBOL 言語のサンプルプログラム 埋込み QL を利用した COBOL 言語のサンプルプログラムを記載します 付録 C QLTATE 値 QL 文の実行結果としてアプリケーションに通知される QLTATE について説明します 付録 D 定量制限 ymfoware/rdb の定量制限の一覧を示します 付録 E システム表 ymfoware/rdb のシステム表で出力される情報の一覧と その意味について説明します 付録 F 動作環境ファイルのパラメタ一覧 アプリケーションの動作環境をチューニングするために 動作環境ファイルに指定できるパラメタの一覧を示します 付録 G 環境変数 アプリケーションの動作環境をチューニングするための環境変数について説明します 付録 資源の見積り ソート作業域およびメモリの見積りについて説明します 付録 I アプリケーションおよび RDB コマンド間の排他 アプリケーションおよび ymfoware/rdb のコマンドが同時に動作した場合の排他制御について説明します 付録 J QL 文の使用範囲 ymfoware/rdb がコンパイル 実行時にサポートする QL 文の使用範囲について説明します 付録 K ファンクションルーチンのパラメタのデータ型と対応するデータ形式 ファンクションルーチンのパラメタに指定されたデータベースのデータ型に対応するデータ形式について説明します 本書の読み方 本書に記載するアプリケーションおよび QL 文の記述の例は 特にことわらない限り C 言語での記述を使用します COBOL の記述と特に異なる点については 第 3 章アプリケーションの作成 で説明します 関連マニュアル本書に関連するマニュアルは以下のとおりです un 日本語 COBOL 使用手引書 COBOL97 使用手引書 NetCOBOL 使用手引書 COBOL 文法書 平成 19 年 5 月平成 19 年 6 月平成 19 年 8 月平成 19 年 11 月平成 19 年 12 月平成 20 年 1 月平成 20 年 4 月平成 20 年 5 月平成 20 年 9 月平成 20 年 12 月 初版第 2 版第 3 版第 4 版第 5 版第 6 版第 7 版第 8 版第 9 版第 10 版 ii

4 目次 第 1 章アプリケーション開発の概要 埋込み QL の概要 クライアント サーバモデルの概要 アプリケーション開発作業の流れ...3 第 2 章アプリケーションの設計 アプリケーションの設計に必要な概念 セション トランザクションと排他制御 トランザクション制御の概要 トランザクション制御の方法 トランザクションの終了方法 トランザクションモードの変更 トランザクションとカーソル操作 QL 文の処理結果異常とトランザクション アプリケーションの異常終了とトランザクション 排他制御 排他の属性と選択方法 資源の競合が起きた場合の制御 行単位の排他を使用する場合の注意事項 デッドロックの対処方法 トランザクション実行時間の設定 コネクション コネクションの接続方法 複数コネクション 複数コネクションの接続 現コネクションと QL 文の実行 現コネクションの変更 複数コネクションの切断 複数コネクションで QL 文を実行する場合の注意事項 コネクションを意識しないデータ操作の方法 接続先の指定方法 マルチ RDB 運用のコネクション 文字コード系の考慮 文字コード系の決定 コード変換の考慮 ホスト言語を混在する場合の注意事項 リモートアクセスする場合の注意事項 概数を使用するときの注意事項 RDB2_TCP 接続時の注意事項 アプリケーションを UNICODE 環境で起動した時の注意事項 マルチスレッド環境におけるデータ操作 名前の一意性と有効範囲 埋込み C プログラムの場合 埋込み COBOL プログラムの場合 システムコールを使用する場合の注意事項 QL 文のデータ操作文に関する注意事項 コールバック機能の利用方法...74 第 3 章アプリケーションの作成 QL 埋込み C プログラムの作成方法 アプリケーションのコーディング規則 QL 文の指定位置および指定順序 ホスト変数および標識変数の指定方法 QL 文の処理結果の確認...87 iii

5 3.1.5 日本語文字使用時の注意事項 可変長文字列のデータ操作 日本語可変長文字列のデータ操作 ポインタ変数として宣言したホスト変数の使用方法 構造体として宣言したホスト変数の使用方法 BLOB 型のコンパイル時の展開方法 DECIMAL 型または NUMERIC 型として宣言したホスト変数のコンパイル時の展開方法 拡張 QL 文識別子を使用した動的 QL 文の実行方法 拡張カーソル名を使用したカーソル操作 QL 埋込み COBOL プログラムの作成方法 アプリケーションのコーディング規則 QL 文の指定位置および指定順序 ホスト変数および標識変数の指定方法 QL 文の処理結果の確認 可変長文字列のデータ操作 BLOB 型のコンパイル時の展開方法 集団項目ホスト変数の記述方法 COBOL プログラム作成時の注意事項 クラス定義を使用する場合の注意事項 UNICODE を使用する場合のエンディアンの選択 拡張 QL 文識別子を使用した動的 QL 文の実行方法 拡張カーソル名を使用したカーソル操作 行識別子の使用時の注意事項 ロール使用時の記述方法 一時表の使用方法 第 4 章ルーチンを利用するアプリケーションの作成 プロシジャルーチンを利用する場合 プロシジャルーチンとは プロシジャルーチンを利用するアプリケーションの作成の流れ プロシジャルーチンの定義 プロシジャルーチンの実行 プロシジャルーチンの処理結果 プロシジャルーチン利用時のトランザクション ファンクションルーチンを利用する場合 ファンクションルーチンとは ファンクションルーチンを利用するアプリケーションの作成の流れ ファンクションルーチンの定義 ライブラリの作成 ライブラリとして登録する C プログラムの作成方法 ライブラリとして登録する C プログラムのコンパイル リンク ライブラリを作成する場合の注意事項 ファンクションルーチンの実行 ファンクションルーチンからの異常通知 テストドライバの作成および単体テストの実施 第 5 章アプリケーションのコンパイル リンク UNIX 系を使用した場合のアプリケーションのコンパイル リンク アプリケーションのコンパイル リンクの流れ コンパイル リンクのための環境設定 コンパイル リンクの方法 複数のコンパイル単位から構成されるアプリケーションのコンパイル リンクの方法 静的リンクする場合のコンパイル リンク 動的リンクする場合のコンパイル リンク 動的プログラム構造のコンパイル リンク コンパイル時のコネクション先の指定 Windows(R) を使用した場合のアプリケーションのコンパイル リンク アプリケーションのコンパイル リンクの流れ iv

6 5.2.2 コンパイル リンクのための環境設定 コンパイル リンクの方法 複数のコンパイル単位から構成されるアプリケーションのコンパイル リンクの方法 静的リンクする場合のコンパイル リンク 動的リンクする場合のコンパイル リンク 動的プログラム構造のコンパイル リンク コンパイル時のコネクション先の指定 第 6 章アプリケーションの実行 アプリケーションの実行 ERVER_PEC の指定 アプリケーションの起動 (UNIX 系の場合 ) アプリケーションの起動 (Windows(R) の場合 ) アプリケーションのデバッグ 状態変数およびメッセージ変数の利用方法 QL_NAP 機能の利用方法 ROUTINE_NAP 機能の利用方法 最適化情報の更新 アプリケーションのチューニング 動作環境ファイルの作成 システム用の動作環境ファイルの作成 クライアント用の動作環境ファイルの作成 サーバ用の動作環境ファイルの作成 データ操作範囲の限定方法 付録 A C 言語のサンプルプログラム A.1 可変長文字列のデータ操作例 A.2 日本語可変長文字列のデータ操作例 A.3 ポインタ型ホスト変数 ( 文字列型 ) の使用例 A.4 ポインタ型ホスト変数 ( 可変長文字列型 ) の使用例 A.5 ポインタ型ホスト変数 (BLOB 型 ) の使用例 A.6 構造体型ホスト変数の使用例 A.7 BLOB 型を含む構造体型ホスト変数の使用例 A.8 構造体型標識変数の使用例 A.9 配列型標識変数の使用例 A.10 マルチスレッド環境で動作するアプリケーションの例 A.11 コールバック機能の利用例 A.12 状態変数およびメッセージ変数の使用例 A.13 拡張カーソルを使用したカーソル操作の使用例 付録 B COBOL 言語のサンプルプログラム B.1 可変長文字列のデータ操作例 B.2 マルチスレッド環境で動作するアプリケーションの例 B.3 集団項目の使用例 B.4 状態変数およびメッセージ変数の使用例 B.5 拡張カーソルを使用したカーソル操作の使用例 付録 C QLTATE 値 付録 D 定量制限 付録 E システム表 E.1 システム表の概要 E.2 システム表の参照 E.3 システム表の詳細 E.3.1 データベース定義情報 E.3.2 スキーマ定義情報 E.3.3 表定義情報 E.3.4 列定義情報 v

7 E.3.5 制約定義情報 E.3.6 文字列を表現する表情報 E.3.7 一意性制約の定義情報 E.3.8 列一覧情報 E.3.9 注釈情報 E.3.10 インデックス情報 E.3.11 ルーチン定義情報 E.3.12 ルーチンパラメタ情報 E.3.13 権限情報 E.3.14 トリガ定義情報 E.3.15 トリガ列一覧情報 E.3.16 順序情報 E.3.17 利用者情報 E.3.18 ユーザパラメタ設定情報 E.3.19 ロール情報 E.3.20 ロールに付与された権限の情報 E.3.21 利用者に対するロールの付与情報 E.3.22 QL 文の簡易実行情報 付録 F 動作環境ファイルのパラメタ一覧 付録 G 環境変数 付録 資源の見積り ソート作業域の見積り 共用ソート作業域 固有ソート作業域 メモリの見積り式 アプリケーション実行時のメモリ見積り 付録 I アプリケーションおよび RDB コマンド間の排他 付録 J QL 文の使用範囲 付録 K ファンクションルーチンのパラメタのデータ型と対応するデータ形式 索引 vi

8 第 1 章 アプリケーション開発の概要 ymfoware/rdb には データベースを作成するための機能 データベースを管理するための機能 およびデータベースのデータを操作するための機能があります データベースを作成するためには まずデータベース構造を設計し その設計に基づいてデータベースを定義します そして この定義に基づいてデータベースを創成します データベースの管理は データベースの利用状況を調べたり データベースの破壊に対処したりするために必要です データベース内のデータをアクセスするには QL 文を使用します また ymfoware/rdb は システム間のネットワークを含めた柔軟なクライアント サーバシステムを構築するための機能を提供します 本章では 以下の項目について説明します 1.1 埋込み QL の概要 ymfoware/rdb のデータベースの基本的な利用形態として 埋込み QL を利用した C 言語または COBOL 言語のアプリケーションからの利用があります 業務処理を行うアプリケーションを プロシジャを利用してサーバで実行させたり パソコン上で ymfoware erver クライアント機能のデータベースアクセス機能 (Esql) を利用して実行したりすることができます この利用形態の概要を以下に示します 図 1.1 埋込み QL を利用したアプリケーションによる ymfoware/rdb の利用形態 1.2 クライアント サーバモデルの概要 ここでは クライアント サーバモデルの概要について 以下の順に説明します クライアントとは サーバとは 通信方法 トランザクション制御 クライアント サーバモデルの利用パターン クライアントとは クライアントとは データ処理を要求する動作単位のことです データベースシステムをクライアント サーバモデルで運用する場合には データベースに対してアクセスを要求するアプリケーションは クライアントとして位置づけられます サーバとは サーバとは データ処理を実行する動作単位のことです データベースシステムをクライアント サーバモデルで運用する場合は データベース本体が存在する側として位置づけられます 1

9 通信方法 クライアントとサーバとの間の通信方法は クライアントのサーバに対するアクセス方法によって異なります ローカルアクセス ローカルのサーバに接続し データの操作などを行うことを ローカルアクセスといいます リモートアクセス リモートのサーバに接続し データの操作などを行うことを リモートアクセスといいます 通信方法の選択 ローカルアクセスする場合は 自動的にサーバと接続されます リモートアクセスする場合の通信方法には 以下の 2 種類があります 性能を重視した RDB2_TCP 連携 ymfoware/rdb 専用のプロトコルを使用すると 高速にデータベースにリモートアクセスすることができます OI(Open ystems Interconnection) の汎用プロトコルを使用した RDAV 連携 RDA プロトコルでアクセスするアプリケーションを作成する場合に使用します リモートアクセスする場合の通信方法は クライアント用の動作環境ファイルの ERVER_PEC で指定します 通信方法と ERVER_PEC の指定および接続できるサーバの種類と接続方法について以下に示します 表 1.1 通信方法と ERVER_PEC の指定について リモートアクセス 通信方法 性能を重視した RDB2_TCP 連携 OI の汎用プロトコルを使用した RDAV 連携 ERVER_PEC の指定 RDB2_TCP RDA 表 1.2 接続できるサーバの種類と接続方法について ERVER _ PEC RDB2_ TCP 接続形態 Windows olaris Linux TCP/IP RDA TCP/IP 接続可能 接続不可能 グローバルサーバ トランザクション制御 データベースの定義 検索および更新に対してデータの整合性を保つためのトランザクション制御機能が 有効に働きます そのため ローカルを含む複数のサーバとの連携時も安全にデータベースへアクセスすることができます ただし 1 トランザクション内で複数サーバに対するデータベースの同時更新はできません 1 つのトランザクション内では 1 つのサーバの 1 つのデータベースに対してだけ更新できます クライアント サーバモデルの利用パターン ymfoware/rdb は olaris Linux Windows(R) 2000 Windows(R) XP Windows erver(r) 2003 Windows Vista(R) Windows erver(r) 2008 および日本語 MDO 上のアプリケーションをクライアントとし olaris Linux Windows(R) 2000 Windows erver(r) 2003 Windows erver(r) 2008 またはグローバルサーバをサーバとして使用することができます ローカルのデータベースとリモートのデータベースを 1 つのアプリケーションから同時にアクセスすることができます 利用パターンを以下に示します 2

10 図 1.2 クライアント サーバモデルの利用パターン 1.3 アプリケーション開発作業の流れ データベースの設計が完了したら データベースへアクセスするアプリケーションを開発します アプリケーションの開発作業の流れを以下に示します なお アプリケーションの実行処理を行うためには ymfoware/rdb の起動が必要となります 3

11 図 1.3 アプリケーション開発作業の流れ アプリケーションの設計 データベースを処理するアプリケーションの設計作業は 一般のアプリケーションの開発作業と変わりません データベース特有に考慮すべき点を以下に示します アプリケーションの言語種の選択 データベースを処理するための言語には C 言語および COBOL 言語があります アクセス対象の表の列の属性などを考慮して選択する必要があります トランザクション データベースは 複数のアプリケーションから共用して利用します このため アプリケーション間の排他を考慮してプログラムを設計する必要があります たとえば 2 つのアプリケーションが別の表を参照したあと 互いに他方のアプリケーションが参照している表を更新するようなプログラムを同時に実行すると デッドロックが発生して処理ができなくなることがあります データ操作の QL 文の選択 アプリケーションで実行する QL 文が決定している場合は 通常のデータ操作の QL 文 ( 動的 QL 文以外の QL 文 ) をアプリケーション中に埋め込んで利用します アプリケーションの実行中に QL 文を動的に実行する場合は 動的 QL 文をアプリケーション中に埋め込んで利用します アプリケーションのコーディング アプリケーションは ホスト言語のプログラム中に QL 文を埋め込んで記述します このようなプログラムを QL 埋込みホストプログラムと呼びます ホスト言語には C 言語および COBOL 言語があります アプリケーションのコーディング方法については 3.1 QL 埋込み C プログラムの作成方法 および 3.2 QL 埋込み COBOL プログラムの作成方法 で説明します コンパイルおよびリンク QL 埋込みホストプログラムをコンパイルするためには 利用者依存のコンパイル環境を作成し この上でコンパイル処理を行います コンパイル環境と コンパイルおよびリンクの方法については 5.1 UNIX 系を使用した場合のアプリケーションのコンパイル リンク および 5.2 Windows(R) を使用した場合のアプリケーションのコンパイル リンク で説明します アプリケーションの実行 アプリケーションのコンパイルとリンクが完了すると 実際に実行してデバッグを行い 意図した動作が行われることを確認します 実行のためには データ操作の QL 文で指定されている表に対して 表の DI の定義および DI の初期化が完了している必要があります 4

12 参照 表の DI の定義および DI の初期化については RDB 運用ガイド ( データベース定義編 ) を参照してください 通常は 動作を確認するために必要なデータの創成を完了してから実行します アプリケーションを実行するための実行方法については 第 6 章アプリケーションの実行 で説明します また アプリケーションのデバッグ方法については 6.2 アプリケーションのデバッグ で説明します 5

13 第 2 章 アプリケーションの設計 本章では 埋込み QL を利用したアプリケーションの設計時に考慮すべき点を説明します 本章は アプリケーションの設計をする場合にお読みください 2.1 アプリケーションの設計に必要な概念 埋込み QL アプリケーションを利用してデータベースアクセスの設計を行う場合 埋込み QL に関係する基本的な概念を理解する必要があります ここでは 埋込み QL アプリケーションを利用してデータベースアクセスを行うアプリケーションの設計に必要な概念として セション トランザクションおよびコネクションについて説明します セション ymfoware/rdb にアクセスする環境をセションと呼びます 1 つのプロセスで 1 つのセションを実行する場合は 最初の QL 文の実行時に ymfoware/rdb が自動的にセション環境を作成しています 一般的には 利用者は特にセションを意識する必要はありません 以下の場合は セションを意識し 複数作成する必要があります マルチスレッド環境で データベースアクセスを行う場合 複数のコネクションで独立してトランザクション操作をしたい場合 セション単位に アプリケーションの動作を変更したい場合 アプリケーション内で セションを操作する関数を呼び出すことで 1 つのアプリケーションプロセスで複数のセションを同時に作成することができます 詳細については 2.2 セション を参照してください トランザクション ymfoware/rdb では データベースの更新は データ操作の QL 文の実行ごとに行われるのではなく トランザクション制御の QL 文に従って データベースの更新が行われます データベースの更新の単位をトランザクションと呼びます 詳細については 2.3 トランザクションと排他制御 を参照してください コネクション コネクションとは クライアントのアプリケーションがサーバの ymfoware/rdb データベースにアクセスするために クライアントとサーバの間を結んだ接続関係のことです アプリケーションがデータベースシステムとコネクションをもつことによって そのデータベースシステムの資源を操作することができます 詳細については 2.4 コネクション を参照してください アプリケーションと セション トランザクション コネクションの関係を以下に示します 6

14 図 2.1 アプリケーションと セション トランザクション コネクションの関係 1 つのアプリケーションプロセスには 1 つまたは複数のセションを作成できます 1 つのセションでは 1 つまたは複数のトランザクションを実行することができます ただし 1 つのセションで複数のトランザクションを同時に実行することはできません 1 つのセションから 1 つまた複数のコネクションを接続することができます 2.2 セション ここでは セションの作成および複数セションについて説明し セション操作の例を示します セションの作成 アプリケーションプロセスには 1 つまたは複数のセションを作成することができます セションを作成する方法には 以下の 2 つがあります ymfoware/rdb が自動的にセションを作成する 利用者がセションを操作する関数を呼び出してセションを作成する ymfoware/rdb が自動的にセションを作成する アプリケーションで最初の QL 文が実行されると ymfoware/rdb が自動的にセションを作成します 1 つのアプリケーションプロセスで 1 つのセションを利用する場合は 最初の QL 文の実行がセションの開始であり アプリケーションの終了がセションの終了となります 利用者がセションを操作する関数を呼び出してセションを作成する アプリケーション中でセションを操作する関数を呼び出すことにより セションを作成することができます 複数のセションを作成する要件がある場合は セションを操作する関数を利用します セションを操作する関数を利用する場合は QLThrtartID 関数の実行がセションの開始であり QLThrEndID 関数の実行がセションの終了となります 複数セション 複数セションを作成には 以下の 3 つがあります マルチスレッド環境で データベースアクセスを行う場合 7

15 複数のコネクションで独立してトランザクション操作をしたい場合 セション単位に アプリケーションの動作を変更したい場合 マルチスレッド環境で データベースアクセスを行う場合 スレッドごとにセションを割り当てることで スレッド同士で影響を与えずにデータベースアクセスを実施できます マルチスレッド環境で動作するアプリケーションを開発する方法については 2.7 マルチスレッド環境におけるデータ操作 を参照してください 複数のコネクションで独立してトランザクション操作をしたい場合 1 つのセションで複数のコネクションを利用する場合 1 つのトランザクションで 複数のコネクションに対してデータベースを更新する QL 文は実行できません 複数のコネクションで それぞれ更新を並行して実施する場合は 複数のセションを作成することで実現できます セション単位に アプリケーションの動作を変更したい場合 ロール 省略時のスキーマ名 利用者 トランザクションモードなどの値は セション単位に変更できます 1 つのアプリケーションで これらの変更可能な値が異なる環境を複数利用したい場合は セションを複数作成し それぞれの値を変更することで 実現できます 複数セションを作成するには セションを操作する関数を利用します セションを操作する関数には 以下の4つがあります QLThrAllocID 関数 QLThrtartID 関数 QLThrEndID 関数 QLThrFreeID 関数 参照 各関数の詳細については QL リファレンス を参照してください セションは セションを操作する関数を使用して 以下の手順で作成します (1) QLThrAllocID 関数を発行して セションを作成します プロセス内でセションを識別するためのセション ID を受け取ります (2) QLThrtartID 関数を発行して セションを開始します これにより セションと動作スレッドが関係付けられます (3) データベースを検索および更新する QL 文を実行します 8

16 (4) QLThrEndID 関数を発行して セションと動作スレッドの関係付けを終了します (5) QLThrFreeID 関数を発行して セションを破棄します セション操作の例 以下に シングルスレッドで複数セションを作成する場合の例を示します マルチスレッドの場合の使用方法は 2.7 マルチスレッド環境におけるデータ操作 を参照してください 例 QLDB ses_id1; QLDB ses_id2; int main( void ) { EXEC QL BEGIN DECLARE ECTION; char QLTATE[6]; char QLMG[256]; EXEC QL END DECLARE ECTION; QLThrAllocID( &ses_id1 ); QLThrAllocID( &ses_id2 ); sub01(ses_id1); sub02(ses_id2); sub03(ses_id1); sub03(ses_id2); QLThrFreeID ( ses_id1 ); QLThrFreeID ( ses_id2 ); return 0; } void sub01(qldb ses_id) { QLThrtartID( ses_id ); EXEC QL CONNECT TO 'V1'; EXEC QL INERT INTO C.TBL ; EXEC QL COMMIT WORK; QLThrEndID ( ses_id ); return 0; } void sub02(qldb ses_id) { QLThrtartID( ses_id ); EXEC QL CONNECT TO 'V2'; EXEC QL INERT INTO C.TBL ; EXEC QL COMMIT WORK; QLThrEndID ( ses_id ); return 0; } void sub03(qldb ses_id) { QLThrtartID( ses_id ); EXEC QL DICONNECT ALL; QLThrEndID ( ses_id ); return 0; } 2.3 トランザクションと排他制御 ymfoware/rdb では トランザクション単位にデータベースの更新が行われます 複数のトランザクションが同時に同じデータベースを参照または更新すると データの矛盾が発生してしまいます このようなことを防ぐために ymfoware/rdb は 排他制御を行います ここでは トランザクション処理と排他制御について説明します 9

17 2.3.1 トランザクション制御の概要 ymfoware/rdb では データベースの更新は データ操作の QL 文の実行ごとに行われるのではなく トランザクション制御の QL 文に従って行われます データベースの更新の単位をトランザクションと呼びます 本節では QL 文を使用してデータ操作を行った場合に ymfoware/rdb が操作の内容をどのようにデータベースへ反映するかを説明します トランザクションの開始 トランザクションは ymfoware/rdb により自動的に開始されます アプリケーション中の QL 文を実行する場合 トランザクションが開始された状態でなければ QL 文の処理に先立ってトランザクションが開始されます トランザクションが開始されていない状態とは アプリケーションが実行開始したあと またはトランザクション制御用の QL 文によってトランザクションが終了したあと QL 文が一度も実行されていない状態です QL 文には トランザクションを開始しない QL 文もあります トランザクションを開始する QL 文 カーソル宣言以外のデータ操作文 動的カーソル宣言以外の動的 QL 文 CALL 文 トランザクションを開始しない QL 文 トランザクション制御文 コネクション管理文 セション管理文 埋込み例外宣言 カーソル宣言 動的カーソル宣言 資源操作文 ET UER PAWORD 文 ET ROLE 文 トランザクションの終了 トランザクションは 以下の QL 文を実行することによって 終了させることができます また アプリケーションが正常終了すると 自動的に終了します 表 2.1 トランザクションを制御する QL 文 QL 文 COMMIT 文 ROLLBAC K 文 機能 現在のトランザクションを終了します トランザクション内でのデータ操作 ( 注 ) をすべてデータベースに反映します オープン中のすべてのカーソルをクローズします ただし トランザクションを超越するカーソルはクローズしません トランザクション内で獲得したロックをすべて解放します 現在のトランザクションを終了します トランザクション内でのデータ操作 ( 注 ) はすべて取り消します オープン中のすべてのカーソルをクローズします トランザクション内で獲得したロックをすべて解放します 注 ) データ操作には 挿入 更新および削除があります 10

18 トランザクションを制御する例 トランザクションを制御する例を以下に示します データ操作の QL 文を実行すると トランザクションごとに そのトランザクション内で処理されたデータがデータベースに反映されます 図 2.2 データベースの更新処理 トランザクション制御の方法 アプリケーションでは トランザクションを終了させたり モードを変更させたりすることができます ここでは トランザクションの終了方法と トランザクションモードの変更方法について説明します トランザクションの終了方法 トランザクションの終了方法には 以下の 3 つの方法があります COMMIT 文によるトランザクションの終了 ROLLBACK 文によるトランザクションの終了 アプリケーションの終了によるトランザクションの終了 COMMIT 文によるトランザクションの終了 COMMIT 文は トランザクションの区切りを指定する QL 文です COMMIT 文により行われる処理は 以下のとおりです 処理中のトランザクションを終了し このトランザクションで行われたデータ操作をデータベースに反映します オープン中のすべてのカーソルをクローズします ただし トランザクションを超越するカーソルはクローズしません このトランザクションで獲得した データベース資源のロックをすべて解放します 前に実行した COMMIT 文または ROLLBACK 文以後 当該 COMMIT 文までに行ったデータベースの処理をデータベースに反映します 次に 現在のトランザクションを終了します 一度も COMMIT 文または ROLLBACK 文を実行していない場合は アプリケーションの実行開始から当該 COMMIT 文までのデータベースの処理をデータベースに反映します COMMIT 文の形式を以下に示します 11

19 COMMIT WORK COMMIT 文によるデータベース更新の例を以下に示します 図 2.3 COMMIT 文によるデータベース更新の例 ROLLBACK 文によるトランザクションの終了 ROLLBACK 文は トランザクション内で行ったデータベースの処理を取り消すための QL 文です ROLLBACK 文により行われる処理を以下に示します 処理中のトランザクションを終了し このトランザクションで行われたすべての変更を取り消します データベースは更新されません オープン中のすべてのカーソルをクローズします このトランザクションで獲得した データベース資源のロックをすべて解放します 前に実行した COMMIT 文または ROLLBACK 文実行以後 当該 ROLLBACK 文までに行ったデータベースの処理を取り消します そして 現在のトランザクションを終了します 一度も COMMIT 文または ROLLBACK 文を実行していない場合は アプリケーションの実行開始から当該 ROLLBACK 文までのデータベースの処理を取り消します ROLLBACK 文の形式を以下に示します ROLLBACK WORK ROLLBACK 文によるトランザクション取消しの例を以下に示します 12

20 図 2.4 ROLLBACK 文によるトランザクション取消しの例 アプリケーションの終了によるトランザクションの終了 アプリケーションがトランザクション開始状態のまま COMMIT 文も ROLLBACK 文も実行せずに終了する場合には ymfoware/rdb がトランザクションをロールバックします トランザクションが開始状態のままアプリケーションが終了する例を以下に示します 図 2.5 トランザクション開始状態でのアプリケーションの終了の例 トランザクションモードの変更 トランザクションモードの初期値は 動作環境ファイルの DEFAULT_ACCE_MODE および DEFAULT_IOLATION で設定します また トランザクションモードの変更は ET TRANACTION 文で行います トランザクションモードには 以下の 2 つの項目があります トランザクションアクセスモード 独立性水準 トランザクションアクセスモード トランザクションアクセスモードでは 実行できる QL 文の種類を設定します トランザクションアクセスモードには 以下の 2 種類があります 13

21 READ ONLY 読込み専用モードです トランザクション内で参照系の QL 文のみ 実行することができます READ WRITE 更新可能モードです トランザクション内で参照系および更新系の QL 文を実行することができます トランザクションアクセスモードの初期値は 動作環境ファイルの DEFAULT_ACCE_MODE の指定により決まります 独立性水準 複数のトランザクションが同じ資源にアクセスする場合 なにも制御を行わないと データの矛盾が発生してしまいます 独立性水準では このようなことが起こらないように あるトランザクションがアクセスしているデータに対し 他のトランザクションによる参照または更新を制御します また 他のトランザクションが更新中の資源に対し 自トランザクションが参照または更新できるかを制御します 独立性水準には以下の 4 種類があります ERIALIZABLE REPEATABLE READ READ COMMITTED READ UNCOMMITTED 独立性水準の初期値は 動作環境ファイルの DEFAULT_IOLATION の指定により決まります ただし 動作環境ファイルの R_LOCK が NO の場合 DEFAULT_IOLATION に REPEATABLE_READ を指定しても ERIALIZABLE になります また 動作環境ファイルの R_LOCK が YE の場合は DEFAULT_IOLATION に ERIALIZABLE を指定しても REPEATABLE READ になります 独立性水準は ET TRANACTION 文で変更可能です ただし 動作環境ファイルの R_LOCK が NO の場合は ET TRANACTION 文に REPEATABLE READ を指定しても ERIALIZABLE になります また 動作環境ファイルの R_LOCK が YE の場合は ET TRANACTION 文に ERIALIZABLE を指定しても REPEATABLE READ になります また 動作環境ファイルで DO_LOCK を指定した場合 ET TRANACTION 文は指定できません 参照 ET TRANACTION 文の詳細は QL リファレンス を参照してください あるトランザクションの実行中に現れる可能性のある現象を以下に示します 現象 1) トランザクション T1 が行を更新する T1 がトランザクションを終了する前に トランザクション T2 がその行を読み込む T1 が ROLLBACK 文を実行した場合 T2 は存在しなかった行を読むことになる 現象 2) トランザクション T1 が行を読み込む トランザクション T2 が その行を更新または削除し COMMIT 文を実行する T1 がその行を再び読もうとした場合 更新した値を受け取るかまたはその行が削除されたことを知る 現象 3) トランザクション T1 が ある探索条件を満たす行の集合を読み込む トランザクション T2 が その探索条件を満たす行を追加する T1 が 同じ探索条件で再度行の集合を読み込んだ場合 最初とは異なった行の集合を得ることになる 独立性水準現象 1) 現象 2) 現象 3) ERIALIZABLE 不可能不可能不可能 REPEATABLE READ 不可能不可能可能 14

22 独立性水準現象 1) 現象 2) 現象 3) READ COMMITTED READ UNCOMMITTED 不可能可能可能 可能可能可能 ERIALIZABLE あるトランザクションが参照または更新した資源は そのトランザクションが終了するまで 他のトランザクションから更新されないことが保証されます 動作環境ファイルのパラメタ R_LOCK で行単位の排他が指定されていない場合に有効です ERIALIZABLE の場合の排他処理を以下に示します 図 2.6 ERIALIZABLE の場合の排他 (1) 利用者 AがCOMMIT(ROLLBACK) 終了するまで資源を占有します (2) 利用者 Bは 利用者 Aが資源を占有しているため 待ち状態となります (3) 利用者 AがCOMMIT(ROLLBACK) するので 利用者 Aの資源は解放されます (4) 利用者 Aが資源を解放したので 利用者 Bの更新が実行されます このとき 資源を占有します (5) 利用者 BがCOMMIT(ROLLBACK) するので 利用者 Bの資源は解放されます REPEATABLE READ あるトランザクションが参照または更新した資源は そのトランザクションが終了するまで 他のトランザクションからの更新がないことが保証されます 動作環境ファイルの R_LOCK パラメタで行単位の排他が指定されている場合に有効です 排他の単位が行単位でかつ REPEATABLE READ が指定された場合は 該当のトランザクションがアクセスしていない行は占有しないので 同一トランザクション内で 同一の QL 文をくり返し実行しても 異なる集合が検索される場合があります REPEATABLE READ の場合の排他処理を以下に示します 15

23 図 2.7 REPEATABLE READ の場合の排他 (1) 利用者 A は COL1 が A の行を参照します トランザクションが終了するまでこの行の集合を占有します (2) 利用者 B は 利用者 A が参照した行に対しては更新することができませんが INERT 文で行を追加することはできます (3) 利用者 A が 再び COL1 が A の行を参照します このとき前回参照した行に加えて 利用者 B が追加した行も検索されます READ COMMITTED あるトランザクションが更新した資源は そのトランザクションが終了するまで 他のトランザクションから更新されないことが保証されます しかし 以下のいずれかの QL 文で参照した資源に対しては 他のトランザクションから更新される可能性があります 単一行 ELECT 文 更新可能性句に FOR READ ONLY を指定したカーソルの OPEN 文 トランザクションアクセスモードが読込み専用モードのときの OPEN 文 したがって 同一トランザクション内でも テーブル参照ごとに内容が異なる場合があります READ COMMITTED の場合の排他処理を以下に示します 16

24 図 2.8 READ COMMITTED の場合の排他 (1) 利用者 Aが参照しているため ( 参照 1) この参照が終了するまで資源を占有します (2) 利用者 Aが資源を解放するまで 利用者 Bは更新を行えず 待ち状態となります (3) 利用者 Aが参照終了 ( 参照 1) し 資源を解放します (4) 利用者 Aが資源を解放したので 利用者 Bの更新が実行されます このとき 資源を占有します (5) 利用者 Bが資源を解放するまで利用者 Aは更新 ( 更新 ) を行えず 待ち状態となります (6) 利用者 Bの更新が終了します (7) 利用者 Bがトランザクションを終了し 資源を解放します (8) 利用者 Bが資源を解放したので 利用者 Aの更新 ( 更新 ) が実行されます このとき 資源を占有します (9) 利用者 Aが更新終了 ( 更新 ) しますが 資源の占有は続きます (10) 利用者 Aが参照 ( 参照 2) を行います このとき検索される行は 利用者 Bが更新した行を含みます (11) 利用者 Aが参照 ( 参照 2) を終了しますが 資源の占有は続きます (12) 利用者 Aがトランザクションを終了します これによって資源が解放されます READ UNCOMMITTED あるトランザクションが参照した資源は 他のトランザクションの参照および更新をまったく制限しません また他のトランザクションが更新した資源も トランザクションの終了を待たずに参照することができます トランザクションが更新した資源は トランザクション終了まで他のトランザクションの参照および更新を待たせます READ UNCOMMITTED の場合の排他処理を以下に示します 17

25 図 2.9 READ UNCOMMITTED の場合の排他 (1) 利用者 B は 更新処理 ( 更新 1) のため COMMIT(ROLLBACK) 終了するまで資源を占有します (2) 利用者 A は 資源を占有しないため 利用者 B が資源を占有していても 待ち状態にならずに参照処理 ( 参照 1) を行います (3) 利用者 A は利用者 B が資源を解放するまで更新を行えず 待ち状態となります (4) 利用者 B が COMMIT(ROLLBACK) します 利用者 B の資源は解放されます (5) 利用者 B が資源を解放したので 利用者 A の更新が実行されます このとき 実際に更新した資源を占有します (6) 利用者 A が参照 ( 参照 2) を行います このとき検索される行は 利用者 B が更新した行を含みます (7) 利用者 B は利用者 A が資源を解放するまで更新を行えず 待ち状態となります (8) 利用者 A が参照 ( 参照 2) を終了しますが 資源の占有は続きます (9) 利用者 A が COMMIT(ROLLBACK) します (10) 利用者 A が資源を解放したので 利用者 B の更新 ( 更新 2) が実行されます このとき 資源を占有します (11) 利用者 B が COMMIT(ROLLBACK) します トランザクションとカーソル操作 カーソルは 一般に トランザクション終了時にクローズされます しかし 次の場合 カーソルはクローズされません トランザクションの独立性水準指定が READ COMMITTED で カーソル指定の更新可能性句が FOR READ ONLY の場合 カーソル宣言に カーソルモード指定がある場合 以下に独立性水準指定に READ COMMITTED を指定し 更新可能性句に FOR READ ONLY を指定して実現する トランザクションを超越するカーソル操作の QL 文の例を示します EXEC QL DECLARE CR1 CUROR FOR ELECT * FROM 取引先会社 WERE 電話番号 LIKE hcomp_word FOR READ ONLY; (1) 18

26 EXEC QL ET TRANACTION READ ONLY, IOLATION LEVEL READ COMMITTED; EXEC QL OPEN CR1; EXEC QL FETC CR1 INTO hnumber,hproduct,hstock; EXEC QL COMMIT WORK; (2) (3) (4) (5) EXEC QL FETC CR1 INTO hnumber,hproduct,hstock; ( データの終了 ) EXEC QL CLOE CR1; (6) (7) (1) カーソル CR1 を宣言します 更新可能性句に FOR READ ONLY を設定します (2) トランザクションアクセスモードに READ ONLY を設定します 独立性水準に READ COMMITTED を設定します (3) カーソル CR1 をオープンします (4) 探索条件が真となる行にカーソルを位置づけ その行を読み込みます (5) COMMIT によりトランザクションを終了します (6) (5) でカーソルがクローズされないため カーソルを位置づけることができます (7) データ終了後 カーソル CR1 をクローズします また 以下にカーソルモード指定によって実現する トランザクションを超越するカーソル操作の QL 文の例を示します EXEC QL DECLARE CR1 CUROR FOR ELECT * FROM 取引先会社 WERE 電話番号 LIKE hcomp_word WIT OPTION LOCK_MODE(FREE LOCK),CUROR_MODE(OLD); EXEC QL OPEN CR1; EXEC QL FETC CR1 INTO hnumber,hproduct,hstock; EXEC QL COMMIT WORK; EXEC QL FETC CR1 INTO hnumber,hproduct,hstock; ( データの終了 ) EXEC QL CLOE CR1; (1) (2) (3) (4) (5) (6) (1) カーソル CR1 を宣言します カーソルモード指定に OLD を設定します (2) カーソル CR1 をオープンします (3) 探索条件が真となる行にカーソルを位置づけ その行を読み込みます (4) COMMIT によりトランザクションを終了します (5) (4) でカーソルがクローズされないため カーソルを位置づけることができます (6) データ終了後 カーソル CR1 をクローズします トランザクションを超越するカーソルを使用する場合の注意事項 トランザクションを超越するカーソルを使用する場合 カーソルのオープン中に そのカーソルが参照する表の定義や格納構造定義が変更されると 次のトランザクションで FETC 文の実行が QLTATE 値が 24000( カーソル不当 ) のエラーとなります このエラーが発生した場合は カーソルをクローズして 再度オープンするようにしてください 19

27 2.3.3 QL 文の処理結果異常とトランザクション データ操作の QL 文の処理中に異常が発生した場合には アプリケーションにエラーで復帰します エラーで復帰したときのトランザクションの状態は エラーの原因がデッドロックによる場合と そうでない場合によって異なります エラーの原因を示すコードは 状態変数 QLTATE に設定されます 状態変数 QLTATE に設定される値は 以下のとおりです エラー原因がデッドロックの場合の QLTATE 40xxx エラー原因がデッドロック以外の場合 QLTATE 40xxx 以外 デッドロック以外のエラー発生時のトランザクション エラーが発生した QL 文による更新は その QL 文を実行する直前の状態に戻されてアプリケーションへ復帰します ただし この QL 文の実行までに獲得されたデータベース資源の占有とカーソルの位置はそのまま保持されます このとき トランザクションは継続されたままになっています トランザクションをそのまま継続させるか終了させるかは エラーの原因ごとに利用者がアプリケーションの論理に従って決定します たとえば INERT 文で表にデータを繰り返し挿入するような処理では あるデータが表の一意性制約に違反するエラーとなっても そのデータを無視して引き続きデータを挿入すればよい場合には トランザクションは継続させて処理を続行します また 互いに関連のある複数の表を更新するような処理では ある表の更新時にエラーが発生した場合 表の間での整合を保つために ROLLBACK 文を実行してトランザクションをロールバックします なお 動作環境ファイルのパラメタ TRAN_PEC の指定により トランザクションの対処方法を変更することができます 動作環境ファイルについては 6.4 アプリケーションのチューニング を参照してください データ操作の QL 文の実行でエラーが発生した場合の例を以下に示します 図 2.10 データ操作の QL 文の実行でエラーが発生した場合の例 デッドロックによるエラー発生時のトランザクション エラーの原因がデッドロックによる場合は トランザクションはロールバックされてアプリケーションへ復帰します したがって この QL 文の実行までに獲得されたデータベース資源のロックは解放され オープン中のカーソルは閉じられます デッドロックが発生した場合のアプリケーションの対処方法については デッドロックの対処方法 で説明します アプリケーションの異常終了とトランザクション アプリケーションは実行中に異常終了することがあります このとき トランザクションが開始状態であれば トランザクションはロールバックされて終了します アプリケーションが異常終了するケースには以下のような場合があります 20

28 アプリケーションの実行環境の定義の誤り アプリケーションの誤りによる異常終了 排他制御 アプリケーションからデータベースへアクセスする場合には トランザクション単位に ymfoware/rdb で排他制御を行います データベースの同一資源に対して アプリケーションおよび RDB コマンドが同時に動作した場合の ymfoware/rdb の排他制御の詳細については 付録 I アプリケーションおよび RDB コマンド間の排他 を参照してください 排他の属性と選択方法 排他の属性には 以下のものがあります 占有の資源 占有の単位 占有モード 占有待ちの有無 以下に 排他の属性の指定方法と 排他の属性の各項目の概要を説明します 排他の属性の指定方法 排他の属性を指定するには 以下の方法があります 動作環境ファイルの実行パラメタによる指定 動作環境ファイルの実行パラメタによって設定できる属性は 以下のとおりです DO_LOCK 資源の占有モードおよび占有単位について指定します 指定された DO 配下の全 DI に対する占有モードおよび占有単位となります IOLATION_WAIT 占有待ちの有無について指定します R_LOCK 占有単位について指定します DEFAULT_ACCE_MODE トランザクションアクセスモードの初期値を指定します DEFAULT_ACCE_MODE が指定された場合 プロセスで最初に実行される QL 文の直前で ET TRANACTION 文が実行されたことになります DEFAULT_IOLATION 独立性水準の初期値を指定します DEFAULT_IOLATION が指定された場合 プロセスで最初に実行される QL 文の直前で ET TRANACTION 文が実行されたことになります 各パラメタの記述形式については 6.4 アプリケーションのチューニング を参照してください 実行パラメタを省略した場合は ymfoware/rdb が選択した属性で排他制御を行います ET TRANACTION 文による指定 アプリケーション中に ET TRANACTION 文の独立性水準指定によって 占有の強さについて設定することができます 21

29 参照 ET TRANACTION 文の詳細は QL リファレンス を参照してください ymfoware/rdb による選択 動作環境ファイルの実行パラメタや ET TRANACTION 文が指定されなかった場合 ymfoware/rdb が QL 文を解釈し その結果をもとに選択します QL 文の占有モード指定による指定 QL 文に占有モード指定をすることにより QL 文単位に読み込んだデータベース資源 ( データおよびインデックス ) に対して占有モードを設定することができます この機能を イルシデーションロックといいます 参照 占有モード指定の詳細は QL リファレンス を参照してください ポイント イルシデーションロック (elucidation lock) とは 占有モード指定により QL 文単位に読み込んだ資源の占有方法を決めて 明示的に排他制御を行う機能です 占有の資源 占有する対象の資源は そのアプリケーションで使用する表の DI およびインデックスの DI です 占有の単位 占有制御によって資源を占有する単位には 行単位 ぺージ単位および DI 単位があります 行単位の占有の場合には アプリケーションがアクセスするデータを含む行が占有の対象になります ぺージ単位の占有の場合には アプリケーションがアクセスするデータを含むぺージが占有の対象になります DI 単位の占有の場合には アプリケーションがアクセスするデータを含む DI が占有の対象になります 占有単位を指定するには 以下の方法があります 動作環境ファイルの実行パラメタ DO_LOCK および R_LOCK での指定 ymfoware/rdb による選択 動作環境ファイルの実行パラメタ DO_LOCK および R_LOCK での指定 占有単位は 動作環境ファイルの実行パラメタ DO_LOCK で DO 単位に指定するかまたは R_LOCK で指定します 動作環境ファイルの実行パラメタの指定と占有単位について以下に示します 表 2.2 動作環境ファイルの実行パラメタによる占有単位の選択方法 動作環境ファイルの実行パラメタ DO_LOCK R_LOCK ページ指定あり 指定した DO の全 DI をぺージ単位で占有 行単位で占有 ページ指定なし 指定した DO の全 DI を DI 単位で占有 R_LOCK の値により DO_LOCK を指定できない場合があります 以下に DO_LOCK と R_LOCK の関係を示します 22

30 表 2.3 DO_LOCK と R_LOCK の関係 クライアント用の動作環境ファイルの R_LOCK システム用の動作環境ファイルの R_LOCK DO_LOCK の指定 占有単位 NO NO 指定可 DO_LOCKの 指定による YE 指定可 DO_LOCKの 指定による YE NO 指定不可 行単位で占有 ( 注 ) YE 指定不可 行単位で占有 ( 注 ) 省略 NO 指定可 DO_LOCKの 指定による YE 指定不可 行単位で占有 ( 注 ) 注 ) DO_LOCK を指定した場合 CONNECT 文実行時にエラーとなります ymfoware/rdb による選択 動作環境ファイルで DO_LOCK も R_LOCK も指定しなかった場合は ymfoware/rdb によって占有の単位が選択されます ymfoware/rdb は QL 文ごとに その QL 文でアクセスするデータの範囲 ( ぺージ数 ) を算定します その範囲 ( ぺージ数 ) の大きさに応じて 以下に示すように占有単位を選択しています 表 2.4 ymfoware/rdb による占有単位の選択条件 ページ DI 占有単位 選択条件 アクセスするデータの範囲が小さい場合 アクセスするデータの範囲が大きい場合 たとえば 表を全件処理する場合には 表のデータを格納している全 DI に対して DI 単位の占有を選択します また QL 文の探索条件を解析し アクセスするぺージが少ないと算定した場合には ぺージ単位の占有を選択します なお アクセスするデータの量が少なくても その範囲 ( ぺージ数 ) が大きい場合には DI 単位の占有を選択します 占有モード データベースにアクセスする場合の占有モードには 共有モードと非共有モードの 2 種類があります 共有モードの場合 ロックされたデータは ほかのトランザクションからのデータ操作において 参照だけが許され更新操作はできません 一般に データのロックを獲得中のトランザクションのコミットが行われるまで ほかのトランザクションのデータの更新操作は 待ち状態となります 非共有モードの場合 ロックされたデータは ほかのトランザクションでデータ操作することはできません 一般に データのロックを獲得中のトランザクションのコミットが行われるまで ほかのトランザクションの実行は 待ち状態となります 占有モードを指定するには 以下の方法があります 動作環境ファイルの実行パラメタ DO_LOCK での指定 ymfoware/rdb による選択 動作環境ファイルの実行パラメタ DEFAULT_ACCE_MODE および DEFAULT_IOLATION または ET TRANACTION 文での指定 QL 文における占有モード指定での指定 23

31 動作環境ファイルの実行パラメタ DO_LOCK での指定 アプリケーションの動作環境ファイルの実行パラメタ DO_LOCK を指定すると データ操作の QL 文を実行したとき データおよびインデックスに対する占有モードを指定することができます データに対する占有 データに対する占有モードは 以下に示すように DO 単位に指定します 表 2.5 動作環境ファイルの実行パラメタによる占有モードの指定 を指定した場合 DO_LOCK での指定 EX を指定した場合 または省略した場合 インデックスに対する占有 占有モード 共有モード 非共有モード インデックスに対する占有モードは 以下に示すように インデックスの DO 単位に指定します 表 2.6 動作環境ファイルの実行パラメタによるインデックスに対する占有モードの指定 を指定した場合 DO_LOCK での指定 EX を指定した場合 または省略した場合 ymfoware/rdb による選択 占有モード 共有モード 非共有モード 動作環境ファイルで DO_LOCK を指定しなかった場合は ymfoware/rdb によって占有モードが選択されます データに対する占有 ymfoware/rdb は アクセスするデータに対して 以下に示す条件で QL 文ごとにデータに対する占有モードを選択します 表 2.7 ymfoware/rdb による占有モードの選択 共有モード 占有モード 非共有モード 選択条件 データを参照する処理の部分の場合 データを更新する処理の部分の場合 データ検索を行う以下の QL 文については アクセスするデータに対する占有モードは共有モードになります また これらの QL 文については インデックスに対する更新が行われないので インデックスに対するモードは共有モードになります OPEN 文 ( ただし カーソル宣言の更新可能性句に FOR UPDATE を指定したカーソルの OPEN 文は 非共有モードで占有します ) 単一行 ELECT 文 FETC 文 データの更新 削除および挿入を行う以下の QL 文については 処理 ( 更新 削除および挿入 ) 対象のデータに対する占有モードは 非共有モードになります ただし データ更新 削除および挿入を行う QL 文であっても 内部的に参照しか行わない部分に関しては 共有モードになります UPDATE 文 探索 UPDATE 文 位置づけ DELETE 文 探索 DELETE 文 位置づけ INERT 文 24

32 インデックスに対する占有 ymfoware/rdb は QL 文の処理で使用するインデックスの更新の有無により 以下のように選択します 表 2.8 ymfoware/rdb によるインデックスに対する占有モードの選択 インデックスに対する占有モード 共有モード 非共有モード インデックス更新の有無 インデックス更新なし インデックス更新あり データ更新を行う以下の QL 文については 更新対象の列に設定されているインデックスに対して更新が行われます したがって そのようなインデックスに対する占有モードは非共有モードになります 一方 更新対象でない列に設定されているインデックスに対しては 更新は行われないので そのようなインデックスに対する占有モードは共有モードになります UPDATE 文 探索 UPDATE 文 位置づけ データ削除および挿入を行う以下の QL 文については 更新対象の表に張られているインデックスに対して更新が行われます したがって そのようなインデックスに対する占有モードは非共有モードになります DELETE 文 探索 DELETE 文 位置づけ INERT 文 動作環境ファイルの実行パラメタ DEFAULT_ACCE_MODE および DEFAULT_IOLATION または ET TRANACTION 文での指定 動作環境ファイルの実行パラメタ DEFAULT_ACCE_MODE および DEFAULT_IOLATION または ET TRANACTION 文での指定については トランザクションモードの変更 を参照してください QL 文における占有モード指定での指定 QL 文に占有モード指定を指定することにより QL 文が読み込んだ資源 ( データおよびインデックス ) の占有モードと占有期間を柔軟に変更することができます 占有の単位は アプリケーションの動作環境ファイルの実行パラメタ R_LOCK が YE の場合 行単位となります R_LOCK が NO の場合は ページ単位または DI 単位になります 占有モード指定がある場合 ET TRANACTION 文で指定された内容とは無関係に動作します また アプリケーションの動作環境ファイルの実行パラメタ DO_LOCK は 指定できません 占有モード指定と資源の占有について以下に示します 表 2.9 占有モード指定と資源の占有 占有モード指定 EXCLUI VE LOCK ARE LOCK FREE LOCK 占有のしかたと占有期間 非共有モードで トランザクション終了まで資源を占有する 共有モードで トランザクション終了まで資源を占有する 共有モードで QL 文終了 ( カーソルならば OPEN 文終了時 ) まで資源を占有する 他のトランザクションとの待ち関係 当該トランザクションが終了するまで 同じ資源を参照 / 更新する他のトランザクションを待たせる QL 文の実行後は 当該トランザクションが終了するまで 同じ資源を更新する他のトランザクションを待たせる 当該 QL 文の実行中は 同じ資源を更新する他のトランザクションを待たせる 当該 QL 文の実行が終了すると 同じ資源を更新する他のトランザクションを実行することができる 読込み水準 COMMIT 済みの行を読み込む 当該 QL 文で読み込んだ行は トランザクション終了まで他のトランザクションに更新されることがないため 一度読み込んだ行は 他のトランザクションによって更新されないことが保証される COMMIT 済みの行を読み込む 当該 QL 文で読み込んだ行は 他のトランザクションに更新されることがあるため 同一トランザクションで再検索すると最新の結果を検索することができる 25

33 占有モード指定 占有のしかたと占有期間 他のトランザクションとの待ち関係 読込み水準 NO LOCK 資源を占有しない 当該 QL 文を実行しても 他のトランザクションを待たせない 他のトランザクションで COMMIT されていない更新中の行を読みことができる 占有モード指定は 資源を読み込むときのモードです 読み込んだ資源の更新時には 占有モード指定での指定に関係なく EXCLUIVE LOCK になります 占有モード指定を指定した QL 文の待ち関係 占有モード指定を指定した QL 文が参照した資源に対する待ち関係を以下に示します 更新した部分に関しては EXCLUIVE LOCK 指定がされたとみなして表を参照してください 表 2.10 占有モード指定と待ち関係 後続トランザクション 占有モード指定 EXCLUIVE LOCK 待つことなく動作する EXCLUIV E LOCK 先行トランザクション ARE LOCK FREE LOCK ARE LOCK FREE LOCK NO LOCK 先行トランザクションの QL 文の終了を待つ 先行トランザクションの終了を待つ 図 2.11 待つことなく動作する場合 NO LOCK 26

34 図 2.12 先行トランザクションの QL 文の終了を待つ場合 図 2.13 先行トランザクションの終了を待つ場合 カーソル宣言および ET TRANACTION 文における指定と QL 文の占有モード指定における指定との対応関係 QL 文の占有モード指定を省略した場合 独立性水準 トランザクションアクセスモードおよび更新可能性句を組み合わせることによって 占有モード指定を指定したときと同等の資源の占有のしかたを設定できます 以下に ET TRANACTION 文および更新可能性句での指定と それに対応する占有モード指定を示します 占有モード指定がある QL 文と 占有モード指定を省略した QL 文との待ち関係については 以下の表を利用して同等の占有モード指定を確認した後 表 2.10 占有モード指定と待ち関係を参照してください 占有モード指定を省略した QL 文が INERT 文 UPDATE 文 位置づけおよび DELETE 文 位置づけの場合 ET TRANACTION 文における指定 独立性水準 ERIALIZABL E REPEATABLE READ READ COMMITTED READ UNCOMMITT ED トランザクションアクセスモード READ WRITE 対応する占有モード指定 EXCLUIVE LOCK 27

35 占有モード指定を省略した QL 文が UPDATE 文 探索および DELETE 文 探索の場合 ET TRANACTION 文における指定 独立性水準 ERIALIZABL E REPEATABLE READ READ COMMITTED READ UNCOMMITT ED トランザクションアクセスモード READ WRITE 対応する占有モード指定 ARE LOCK ( 更新対象行を検索するとき ) EXCLUIVE LOCK ( 更新対象行を更新するとき ) NO LOCK ( 更新対象行を検索するとき ) EXCLUIVE LOCK ( 更新対象行を更新するとき ) ただし クライアント用の動作環境ファイルの実行パラメタ UQL_LOCK に EX を指定した場合は 更新対象行を検索するときから EXCLUIVE LOCK で資源を占有します 占有モード指定を省略した QL 文が 単一行 ELECT 文の場合 ET TRANACTION 文における指定 独立性水準 ERIALIZABL E REPEATABLE READ READ COMMITTED READ UNCOMMITTE D トランザクションアクセスモード READ ONLY READ WRITE READ ONLY READ WRITE READ ONLY READ WRITE 対応する占有モード指定 ARE LOCK FREE LOCK NO LOCK 占有モード指定を省略した QL 文が カーソル宣言の場合 ET TRANACTION 文における指定 独立性水準 ERIALIZAB LE REPEATABL E READ トランザクションアクセスモード READ ONLY READ WRITE カーソル宣言の更新可能性句 FOR READ ONLY または省略 FOR UPDATE FOR READ ONLY または省略 対応する占有モード指定 ARE LOCK EXCLUIVE LOCK ARE LOCK 28

36 ET TRANACTION 文における指定 独立性水準 READ COMMITTE D READ UNCOMMIT TED QL 文単位の排他制御の例 トランザクションアクセスモード READ ONLY READ WRITE READ ONLY READ WRITE カーソル宣言の更新可能性句 FOR READ ONLY または省略 FOR UPDATE FOR READ ONLY 省略 FOR READ ONLY または省略 FOR UPDATE FOR READ ONLY または省略 対応する占有モード指定 FREE LOCK EXCLUIVE LOCK FREE LOCK ARE LOCK NO LOCK EXCLUIVE LOCK NO LOCK ET TRANACTION 文によりトランザクションモードを変更する場合 一度トランザクションを終了させる必要があります しかし QL 文に占有モード指定を指定することにより トランザクションを終了することなく QL 文が読み込んだデータベース資源の占有状態を変更することができます 以下に デッドロック抑止を目的とした占有モード指定の利用例を示します EXEC QL ELECT * FROM T1 (1) WERE C1 = 1 WIT OPTION LOCK_MODE(EXCLUIVE LOCK); EXEC QL UPDATE T1 (2) ET C2 = 2 WERE C1 = 1; EXEC QL COMMIT WORK; (3) (1) デッドロック抑止を目的として 単一行 ELECT 文に EXCLUIVE LOCK を指定します 参照時から資源を非共有モードで占有します (2) 単一行 ELECT 文によって位置づけられた行の列を更新します (3) COMMIT 文によりトランザクションを終了します QL 文での占有モード指定の使用例 アプリケーションを多重実行する場合 更新処理があると非共有モードで資源を占有する必要があります このため 他のアプリケーションが先に資源を占有している場合 そのアプリケーションのトランザクションが終了するまで 後続のアプリケーションは処理を待たされます しかし 同一のレコードを同時に更新することがなければ 排他なしで参照し 実際に更新するレコードのみ排他制御を行えばよいので システム全体の処理スピードを向上できます お互い同一のレコードを同時に更新しない場合は レコード位置づけ処理において他のアプリケーションのトランザクションを待たないように カーソル宣言の占有モード指定に NO LOCK を指定します 29

37 占有待ちの有無 トランザクション間で資源 ( 行 ページ DI) に対して競合が発生した場合 その時点で占有待ちに入る ( 資源が解放されるまで待つ ) 場合と アプリケーションに復帰する場合があります ymfoware/rdb による選択 占有待ちを行います 動作環境ファイルの実行パラメタでの選択方法 アプリケーションの動作環境ファイルの実行パラメタ IOLATION_WAIT で 以下に示すように指定します 表 2.11 動作環境ファイルの実行パラメタでの占有待ちの有無の選択方法 占有待ちの有無 占有待ちになる アプリケーションに復帰する 選択方法 WAIT を指定した場合 または省略した場合 REJECT を指定した場合 排他制御に関するパラメタの相互関係 排他制御に関する各パラメタの指定と 占有の単位および占有のふるまいについて 以下に示します R_LOCK の値 DO_LO CK の指定 ET TRANACTIO N 文の指定 占有モード指定の指定 占有のふるまい 占有の単位 占有モード指定での指定に従う 行単位 YE ET TRANACTION 文の独立性水準に従う ただし 独立性水準に ERIALIZABLE を指定した場合は REPEATABLE READ になる 占有モード指定での指定に従う 独立性水準は REPEATABLE READ になる 30

38 R_LOCK の値 DO_LO CK の指定 ET TRANACTIO N 文の指定 占有モード指定の指定 占有のふるまい 占有の単位 独立性水準は ERIALIZABLE になる DO_LOC K の指定に従う NO 占有モード指定での指定に従う ET TRANACTION 文の独立性水準に従う ただし 独立性水準に REPEATABLE READ を指定した場合は ERIALIZABLE になる ymfoware /RDB によって自動的に決定される 占有モード指定での指定に従う 独立性水準は ERIALIZABLE になる 指定可能 指定できません 指定を省略 資源の競合が起きた場合の制御 資源の競合が起きた場合に どのタイミングまで占有待ちとなるのかは トランザクションモードの指定によって異なります 以下に トランザクションモードの指定と資源の占有について示します 表 2.12 占有の単位が行の場合 後続トランザクション 独立性水準 ERIALIZA BLE REPEATAB LE READ QL 文の種類 独立性水準 Q L 文の種類 ERIALIZABLE REPEATABLE READ E LE CT IN E RT UP DA TE DE LE TE 先行トランザクション E LE CT READ COMMITTED IN ER T UP DA TE DE LE TE READ UNCOMMITTED E LE CT IN ER T UP DA TE ELE CT INE RT DE LE TE 31

39 先行トランザクション 独立性水準 ERIALIZABLE REPEATABLE READ READ COMMITTED READ UNCOMMITTED Q L 文の種類 E LE CT IN E RT UP DA TE DE LE TE E LE CT IN ER T UP DA TE DE LE TE E LE CT IN ER T UP DA TE DE LE TE READ COMMITT ED READ UNCOMMI TTED UPDA TE DELE TE ELE CT INE RT UPDA TE DELE TE 待つことなく動作する 先行トランザクションのQL 文が以下のいずれかの場合は 先行トランザクションのQL 文の終了を待つ 単一行 ELECT 文 更新可能性句に FOR READ ONLYを指定したカーソルのOPEN 文 トランザクションアクセスモードが読込み専用モードのときのOPEN 文 トランザクションの終了を待つ 表 2.13 占有の単位がページまたは DI の場合 後続トラ 独立性水準 QL 文の種類 独立性水準 Q L 文の種類 ERIALIZABL E REPEATABL E READ E L E C T IN E R T U P D A T E 先行トランザクション D E L E T E READ COMMITTED E L E C T IN E R T U P D A T E D E L E T E READ UNCOMMITT ED E L E C T IN E R T U P D A T E D E L E T E 32

40 先行トランザクション ンザクション ERIALIZA BLE REPEATAB LE READ READ COMMITTE D READ UNCOMMI TTED 独立性水準 Q L 文の種類 ERIALIZABL E REPEATABL E READ E L E C T IN E R T U P D A T E D E L E T E READ COMMITTED E L E C T IN E R T U P D A T E D E L E T E READ UNCOMMITT ED ELE CT INE RT UPDA TE DELE TE ELE CT INE RT UPDA TE DELE TE E L E C T IN E R T U P D A T E D E L E T E 待つことなく動作する 先行トランザクションのQL 文が以下のいずれかの場合は 先行トランザクションのQL 文の終了を待つ 単一行 ELECT 文 更新可能性句に FOR READ ONLYを指定したカーソルのOPEN 文 トランザクションアクセスモードが読込み専用モードのときのOPEN 文 トランザクションの終了を待つ 先行トランザクションがカーソルの OPEN 文を実行した場合は カーソル宣言の更新可能性句の指定によって占有待ちの制御が異なります 更新可能性句が READ ONLY の場合は ELECT 文と同じになります 更新可能性句が FOR UPDATE の場合は UPDATE 文と同じになります 行単位の排他を使用する場合の注意事項 行単位の排他を使用する場合に 設計時点で注意しなければならない事項について説明します QL 文のデータ操作文に関する注意事項 行単位の排他を使用する場合は そのトランザクションがアクセスしていない行は占有しません 競合する別のトランザクションでは 最初のトランザクションがアクセスしていない行を更新したり 新たな行を追加したりすることができます この 33

41 ため 以下のような現象が起こることがあります 構築する業務において この現象が発生すると不都合な場合は 行単位の排他を使用しないでください 同一トランザクション内で 同一の QL 文を繰り返し実行した場合に 異なる集合が検索されることがあります 例えば カーソルで検索する行が増えることがあります 一度目は成功した単一行 ELECT 文が 例外 ( 基数違反 ) となることがあります 集合関数の結果が変化することがあります 探索条件に副問合せを指定した問合せの検索結果が変化することがあります 行単位の排他では INERT 文は他のトランザクションの終了を待たずに実行できます このため あるトランザクションで行を削除して 新たな行を挿入する操作を行っているとき 競合する別のトランザクションでは まれに削除された行も挿入された行も参照できない場合があります また 以下の条件を満たす UPDATE 文の実行においても ymfoware/rdb が内部的に行の削除と挿入を行うため 更新前の行も更新後の行も参照できない場合があります クラスタキー列を更新する UPDATE 文を実行している DI 分割している場合の分割キーを更新する UPDATE 文を実行している 例 利用者 A が T1 の全レコードを検索します これと同時に 利用者 B が C1 が 40 であるレコードを削除して C1 が 25 であるレコードを挿入します 34

42 COMMIT 文および ROLLBACK 文に関する注意事項 トランザクション中で参照された資源の排他情報は COMMIT 文または ROLLBACK 文で回収されます 排他情報の数は 行排他の場合は行数 ページ排他の場合はページ数になります COMMIT 文または ROLLBACK 文を実行すると以下の事象が発生します 管理している資源数に比例して COMMIT 文または ROLLBACK 文の処理時間が長くなります また COMMIT 文や ROLLBACK 文実行中に その RDB システム内で最初にアクセスする資源に対して QL 文や RDB コマンドを実行すると COMMIT 文や ROLLBACK 文が終了するまで待たされます トランザクションを短くするか あらかじめ rdbconbf コマンドでバッファ結合を行った上で運用してください 行単位の排他では トランザクション中に行った更新内容は COMMIT 文実行時にまとめてインデックスへ反映します このため トランザクション中に行った挿入 インデックスキー値更新および削除の件数に比例して COMMIT 文の処理時間も長くなります COMMIT 時のエラー処理に関する注意事項 COMMIT 文実行時に 以下のエラーが発生する可能性があります WENEVER 文を利用して COMMIT 文もエラー処理の対象としてください テンポラリログ領域不足 インデックスの DI の容量不足 デッドロック 領域の再利用に関する注意事項 行単位の排他を使用する場合 DELETE 文または UPDATE 文を実行することによって DI 内に発生する削除領域は トランザクション完了後に再利用されます そのため 同一トランザクション内で大量の件数を削除し 続いて挿入を行うような場合は 削除後に一度 COMMIT 文を実行してトランザクションを区切ることで 領域を有効に使用することができます デッドロックの対処方法 アプリケーションがデータベースをアクセスする場合の排他制御は トランザクション単位に行われます したがって いくつかのアプリケーションを並行して実行した場合 データ操作の順序によっては 以下に示すようにデッドロックが発生します このため アプリケーションには デッドロックの対処が必要になる場合があります 図 2.14 デッドロックの発生例 以下の順序で処理が行われるとデッドロックが発生します (1) APL1 が表 T1 に対して参照ロックを獲得します ((5) の COMMIT までロックを保持します ) (2) APL2 が表 T2 に対して参照ロックを獲得します ((6) の COMMIT までロックを保持します ) (3) APL1 は表 T1 の参照を終え 表 T2 を更新するために表 T2 に対して更新ロックを獲得しようとしますが 表 T2 には APL2 が参照ロックを獲得しているため待たされます ( 表 T1 は APL1 がロックを獲得したままとなります ) 35

43 (4) APL2 は表 T2 の参照を終え 表 T1 を更新するために表 T1 に対して更新ロックを獲得しようとしますが 表 T1 には APL1 が参照ロックを獲得しているため待たされます ( 表 T2 は APL2 がロックを獲得したままとなります ) APL1 と APL2 は 互いに相手方のトランザクションが終了するのを待たされる状態になります ところが APL1 の (5) の COMMIT および APL2 の (6) の COMMIT が実行されないために どちらのアプリケーションも実行できなくなります この状態がデッドロックです デッドロックは ymfoware/rdb が自動的に検出します ymfoware/rdb がデッドロックを検出すると 複数のトランザクションのうちの 1 つのトランザクションを取り消して アプリケーションにエラー復帰します このとき QLTATE には トランザクションの直列化に失敗 を表す例外コードが設定されます デッドロックの発生を通知されたアプリケーションでは 一般にデッドロックが発生したトランザクションの再実行を試みます トランザクションを再実行するには トランザクションを開始した文の直前に制御を移します ただし QL 文で使用するホスト変数をトランザクションの処理途中で変更している場合には その値をトランザクションの開始時点に戻す必要があります 以下に 図 2.14 デッドロックの発生例の APL1 が トランザクションの再実行を行う場合の処理の流れを示します 図 2.15 デッドロックに対処する処理の例 カーソル操作での注意事項 カーソル宣言の更新可能性句を省略しそのカーソルが更新可能な場合 そのカーソルで更新を行うことができます この場合 以下に示す操作を行うと デッドロックが起きることがあります 36

44 図 2.16 カーソル操作でデッドロックが起きる例 (1) 利用者 A は 更新可能性句を省略したカーソルの OPEN 文を実行します これにより 表 T1 で参照した部分に対して共有モードで占有します (2) 利用者 B も同じく 更新可能性句を省略したカーソルの OPEN 文を実行します これにより 表 T1 で参照した部分に対して共有モードで占有します (3) 利用者 A が表 T1 で参照した部分を更新するために 非共有モードで占有しようとしますが 表 T1 は利用者 B が共有モードで占有しているため待たされます ( 表 T1 は利用者 A が共有モードで占有したままとなります ) (4) 利用者 B が表 T1 で参照した部分を更新するために 更新ロックを獲得しようとしますが 表 T1 は利用者 A が共有モードで占有しているため待たされます ( 表 T1 は利用者 A が共有モードで占有したままとなります ) カーソル操作でデッドロックを起こさないため 更新系の QL 文を実行する場合には カーソル宣言の占有モード指定に EXCLUIVE LOCK を指定してください 図 2.17 EXCLUIVE LOCK を利用したデッドロックの回避例 (1) 利用者 A は EXCLUIVE LOCK で参照し COMMIT(ROLLBACK) 終了するまで資源を占有します 37

45 (2) 利用者 B は EXCLUIVE LOCK で参照を行うため 利用者 A が資源を解放するまで参照を行えず 待ち状態となります (3) 利用者 A は 他のアプリケーションに待たされることなく更新処理を行います (4) 利用者 A が COMMIT(ROLLBACK) します 利用者 A の資源は解放されます (5) 利用者 A が資源を解放したので 利用者 B の参照が実行されます この時 資源を占有します (6) 利用者 B の更新が実行されます (7) 利用者 B が COMMIT(ROLLBACK) します トランザクション実行時間の設定 アプリケーションが QL 文を実行すると データベースサーバにメモリ資源や排他資源を獲得します この資源を獲得したまま アプリケーションに何らかの異常が発生した場合 獲得した資源が回収できなくなることがあります このような問題を防止するには 動作環境ファイルの実行パラメタ TRAN_TIME_LIMIT を使用します TRAN_TIME_LIMIT に 1 つのトランザクションの最大実行可能時間を指定すると トランザクションが指定時間を超過した場合は コネクションを切断し 獲得した資源を回収します 当パラメタはシステム用の動作環境ファイル クライアント用の動作環境ファイルまたはサーバ用の動作環境ファイルに指定することができます 動作環境ファイルの詳細については 6.4 アプリケーションのチューニング を参照してください 2.4 コネクション ここでは コネクションの概要 コネクションの接続および切断について説明します コネクションとは コネクションの接続 コネクションの切断 コネクションとは コネクションとは クライアントのアプリケーションがサーバの ymfoware/rdb データベースにアクセスするために クライアントとサーバの間を結んだ接続関係のことです アプリケーションがデータベースシステムとコネクションをもつことによって そのデータベースシステムの資源を操作することができます コネクションの接続 アプリケーションとサーバとのコネクションの接続は CONNECT 文で行います また コネクションを接続することにより QL 文を実行することができます コネクションの切断 アプリケーションとサーバとのコネクションの切断は DICONNECT 文で行います コネクションの切断は CONNECT 文で接続したコネクションに対して実行できます また トランザクションは終了した状態で実行します コネクションのプログラミング概要を以下に示します [ アプリケーション ] EXEC QL CONNECT TO 'DB01' A 'C1'; (1) EXEC QL ELECT 在庫数量, 倉庫番号 INTO 1, 2 FROM.T (2) WERE 倉庫番号 =2 ; EXEC QL COMMIT WORK ; (3) EXEC QL DICONNECT 'C1' ; (4) 38

46 EXEC QL CONNECT TO 'V1' A 'C2' UER 'U/PW' ; (5) EXEC QL ELECT 在庫数量, 倉庫番号 INTO 1, 2 FROM 1.T1 (6) WERE 倉庫番号 =2 ; EXEC QL COMMIT WORK ; (7) EXEC QL DICONNECT 'C2' ; (8) (1)~(4) は ローカルアクセスの場合です (5)~(8) は リモートアクセスの場合です (1) CONNECT 文にデータベース名を指定することにより ローカルのサーバ上にある DB01 に対して C1 のコネクションを接続します (2) コネクションを接続した DB01 に対して単一行 ELECT 文を実行します (3) DB01 に対してのトランザクションを終了します (4) DICONNECT 文により DB01 に対して C1 のコネクションを切断します (5) CONNECT 文に QL サーバ名 ユーザ ID パスワードを指定することにより リモートのサーバ V1 に対して C2 のコネクションを接続します (6) コネクションを接続した V1 に対して単一行 ELECT 文を実行します (7) V1 に対してのトランザクションを終了します (8) DICONNECT 文により V1 に対して C2 のコネクションを切断します コネクションの接続方法 CONNECT 文でサーバとコネクションを接続する場合 以下のいずれかの方法で行います ただし リモートアクセスの場合は サーバの情報を動作環境ファイルの ERVER_PEC に定義しておく必要があります また 接続先のサーバの O ファイル (UNIX 系の場合は /etc/services ファイル Windows(R) 2000 の場合は C WINNT system32 drivers etc services ファイル Windows erver(r) 2003 または Windows erver(r) 2008 の場合は C WINDOW system32 drivers etc services ファイル ) にサービス名とポート番号が定義されている必要があります 指定するポート番号は 通信方法によって異なります ローカルアクセスの場合 データベース名 を指定した CONNECT 文を実行する DEFAULT を指定した CONNECT 文を実行する リモートアクセスの場合 QL サーバ名 を指定した CONNECT 文を実行する DEFAULT を指定した CONNECT 文を実行する 参照 ポート番号の指定方法の詳細については セットアップガイド または RDAV オペレーションガイド を参照してください ポート番号の指定方法の詳細については セットアップガイド を参照してください ローカルアクセスの場合 データベース名 を指定した CONNECT 文を実行する データベース名を指定して CONNECT 文を実行すると ローカルのサーバとコネクションが接続されます 39

47 DEFAULT を指定した CONNECT 文を実行する DEFAULT を指定して CONNECT 文を実行する場合は 以下の方法でサーバとコネクションを接続します 1. 動作環境ファイルの DEFAULT_CONNECTION に データベース名を指定します 2. DEFAULT を指定して CONNECT 文を実行すると 動作環境ファイルの DEFAULT_CONNECTION を参照します ここで指定した名前と同じ QL サーバ名をもつ ERVER_PEC 情報がなければ この指定をデータベース名とみなして ローカルのサーバとコネクションが接続されます デフォルトコネクションの情報を利用してコネクションを接続する方法を以下に示します 図 2.18 デフォルトコネクションの情報を利用してコネクションを接続する方法 (1) CONNECT 文に DEFAULT を指定して アプリケーションを実行します (2) CONNECT 文の実行時は 動作環境ファイルの DEFAULT_CONNECTION の情報を参照します さらに DEFAULT_CONNECTION で指定されたデータベース DB01 が存在するサーバとコネクションを接続します リモートアクセスの場合 サーバの情報を定義する CONNECT 文でサーバとコネクションを接続するには まず サーバの情報を 動作環境ファイルの ERVER_PEC に定義します ERVER_PEC は 必要なコネクションに対してすべて定義します 定義する情報は QL サーバ名 およびデータ資源名などです 定義する情報の詳細は クライアント用の動作環境ファイルの作成 を参照してください QL サーバ名 を指定した CONNECT 文を実行する QL サーバ名 ユーザ ID およびパスワードを指定して CONNECT 文を実行すると 動作環境ファイルに定義した ERVER_PEC のうち CONNECT 文と同じ QL サーバ名をもつサーバの情報で サーバとコネクションが接続されます CONNECT 文に QL サーバ名を指定してコネクションを接続する方法を以下に示します 図 2.19 CONNECT 文に QL サーバ名を指定してコネクションを接続する方法 (1) CONNECT 文に QL サーバ名を指定して アプリケーションを実行します (2) CONNECT 文の実行時は 動作環境ファイルの ERVER_PEC で QL サーバ名が V1 のものの情報でサーバとコネクションを接続します 40

48 DEFAULT を指定した CONNECT 文を実行する DEFAULT を指定して CONNECT 文を実行する場合は 以下の方法でサーバとコネクションを接続します 1. デフォルトコネクションの情報を 動作環境ファイルの DEFAULT_CONNECTION に定義します 定義情報は QL サーバ名 ユーザ ID パスワードです 定義情報の詳細は クライアント用の動作環境ファイルの作成 を参照してください 2. DEFAULT を指定して CONNECT 文を実行すると 動作環境ファイルの DEFAULT_CONNECTION を参照します ここで指定した名前と同じ QL サーバ名をもつ ERVER_PEC の情報を参照して サーバとコネクションが接続されます デフォルトコネクションの情報を利用してコネクションを接続する方法を以下に示します 図 2.20 デフォルトコネクションの情報を利用してコネクションを接続する方法 (1) CONNECT 文に DEFAULT を指定して アプリケーションを実行します (2) CONNECT 文の実行時は 動作環境ファイルの DEFAULT_CONNECTION の情報を参照します (3) さらに DEFAULT_CONNECTION の QL サーバ名 V1 から QL サーバ名が V1 の ERVER_PEC 情報を参照して サーバとコネクションを接続します 複数コネクション アプリケーションの 1 つのセションで 複数の CONNECT 文を実行することによって 複数のコネクションを接続することができます これによって 複数のデータベースに対し データ操作を行うことができます ここでは 複数コネクションの操作について 以下の順に説明します 複数コネクションの接続 現コネクションと QL 文の実行 現コネクションの変更 複数コネクションの切断 複数コネクションで QL 文を実行する場合の注意事項 複数コネクションの接続 複数のコネクションの接続は 複数の CONNECT 文を実行することによって行います 以下に具体例を示します 41

49 現コネクションと QL 文の実行 アプリケーションが複数のコネクションをもつ場合 QL 文の実行対象となるコネクションを決めておく必要があります QL 文の実行対象となるコネクションを現コネクションと呼びます 複数の CONNECT 文を実行した場合 最後の CONNECT 文で接続したコネクションが 現コネクションとなります 複数コネクションのプログラミング概要を以下に示します [ アプリケーション ] EXEC QL CONNECT TO 'DB01' A 'C1' ; (1) EXEC QL CONNECT TO 'DB02' A 'C2' ; (2) EXEC QL ELECT 在庫数量, 倉庫番号 INTO 1, 2 FROM.T (3) WERE 倉庫番号 =2 ; EXEC QL CONNECT TO 'V3' A 'C3' UER 'U3/PA3'; (4) EXEC QL CONNECT TO 'V4' A 'C4' UER 'U4/PA4'; (5) EXEC QL ELECT 在庫数量, 倉庫番号 INTO 1, 2 FROM 1.T1 (6) WERE 倉庫番号 =2 ; 42

50 (1)~(3) は ローカルアクセスの場合です (4)~(6) は リモートアクセスの場合です (1) 1 回目の CONNECT 文により DB01 に対して C1 のコネクションを接続します (2) 2 回目の CONNECT 文により DB02 に対して C2 のコネクションを接続します (3) 現コネクションの DB02 に対して単一行 ELECT 文を実行します (4) 3 回目の CONNECT 文により サーバ V3 に対して C3 のコネクションを接続します (5) 4 回目の CONNECT 文により サーバ V4 に対して C4 のコネクションを接続します (6) 現コネクションのサーバ V4 に対して単一行 ELECT 文を実行します 現コネクションの変更 複数のコネクションを接続した場合 ET CONNECTION 文で現コネクションを変更することができます ET CONNECTION 文を利用することにより 変更した現コネクションのサーバとデータ操作を行うことができます 現コネクションを変更する際に トランザクションを終了する必要はありません しかし 同一のトランザクションで 複数のコネクションに対してデータベースを更新する QL 文を実行することはできません その際にはトランザクションを一度終了してください 現コネクションを変更するプログラミングの概要を以下に示します [ アプリケーション ] EXEC QL CONNECT TO 'DB01' A 'C1' ; (1) EXEC QL ELECT 在庫数量, 倉庫番号 INTO 1, 2 FROM 在庫表 (2) WERE 在庫数量 =300 ; EXEC QL COMMIT WORK ; (3) EXEC QL CONNECT TO 'DB02' A 'C2' ; (4) EXEC QL INERT INTO 伝票 ( 在庫カラム, 倉庫カラム ) VALUE(1,2) ; (5) EXEC QL COMMIT WORK ; (6) EXEC QL ET CONNECTION 'C1' ; (7) EXEC QL ELECT 出荷量 INTO 3 FROM 在庫表 2 WERE XX=100 ; (8) EXEC QL COMMIT WORK ; (9) EXEC QL CONNECT TO 'V3' A 'C3' UER 'U3/PA3' ; (10) EXEC QL ELECT 在庫数量, 倉庫番号 INTO 1, 2 FROM 在庫表 1 (11) WERE 倉庫番号 =2 ; EXEC QL COMMIT WORK ; (12) EXEC QL CONNECT TO 'V4' A 'C4' UER 'U4/PA4' ; (13) EXEC QL INERT INTO 伝票 1( 在庫カラム, 倉庫カラム ) VALUE(1,2) ; (14) EXEC QL COMMIT WORK ; (15) EXEC QL ET CONNECTION 'C3' ; (16) 43

51 EXEC QL ELECT 出荷量 INTO 3 FROM 在庫表 3 WERE XX=100 ; (17) (1)~(9) は ローカルアクセスの場合です (10)~(17) は リモートアクセスの場合です (1) 1 回目の CONNECT 文により DB01 に対して C1 のコネクションを接続します (2) DB01 の在庫表から単一行 ELECT 文で在庫数量と倉庫番号を取り出します (3) (2) の操作に対して トランザクションを終了します (4) 2 回目の CONNECT 文により DB02 に対して C2 のコネクションを接続します (5) DB02 の伝票の在庫カラムと倉庫カラムに DB01 から取り出した在庫数量と倉庫番号を追加します (6) (5) の操作に対して トランザクションを終了します (7) ET CONNECTION 文により 現コネクションを C1 に変更します (8) DB01 の在庫表 2 から単一行 ELECT 文で出荷量を取り出します (9) (8) の操作に対して トランザクションを終了します (10) 3 回目の CONNECT 文により サーバ V3 に対して C3 のコネクションを接続します (11) サーバ V3 の在庫表 1 から 単一行 ELECT 文で在庫数量と倉庫番号を取り出します (12) (11) の操作に対して トランザクションを終了します (13) 4 回目の CONNECT 文により サーバ V4 に対して C4 のコネクションを接続します (14) サーバ V4 の伝票 1 の在庫カラムと倉庫カラムに サーバ V3 から取り出した在庫数量と倉庫番号を追加します (15) (14) の操作に対して トランザクションを終了します (16) ET CONNECTION 文により 現コネクションを C3 に変更します (17) サーバ V3 の在庫表 3 から単一行 ELECT 文で出荷量を取り出します トランザクションを終了させずに現コネクションを変更するプログラミングの概要を以下に示します [ アプリケーション ] EXEC QL DECLARE CUR1 CUROR FOR ELECT 在庫数量, 倉庫番号 FROM 在庫表 ; EXEC QL CONNECT TO 'DB01' A 'C1' ; EXEC QL OPEN CUR1 ; EXEC QL FETC CUR1 INTO 1,2 ; EXEC QL CONNECT TO 'DB02' A 'C2' ; EXEC QL INERT INTO 伝票 ( 在庫カラム, 倉庫カラム ) VALUE(1,2) ; EXEC QL ET CONNECTION 'C1' ; EXEC QL FETC CUR1 INTO 1,2 ; EXEC QL ET CONNECTION 'C2' ; EXEC QL INERT INTO 伝票 ( 在庫カラム, 倉庫カラム ) VALUE(1,2) ; 44

52 複数コネクションの切断 複数コネクションの切断は CONNECT 文で接続した それぞれのコネクションに対して DICONNECT 文で行います コネクションを切断する場合は トランザクションは終了した状態でなければなりません コネクションを切断せずに処理を終了すると 利用されていないコネクションが残ったままとなります 複数コネクションを切断するプログラミングの概要を以下に示します [ アプリケーション ] EXEC QL CONNECT TO 'DB01' A 'C1' ; (1) EXEC QL ELECT 在庫数量, 倉庫番号 INTO 1, 2 FROM 在庫表 (2) WERE 在庫数量 =300; EXEC QL COMMIT WORK ; (3) EXEC QL CONNECT TO 'DB02' A 'C2' ; (4) EXEC QL INERT INTO 伝票 ( 在庫カラム, 倉庫カラム ) VALUE(1,2); (5) EXEC QL COMMIT WORK ; (6) EXEC QL DICONNECT 'C1' ; (7) EXEC QL DICONNECT 'C2' ; (8) EXEC QL CONNECT TO 'V3' A 'C3' UER 'U3/PA3' ; (9) EXEC QL ELECT 在庫数量, 倉庫番号 INTO 1, 2 FROM 在庫表 1 (10) WERE 在庫数量 =300 ; EXEC QL COMMIT WORK ; (11) EXEC QL CONNECT TO 'V4' A 'C4' UER 'U4/PA4' ; (12) EXEC QL INERT INTO 伝票 1( 在庫カラム, 倉庫カラム ) VALUE(1,2) ; (13) EXEC QL COMMIT WORK ; (14) EXEC QL DICONNECT 'C3' ; (15) EXEC QL DICONNECT 'C4' ; (16) (1)~(8) は ローカルアクセスの場合です (9)~(16) は リモートアクセスの場合です (1) 1 回目の CONNECT 文により DB01 に対して C1 のコネクションを接続します (2) DB01 の在庫表から単一行 ELECT 文で在庫数量と倉庫番号を取り出します (3) (2) の操作に対して トランザクションを終了します (4) 2 回目の CONNECT 文により DB02 に対して C2 のコネクションを接続します (5) DB02 の伝票の在庫カラムと倉庫カラムに DB01 から取り出した在庫数量と倉庫番号を追加します (6) (5) の操作に対して トランザクションを終了します (7) DB01 に対して C1 のコネクションを切断します (8) DB02 に対して C2 のコネクションを切断します (9) 3 回目の CONNECT 文により サーバ V3 に対して C3 のコネクションを接続します (10) サーバ V3 の在庫表 1 から 単一行 ELECT 文で在庫数量と倉庫番号を取り出します 45

53 (11) (10) の操作に対して トランザクションを終了します (12) 4 回目の CONNECT 文により サーバ V4 に対して C4 のコネクションを接続します (13) サーバ V4 の伝票 1 の在庫カラムと倉庫カラムに サーバ V3 から取り出した在庫数量と倉庫番号を追加します (14) (13) の操作に対して トランザクションを終了します (15) サーバ V3 に対して C3 のコネクションを切断します (16) サーバ V4 に対して C4 のコネクションを切断します 複数コネクションで QL 文を実行する場合の注意事項 カーソル操作での注意 カーソルをオープンしたあとに 複数のコネクションにまたがって 同じカーソルの操作を行うことはできません ほかのコネクションで同じカーソルを操作するには カーソルをクローズしたあとでなければなりません このカーソル操作の例として 誤った指定例および正しいカーソル操作の例を以下に示します 例 1 誤ったカーソル操作の場合 [ アプリケーション ] EXEC QL DECLARE CUR1 CUROR FOR ELECT 在庫数量 FROM 在庫表 ; (1) EXEC QL CONNECT TO 'DB01' A 'C1' ; (2) EXEC QL OPEN CUR1 ; (3) EXEC QL CONNECT TO 'DB02' A 'C2' ; (4) 例 2 EXEC QL FETC CUR1 INTO TOCK ; エラー (5) (1) カーソル CUR1 を宣言します (2) DB01 に対して C1 のコネクションを接続します (3) DB01 に対して カーソル CUR1 をオープンします (4) DB02 に対して C2 のコネクションを接続します (5) DB02 に対して カーソル CUR1 を FETC すると すでに DB01 に対してカーソルがオープンしているため エラーとなります 正しいカーソル操作の場合 [ アプリケーション ] EXEC QL DECLARE CUR1 CUROR FOR ELECT 在庫数量 FROM 在庫表 ; (1) EXEC QL CONNECT TO 'DB01' A 'C1' ; (2) EXEC QL OPEN CUR1 ; (3) EXEC QL CLOE CUR1 ; (4) EXEC QL COMMIT WORK ; (5) EXEC QL CONNECT TO 'DB02' A 'C2' ; (6) EXEC QL OPEN CUR1 ; EXEC QL CLOE CUR1 ; (1) カーソル CUR1 を宣言します 46

54 (2) DB01 に対して C1 のコネクションを接続します (3) DB01 に対して カーソル CUR1 をオープンします (4) カーソル CUR1 をクローズします (5) (3) でオープンしたカーソルを使用して更新操作を行った場合 トランザクションを終了します (6) DB02 にコネクションを接続して カーソル CUR1 をオープンします 更新操作での注意 1 つのトランザクションで 複数のコネクションに対してデータベースを更新する QL 文は実行できません 複数のコネクションのデータを更新する場合は 別々のトランザクションにする必要があります この更新操作の例として 誤った指定例および正しい更新操作の例を以下に示します 例 1 誤った更新操作の場合 [ アプリケーション ] EXEC QL CONNECT TO 'DB01' A 'C1' ; (1) EXEC QL CONNECT TO 'DB02' A 'C2' ; (2) EXEC QL UPDATE 在庫表 ET 在庫数量 =300 WERE 品番号 =10; (3) EXEC QL ET CONNECTION 'C1' ; (4) 例 2 EXEC QL UPDATE 支店表 ET 社員数 =100 WERE 支店番号 =80; エラー (5) (1) DB01 に対して C1 のコネクションを接続します (2) DB02 に対して C2 のコネクションを接続します この場合のコネクションが現コネクションになります (3) DB02 に対して更新操作を行います (4) DB01 に現コネクションを変更します (5) DB02 に対する更新操作のトランザクションが終了していないため DB01 に対する更新操作はエラーとなります 正しい更新操作の場合 [ アプリケーション ] EXEC QL CONNECT TO 'DB01' A 'C1' ; EXEC QL CONNECT TO 'DB02' A 'C2' ; EXEC QL UPDATE 在庫表 ET 在庫数量 =300 WERE 品番号 =10; EXEC QL COMMIT WORK ; (1) EXEC QL ET CONNECTION 'C1' ; (2) EXEC QL UPDATE 支店表 ET 社員数 =100 WERE 支店番号 =80; EXEC QL COMMIT WORK ; (1) DB02 に対しての更新操作のトランザクションを終了します (2) DB01 に現コネクションを変更して DB01 に対して更新操作を行います 47

55 データベースの定義での注意 1 つのトランザクションで 複数のコネクションに対して データベースの定義変更を行うことはできません コネクションを意識しないデータ操作の方法 ローカルアクセスの場合 コネクション操作を意識しなくてもデータ操作を行うことができます この場合 あらかじめ接続先を指定しておくことによって アプリケーションの実行時にサーバに接続し アプリケーションの終了時にコネクションが切断されます 接続先の指定方法 コネクションを意識しないデータ操作を行う場合の接続先の指定には 以下の方法があります コンパイル時に指定する DEFAULT_CONNECTION に指定する コンパイル時に指定する アプリケーションのコンパイル時に データベース名を指定することによって アプリケーション中に CONNECT 文を記述しなくてもデータ操作を行うことができます 以下に例を示します コンパイルコマンドの詳細については コンパイル時のコネクション先の指定 を参照してください コンパイルコマンドの詳細については コンパイル時のコネクション先の指定 を参照してください コンパイル時に接続するデータベース名を指定した例 (1) コンパイル時にデータベース名 DB01 を指定します (2) アプリケーション中に CONNECT 文は一切記述されていません (3) アプリケーション実行時に コンパイル時に指定した DB01 に接続されます DEFAULT_CONNECTION に指定する 動作環境ファイルの DEFAULT_CONNECTION にデータベース名を指定することによって アプリケーション中に CONNECT 文を記述しなくてもデータ操作を行うことができます 以下に例を示します 48

56 DEFAULT_CONNECTION にデータベース名を指定した例 (1) コンパイル時にはデータベース名を指定しません (2) クライアント用の動作環境ファイルの DEFAULT_CONNECTION に DB01 を指定します (3) アプリケーション中に CONNECT 文は一切記述されていません (4) アプリケーション実行時に クライアント用の動作環境ファイルで指定した DB01 に接続されます マルチ RDB 運用のコネクション ymfoware/rdb では ローカルアクセスを行うとき 複数の ymfoware/rdb の動作環境を作成して運用することができます このような運用形態を マルチ RDB 運用といいます アプリケーションを利用して ローカルアクセス時に異なる ymfoware/rdb に接続する場合は データベース名にシステム名を付けて指定します EXEC QL CONNECT TO 'rdbsys2.db01'; CONNECT 文を複数記述することによって 複数の ymfoware/rdb 環境に接続することができます 以下に例を示します 49

57 アプリケーションをマルチRDB 環境で利用するシステム名を省略した場合は 環境変数 RDBNAMEで指定したものが有効となります 以下に例を示します 環境変数での指定例 Cシェルで指定する場合 setenv RDBNAME rdbsys1 bash B シェル K シェルで指定する場合 RDBNAME=rdbsys1; export RDBNAME set RDBNAME = rdbsys1 50

58 2.5 文字コード系の考慮 アプリケーション開発を行う場合に 文字コード系に関して考慮しなければならない点を説明します 文字コード系の決定 C 言語および COBOL 言語のアプリケーションで使用する文字コード系について説明します アプリケーションで使用可能な文字コード系 C 言語および COBOL 言語のアプリケーションでは 以下の文字コード系が使用できます EUC コード シフト JI コード UNICODE 使用する文字コード系はアプリケーションのロケールで指定します アプリケーションのロケールは 以下のように指定します 表 2.14 アプリケーションのロケールの指定 olaris Linux Windows 対象 O ロケールの指定 環境変数 LANG でロケールを指定します O のロケールに従います UNIX 系システムでは環境変数 LANG に C ロケールを指定することも可能です ymfoware/rdb は ロケールの言語が ja で始まる場合は日本語のメッセージを出力し それ以外のロケール (C ロケールなど ) の場合は英語でメッセージを出力します C ロケールの場合 アプリケーションが動作する環境によって アプリケーションの文字コード系は以下のようになります アプリケーションが動作する環境 ymfoware/rdb と同一サーバのアプリケーション Connection Manager を利用するアプリケーション クライアント端末のアプリケーション アプリケーションの文字コード系 ymfoware/rdb インストール時に指定するデータベースの文字コード系 Connection Manager インストール時に指定するアプリケーションの文字コード系 ymfoware erver クライアント機能インストール時に指定するアプリケーションの文字コード系 ホスト変数の文字コード系 アプリケーションで使用するホスト変数 動的パラメタ および QLMG の文字コード系について説明します C 言語のアプリケーションで使用するホスト変数の文字コード系 アプリケーションで使用するホスト変数 動的パラメタ および QLMG の文字コード系は 環境変数 LANG の値によって決定します これを変更するには クライアント用の動作環境ファイルのパラメタ CAR_ET および NCAR_CODE で指定します 文字列型ホスト変数の文字コード系は パラメタ CAR_ET に指定します 指定する値を以下に示します 表 2.15 文字列型ホスト変数の文字コード系 文字コード系 EUCコー 90コードド EUC_90 CAR_ET の指定値 51

59 文字コード系 シフト JI コード UNICOD E U90 コード UTF8 形式 CAR_ETの指定値 EUC_U90またはEUC JI UTF8 各国語文字列型ホスト変数の文字コード系は パラメタ NCAR_CODE に指定します 指定する値を以下に示します 表 2.16 各国語文字列型ホスト変数の文字コード系 EUC コード シフト JI コード UNICODE 文字コード系 90 コード U90 コード 90 コード (COBOL_EUC 形式 ) U90 コード (COBOL_EUC 形式 ) UTF8 形式 UC2 形式 ( 注 ) バイトスワップした UC2 形式 ( 注 ) NCAR_CODE の指定値 EUC_90 EUC_U90 または EUC COBOL_EUC_90 COBOL_EUC_U90 または COBOL_EUC JI UTF8 UC2 UC2B 注 ) UC2 形式およびバイトスワップした UC2 形式では 補助文字 (1~16 面の 4 バイト文字 ) は 2 文字となります クライアント用の動作環境ファイルに文字コード系が指定されていない場合は 環境変数 LANG の値によってデフォルトの文字コード系が決まります 環境変数 LANG と使用される文字コード系の関係を以下に示します 表 2.17 デフォルトの文字コード系 環境変数 LANG の値 ja ja_jp.pck ja_jp.utf8 文字列型ホスト変数の格納形式 EUC コード シフト JI コード UTF8 形式 各国語文字列型ホスト変数の格納形式 COBOL 言語のアプリケーションで使用するホスト変数の文字コード系 アプリケーションで使用するホスト変数 動的パラメタ および QLMG では以下の文字コード系が使用できます 文字列型ホスト変数および各国語文字列型のホスト変数の文字コード系は 環境変数 LANG の値によって決まります 環境変数 LANG とコード系の関係を以下に示します 表 2.18 COBOL 言語のアプリケーションの文字コード系 環境変数 LANG の値文字列型ホスト変数の格納形式 各国語文字列型ホスト変数の格納形式 ja EUC コード COBOL_EUC 形式 ja_jp.pck シフト JI コード 52

60 環境変数 LANG の値文字列型ホスト変数の格納形式 各国語文字列型ホスト変数の格納形式 olaris UC2 形式 ( 注 1) ja_jp.utf8 UTF8 形式 Linux バイトスワップした UC2 形式 ( 注 1) ( 注 2) 注 1) UC2 形式およびバイトスワップした UC2 形式では 補助文字 (1~16 面の 4 バイト文字 ) は 2 文字となります 注 2) コンパイル時のオプションの指定により ビッグエンディアンとリトルエンディアンのいずれかの形式を選択することができます アプリケーションで使用するホスト変数 動的パラメタ および QLMG では シフト JI コードまたは UNICODE が使用できます UNICODE を使用する場合 アプリケーションのコンパイル時にオプションで指定します 文字コード系とホスト変数の格納形式の関係を以下に示します 表 2.19 COBOL 言語のアプリケーションの文字コード系とホスト変数の格納形式 文字コード系 シフト JI コード 文字列型ホスト変数の格納形式 シフト JI コード 各国語文字列型ホスト変数の格納形式 UNICODE UTF8 形式 バイトスワップしたUC2 形式 ( 注 ) 注 ) バイトスワップした UC2 形式では 補助文字 (1~16 面の 4 バイト文字 ) は 2 文字となります 注意 COBOL 言語のアプリケーションの場合は クライアント用の動作環境ファイルに指定されたパラメタ CAR_ET および NCAR_CODE は無視されます コード変換の考慮 アプリケーションが使用する文字コード系と データベースに格納されるデータの文字コード系が異なる場合 ymfoware/ RDB は自動的にコード変換を行います コード変換について以下の順に説明します コード変換の発生条件 コード変換と文字列長 コード変換指定に従わないもの コード変換の発生条件 アプリケーションが扱うデータとデータベースに格納されるデータの文字コード系が異なる場合 ymfoware/rdb は双方向でコード変換を行って文字コード系を調整します データベースに格納されるデータを抽出する際 アプリケーションの文字コード系に存在しない文字コードは アンダースコア _ に変換されます 逆に アプリケーションからデータベースに格納する際 データベースの文字コード系に存在しない文字コードが含まれると コード変換エラーとなります 53

61 C 言語の場合のコード変換 クライアント用の動作環境ファイルのパラメタ CAR_ET および NCAR_CODE に指定された文字コード系と データベースの文字コード系の間のコード変換の有無を以下に示します 表 2.20 アプリケーションのコード変換 ( 文字列型 ) CAR_ET の指定 EUC コードの 90 コード データベースの文字コード系 EUC コードの U90 コード シフト JI コード EUC_90 EUC_U90 EUC JI UTF8 コード変換を行わず処理 コード変換を行って処理 UNICOD E エラー ( 文字コード系を指定することはできません ) 表 2.21 アプリケーションのコード変換 ( 各国語文字列型 ) NCAR_COD E の指定 EUC_90 COBOL_EUC _90 EUC_U90 EUC COBOL_EUC _U90 COBOL_EUC EUC コードの 90 コード データベースの文字コード系 EUC コードの U90 コード シフト JI コード JI UTF8 UC2 UC2B コード変換を行わず処理 コード変換を行って処理 UNICOD E エラー ( 文字コード系を指定することはできません ) 54

62 コード変換と文字列長 データベースの文字コード系と QL 埋込みホストプログラム内のホスト変数で使用する文字列の文字コード系が異なる場合 データ操作でコード変換が発生します それぞれの文字コード系によってはデータ長が増減することがあるため QL 埋込みホストプログラムを作成する場合に考慮が必要です ここでは 文字コード系と使用できる文字列長について説明します 文字コード系における 1 文字のバイト数 QL 埋込みホストプログラム中のホスト変数内で使用できる文字列の文字コード系は EUC コード UTF8 形式またはシフト JI コードです また 各国語文字列の文字コード系は EUC コード COBOL_EUC 形式 UC2 形式 バイトスワップした UC2 形式 UTF8 形式またはシフト JI コードです それぞれの文字コード系における 1 文字のバイト数を以下に示します 表 文字のバイト数 文字コード系文字の種別バイト数 EUC コード UTF8 形式 シフト JI コード 英数字および制御文字 拡張漢字および利用者定義文字 その他の日本語文字 英数字および制御文字 各国語文字 英数字および制御文字 半角カタカナ 各国語文字 1 バイト 3 バイト 2 バイト 1 バイト 2~6 バイト 1 バイト 1 バイト 2 バイト また それぞれのコード系における 各国語文字 1 文字のバイト数を以下に示します 表 文字のバイト数 ( 各国語文字の場合 ) 文字コード系文字の種別バイト数 EUC コード COBOL_EUC 形式 UC2 形式 バイトスワップした UC2 形式 拡張漢字および利用者定義文字 その他の日本語文字 日本語文字 すべての文字 すべての文字 3 バイト 2 バイト 2 バイト 2 バイトまたは 4 バイト ( 注 ) 2 バイトまたは 4 バイト ( 注 ) UTF8 形式日本語文字 2~6 バイト シフト JI コード日本語文字 2 バイト 注 ) UC2 形式およびバイトスワップした UC2 形式では 補助文字 (1~16 面の 4 バイト文字 ) は 2 文字となります コード変換と文字列の拡大 縮小 データベースの文字コード系と QL 埋込みホストプログラム内で使用する文字列の文字コード系が異なる場合 データに対してコード変換が発生します このとき 同じ文字でも文字コード系によってバイト数が異なる場合があるため 文字列が拡大 縮小することがあります 文字コード系による文字列の拡大 縮小の割合を以下に示します 55

63 表 2.24 文字列の拡大 縮小 データベースの文字コード系 EUC コード UNICODE シフト JI コード アプリケーションの文字コード系 入力データ 出力データ 最小値最大値最小値最大値 EUC コード 1 倍 1 倍 1 倍 1 倍 シフト JI コード 1 倍 2 倍 1/2 倍 1 倍 UTF8 形式 1/3 倍 3/2 倍 2/3 倍 3 倍 EUC コード 2/3 倍 3 倍 1/3 倍 3/2 倍 シフト JI コード 1 倍 3 倍 1/3 倍 1 倍 UTF8 形式 1 倍 1 倍 1 倍 1 倍 EUC コード 1/2 倍 1 倍 1 倍 2 倍 シフト JI コード 1 倍 1 倍 1 倍 1 倍 UTF8 形式 1/3 倍 1 倍 1 倍 3 倍 また 文字コード系による各国語文字列の拡大 縮小の割合を以下に示します 表 2.25 各国語文字列の拡大 縮小 データベースの文字コード系 EUC コード UNICODE シフト JI コード アプリケーションの文字コード系 入力データ 出力データ 最小値最大値最小値最大値 EUC コード 2/3 倍 1 倍 1 倍 3/2 倍 シフト JI コード 1 倍 1 倍 1 倍 1 倍 UTF8 形式 1/3 倍 1 倍 1 倍 3 倍 COBOL_EUC 形式 1 倍 1 倍 1 倍 1 倍 バイトスワップした UC2 形式 1 倍 1 倍 1 倍 1 倍 EUC コード 2/3 倍 2 倍 1/2 倍 3/2 倍 シフト JI コード 1 倍 2 倍 1/2 倍 1 倍 UTF8 形式 1/3 倍 2 倍 1/2 倍 3 倍 COBOL_EUC 形式 1 倍 1 倍 1 倍 1 倍 バイトスワップした UC2 形式 1 倍 1 倍 1 倍 1 倍 EUC コード 2/3 倍 1 倍 1 倍 3/2 倍 シフト JI コード 1 倍 1 倍 1 倍 1 倍 UTF8 形式 1/3 倍 1 倍 1 倍 3 倍 COBOL_EUC 形式 1 倍 1 倍 1 倍 1 倍 バイトスワップした UC2 形式 文字コード系ごとの使用できる文字列長 1 倍 1 倍 1 倍 1 倍 コード変換によりデータ長が拡大 縮小した場合に ホスト変数や列長の定量制限の 32,000 バイトを超えてしまう場合があります そこで 上記の拡大 縮小の割合を基に コード変換に関係なく使用できる文字列のデータ長を以下に示します 56

64 表 2.26 使用可能な文字列の最大長 データベースの文字コード系 EUC コード シフト JI コード UNICODE アプリケーションの文字コード系 EUC コード シフト JI コード UTF8 形式 EUC コード シフト JI コード UTF8 形式 EUC コード シフト JI コード UTF8 形式 使用可能なデータ長 32,000 バイト 16,000 バイト 10,666 バイト 16,000 バイト 32,000 バイト 10,666 バイト 10,666 バイト 10,666 バイト 32,000 バイト また コード変換に関係なく使用できる各国語文字列のデータ長を以下に示します 表 2.27 使用可能な各国語文字列の最大長 データベースの文字コード系 EUC コード シフト JI コード UNICODE アプリケーションの文字コード系 EUC コード シフト JI コード UTF8 形式 COBOL_EUC 形式 バイトスワップした UC2 形式 EUC コード シフト JI コード UTF8 形式 COBOL_EUC 形式 バイトスワップした UC2 形式 EUC コード シフト JI コード UTF8 形式 COBOL_EUC 形式 UNICODE( バイトスワップした UC2 形式 ) 使用可能なデータ長 21,333 バイト 32,000 バイト 10,666 バイト 32,000 バイト 32,000 バイト 21,333 バイト 32,000 バイト 10,666 バイト 32,000 バイト 32,000 バイト 16,000 バイト 16,000 バイト 16,000 バイト 32,000 バイト 32,000 バイト 注意 取り出すデータの有効な長さが 32,000 バイトを超える場合は 標識変数に 0 または 32,000 が格納されます この場合は コード変換が発生しない環境で動作させてください 57

65 コード変換指定に従わないもの コード変換は クライアント用の動作環境ファイルの実行パラメタ (CARACTER_TRANLATE) の指定により クライアントまたはサーバのどちらかで行います ただし この変換指定に従わず データベースの文字コード系に従って処理されるものは 以下のとおりです ORDER BY 句による整列順序 QL 述語の大小比較結果 集合関数の最大または最小値 ホスト言語を混在する場合の注意事項 1 つのアプリケーションプロセス内で QL 埋込み C プログラムと QL 埋込み COBOL プログラムが混在する場合 プロセス内で最初に実行される QL 文が QL 埋込み C プログラムの場合は 文字列型ホスト変数の文字コード系と各国語文字列型ホスト変数の文字コード系に注意が必要です QL 埋込みホストプログラムでは アプリケーションプロセス内で最初に QL 文が実行される時にプロセスの文字コード系が決定されます また 各 QL 文が実行されるたびに文字コード系のチェックを行っています プロセス内で最初に QL 文が実行されるのが QL 埋込み C プログラムの場合 アプリケーションで使用可能な文字コード系 の仕様にしたがって文字コード系が決定されます その後 QL 埋込み COBOL プログラムが呼び出された場合 この文字コード系が QL 埋込み COBOL プログラムに設定される文字コード系と異なっていたら QL 埋込み COBOL プログラムで QL 文を実行する際にエラーとなります 文字コード系の指定 QL 埋込み C プログラムから QL 埋込み COBOL プログラムを呼び出している場合は クライアント用の動作環境ファイルに文字コード系を指定し QL 埋込み COBOL プログラムのチェックでエラーが発生しないようにする必要があります 設定する文字コード系は 文字コード系の決定 を参照してください 2.6 リモートアクセスする場合の注意事項 リモートのデータベースにアクセスする場合の注意事項について説明します 概数を使用するときの注意事項 UNIX 系システムとグローバルサーバおよび Windows(R) とグローバルサーバでは概数の内部表現形式が異なるため ymfoware/rdb では形式の変換を行っています このため アプリケーションで指定した値とグローバルサーバのデータベースに格納される値との間 およびグローバルサーバのデータベースに格納されている値とアプリケーションで取り出せる値との間には 表現形式の差に起因する誤差が生ずることがあります また 変換時にオーバフロー ( 変換元の値の絶対値が大きすぎて変換先での形式では表現できない ) またはアンダフロー ( 変換元の値の絶対値が小さすぎて変換先での形式では表現できない ) が発生することがあります オーバフローが発生した場合 QL 文は異常終了します また アンダフローが発生した場合は 値を 0 として処理します RDB2_TCP 接続時の注意事項 リモートのデータベースに対して RDB2_TCP により通信を行った場合 クライアントの電源切断によりデータベース資源が占有されたままとなることがあります この場合 接続先のシステムで rdbterm コマンドを実行し データベース資源の解放を行うことができます また ymfoware/rdb では 電源切断後に再度 RDB2_TCP で通信されたときに クライアントのシステム起動時刻を利用し データベース資源の解放を行います このため クライアントのシステム時刻を業務中に変更すると クライアントから依頼されている業務で利用しているデータベース資源が不当に解放されることがあります クライアントのシステム時刻は 業務中は変更しないでください なお Connection Manager を利用している場合は Connection Manager がクライアントのダウン検出し コネクション自動削除機能によりデータベース資源の解放を行うため データベース資源が不当に解放されることはありません 58

66 クライアントの電源切断によりデータベース資源が解放されない場合は クライアントを再起動します アプリケーションが CONNECT 文を実行すると 解放されていないデータベースの資源が解放されます クライアントが電源切断した場合のデータベース資源の解放手順を以下に示します 1. データベース資源アクセス中 2. クライアント電源切断 クライアントの電源切断によりデータベース資源が解放されない 3. 電源切断後に再度 RDB2_TCP で接続 (1) クライアントの電源切断によりデータベース資源が解放されない場合がある (2) クライアントが電源切断したため 再起動する (3) アプリケーションが CONNECT 文を実行すると 解放されていないデータベースの資源の解放を行う また アプリケーションサーバとデータベースサーバが分離した 3 階層モデルにおいて アプリケーションサーバをフェイルオーバ運用した場合は 運用系の RDB システムの電源切断によりデータベース資源が占有されたままとなる場合があります このとき 運用系の RDB システムから待機系の RDB システムに切り替わって再度 RDB2_TCP 接続によって通信が行われますが 運用系の RDB システムと待機系の RDB システムの IP アドレスが異なるため 待機系の RDB システムにおいてアプリケーションが CONNECT 文を実行しても データベース資源が占有されたままとなります フェイルオーバ運用をしている場合には アプリケーションを実行する際に クライアント用の動作環境ファイルにクラスタサービス名を設定して 運用系の RDB システムと待機系の RDB システムの関連付けを行う必要があります クラスタサービス名の設定についての詳細は クライアント用の動作環境ファイルの作成 を参照してください 59

67 以下に アプリケーションサーバとデータベースサーバが分離した 3 階層モデルにおいて アプリケーションサーバをフェイルオーバ運用した場合のデータベース資源の解放手順を示します 1. データベース資源アクセス中 2. 運用系の RDB システムの電源切断 運用系の RDB システムが電源切断されたため データベース資源が解放されない 60

68 3. 待機系の RDB システムに切り替わって再度 RDB2_TCP 接続をする 運用系のクライアント用の動作環境ファイル CLUTER_ERVICE_NAME = (ERVICE1) 待機系のクライアント用の動作環境ファイル CLUTER_ERVICE_NAME = () (1) 運用系の RDB システムからリモートデータベースに対して RDB2_TCP 接続でデータベースにアクセスしている (2) 運用系の RDB システムの電源切断により待機系の RDB システムに切り替わる このとき データベース資源の占有が解除されていない (3) 待機系の RDB システムから再度 RDB2_TCP 接続で CONNECT 文を実行すると 解放されていないデータベース資源の解放を行う ただし この場合 アプリケーションの実行時に クライアント用の動作環境ファイルにクラスタサービス名 CLUTER_ERVICE_NAME を設定しておく必要がある アプリケーションを UNICODE 環境で起動した時の注意事項 Linux クライアントにおいて QL 埋込みホストプログラムを使用している場合で かつアプリケーション起動時に環境変数 LANG に ja_jp.utf8 が指定されている環境では 以下の製品のデータベースに接続する場合 クライアントでのコード変換を指定する必要があります クライアント用の動作環境ファイルに パラメタ CARACTER_TRANLATE=(CLIENT) を指定してください ymfoware erver Enterprise Extended Edition 以前 ymfoware erver Enterprise Edition 以前 ymfoware erver tandard Edition 以前 ymfoware erver tandard Edition V5.0L10 以前 ymfoware erver Enterprise Edition V6.0L10 以前 ymfoware erver tandard Edition V6.0L10 以前 ymfoware erver for Windows V6.0L10 以前 2.7 マルチスレッド環境におけるデータ操作 ここでは マルチスレッド環境で動作するアプリケーションを開発する方法について説明します 61

69 インターネット ( アプリケーションサーバ ) 環境で動作するアプリケーションは 多くのクライアント端末からの依頼を受け 繰り返し起動や多重動作できることが必要とされます このような条件では 高速な起動や資源の節約が期待できるマルチスレッド環境での動作が適しています マルチスレッド環境で動作するアプリケーションは共有のアドレス スペースで複数のスレッドを使用します スレッドは プロセス内で実行されるサブプロセスです 1 つのスレッドに対して 1 つの業務を割り当てることができ 複数のスレッドを使用して複数の業務を並列に実行できます 最初に ymfoware/rdb をアクセスした時から終了まで すなわち最初の CONNECT 文から最後の DICONNECT 文までをセションと呼びます 1 つのプロセスで 1 つのセションを実行する場合は 最初の QL 文の実行時に ymfoware/rdb が自動的にセション環境を作成しています しかし マルチスレッド環境では 複数のセションを同時に実行するため セションを操作する関数を利用してセションの作成および破棄を行う必要があります アプリケーション中で複数のセションを操作するために セションの識別情報としてセション ID を使用します セション ID は プロセス内で一意な情報です ymfoware/rdb では スレッドとセションを対応付け QL 文の実行環境を複数作成することによって マルチスレッド環境下でアプリケーションを動作できます 62

70 また セションとスレッドの対応を一度切り離すことによって 無駄なスレッドを減らし 資源を有効に利用できます セションとスレッドの使用方法 マルチスレッド環境で動作するアプリケーションにおけるセションとスレッドの使用方法には 以下の 3 種類があります 省資源化およびレスポンスの向上を図るためには スレッド数がセション数より少ない環境でアプリケーションを実行することを推奨します なお 作成するスレッドの数に制限はありません 単一セションに対して複数のスレッドが対応する場合 スレッド数がセション数以上の場合 ( スレッド数 セション数 ) スレッド数がセション数より少ない場合 ( スレッド数 < セション数 ) セションを操作する関数については 2.2 セション を参照してください 単一セションに対して複数のスレッドが対応する場合 1 つのセションに対して複数のスレッドを同時に使用することはできません セマフォを利用して排他制御を行ってください 63

71 (1) セション1を作成します セションIDはses1とします (2) セション1と動作スレッドを対応づけます (3) CONNECT 文を実行します (4) セション1と動作スレッドの対応を切り離します 64

72 (5) セション 1 とスレッド T1 を対応付け QL 文を実行した後 セション 1 とスレッド T1 の対応を切り離します 1 つのセションにおいて 同時に複数のスレッドを実行することはできません セマフォを利用するなど 排他処理を行ってください (6) セション 1 とスレッド T2 を対応付けます スレッド T1 で使用されていたセション ID(ses1) が スレッド T2 に渡されます 同様にしてスレッド n まで動作します (7) セション 1 と動作スレッドを対応づけます (8) DICONNECT 文を実行します (9) セション 1 と動作スレッドの対応を切り離します (10) セション 1 を破棄します スレッド数がセション数以上の場合 ( スレッド数 セション数 ) この場合 各スレッドにセションが作成さているので 排他制御を考慮する必要はありません ただし 複数スレッドが共通で CPU を使用するため 必ずしもレスポンスを向上できるとは限りません (1) セション 1~ セション n を作成します (2) 各セションに対してスレッド T1~Tn を対応付け QL 文を実行した後 対応を切り離します この場合 各スレッドに専用のセションがあるので 排他を考慮する必要はありません (3) セション 1~ セション n を破棄します スレッド数がセション数より少ない場合 ( スレッド数 < セション数 ) 2 つのスレッドを使用して 3 つのセションを実行する例を示します セションとスレッドの対応を一度切り離すことにより セション数よりも少ないスレッド数で動作できます このため 資源の共用による省資源化を実現できます また ディスクの I/O などによる CPU の無駄な待ち状態を解消する操作を行うことによって レスポンスを向上できます 65

73 (1) セション 1~ セション 3 を作成します (2) セション 1 とスレッド T1 およびセション 2 とスレッド T2 をそれぞれ対応付け QL 文を実行した後 対応を切り離します (3) セション 1 とスレッド T1 およびセション 3 とスレッド T2 をそれぞれ対応付け QL 文を実行した後 対応を切り離します (4) セション 1 における作業が終了したので 今までセション 1 で使用していたスレッド T1 をセション 2 で使用します また セション 3 とスレッド T2 を対応付けます QL 文を実行した後 対応を切り離します (5) セション 1~ セション 3 を破棄します 2.8 名前の一意性と有効範囲 ここでは QL 埋込み C プログラムおよび QL 埋込み COBOL プログラムに記述する QL 文中の名前の一意性と有効範囲について説明します 66

74 2.8.1 埋込み C プログラムの場合 ここでは QL 埋込みCプログラムに記述するQL 文中の名前の一意性と有効範囲について説明します 以下の埋込みQL 文をQL 埋込みCプログラムに記述する場合は 注意が必要です 埋込み例外宣言 ホスト変数 カーソル宣言とホスト変数の関係 埋込み例外宣言 埋込み例外宣言で指定した GOTO のホストラベル識別子は 次の同一エラー条件が出現するまで有効となります 埋込み例外宣言の有効範囲が 複数の関数にまたがる場合は 有効となるすべての関数に GOTO のホストラベル識別子を記述する必要があります ホストラベル識別子を関数内に記述していない場合は コンパイル時にエラーとなります 例 埋込み例外宣言の GOTO のホストラベル識別子が main 関数 sub1 関数および sub2 関数で有効となる場合には それぞれの関数内に GOTO のホストラベル識別子を記述します ホスト変数 ホスト変数の名前は QL 埋込み C プログラムで一意である必要があります 名前が一意でない場合は コンパイル時にエラーとなります このため 複数の関数で共通に使うホスト変数 QLTATE および QLMG は グローバル域に記述する必要があります ただし マルチスレッド環境の場合は コンパイル時にオプションを指定することにより 以下の変数については 関数単位に変数の名前を重複して記述できます QLTATE QLMG それぞれの例を以下に示します 例 1 複数の関数で共通に使うホスト変数をグローバル域に記述する例 67

75 EXEC QL BEGIN DECLARE ECTION ; char QLTATE[6] ; (1) char QLMG[256] ; (2) long common1 ; (3) long common2 ; (4) EXEC QL END DECLARE ECTION ; main() { EXEC QL BEGIN DECLARE ECTION ; long private1 ; (5) long private2 ; (6) EXEC QL END DECLARE ECTION ; } long sub1(){ EXEC QL BEGIN DECLARE ECTION ; long private3 ; (7) long private4 ; (8) EXEC QL END DECLARE ECTION ; } (1)~(4) 複数関数で共通なホスト変数の記述 (5)~(6) main 関数でだけ使用するホスト変数の記述 (7)~(8) sub1 関数でだけ使用するホスト変数の記述 例 2 マルチスレッド環境において 複数の関数で共通に使うホスト変数を関数単位に重複して記述する例 QLDB ses_id; int main( void ) { EXEC QL BEGIN DECLARE ECTION; auto char QLTATE[6]; (1) auto char QLMG[256]; (2) EXEC QL END DECLARE ECTION; QLThrAllocID( &ses_id ); QLThrtartID( ses_id ); EXEC QL CONNECT TO 'V1'; sub01(); EXEC QL DICONNECT ALL; QLThrEndID ( ses_id ); QLThrFreeID ( ses_id ); return 0; } void sub01( void ) { EXEC QL BEGIN DECLARE ECTION; auto char QLTATE[6]; (3) auto char QLMG[256]; (4) auto short len1; (5) EXEC QL END DECLARE ECTION; EXEC QL CONNECT TO 'V2'; 68

76 } return 0; (1)~(2) 複数関数で共通なホスト変数の main 関数における記述 (3)~(4) 複数関数で共通なホスト変数の sub01 関数における記述 (5) sub01 関数でだけ使用するホスト変数の記述 カーソル宣言とホスト変数の関係 カーソル宣言で使用したホスト変数が評価されるのは OPEN 文の実行時です このため 複数の関数でホスト変数が指定された同一のカーソルをオープンする場合は カーソル宣言に指定したホスト変数は グローバル域に記述する必要があります マルチスレッド環境で動作させる場合は グローバル域に記述した変数に対して排他を考慮する必要があります 例 カーソル宣言文をグローバル域に記述する例を以下に示します EXEC QL BEGIN DECLARE ECTION ; char QLTATE[6] ; (1) char QLMG[256] ; (2) long common1 ; (3) (5) EXEC QL END DECLARE ECTION ; EXEC QL DECLARE CUR1 CUROR FOR ELECT WERE NUMBER = common1; (4) (6) (5) main() { EXEC QL OPEN CUR1 ; (6) } long sub1(){ EXEC QL OPEN CUR1 ; (6) } (1)~(3) 複数関数で共通なホスト変数の記述 (4) 複数関数で共通なカーソル宣言の記述 (5) main 関数と sub1 関数で共通に使うホスト変数名 (6) main 関数と sub1 関数で共通に使うカーソル名 埋込み COBOL プログラムの場合 ここでは QL 埋込み COBOL プログラムに記述する QL 文中の名前の一意性と有効範囲について説明します 入れ子構造の QL 埋込み COBOL プログラムに 以下の埋込み QL 文を記述する場合は 注意が必要です 埋込み例外宣言 ホスト変数 カーソル宣言とホスト変数の関係 埋込み例外宣言 埋込み例外宣言で指定した GOTO の手続き名は 次の同一エラー条件が出現するまで有効となります 埋込み例外宣言の有効範囲が 複数の入れ子プログラムにまたがる場合は 有効となるすべてのプログラム中に GOTO の手続き名を記述する必要があります 手続き名を記述してない場合は コンパイル時に GOTO 文に指定した手続き名がない旨のエラーとなります 69

77 例 埋込み例外宣言の GOTO 手続き名が 入れ子関係のプログラム AMPLE01 AMPLE02 および AMPLE03 で有効となる場合には それぞれのプログラム内に GOTO の手続き名を記述します 主プログラムの埋込み例外宣言で指定した GOTO の手続き名 ERR1 (2) には 各入れ子プログラムから分岐できません このため 各入れ子プログラム中に 主プログラムの埋込み例外宣言で指定した GOTO の手続き名 ERR1 (1) を記述します ホスト変数 ホスト変数の名前は QL 埋込み COBOL プログラムで一意である必要があります 名前が一意でない場合は コンパイル時でエラーになります このため 複数の入れ子プログラムで共通に使うホスト変数 QLTATE および QLMG は 大域名として一番外側のプログラムに記述する必要があります 例を以下に示します 例 複数の入れ子プログラムで 共通に使うホスト変数をグローバル域に記述する例 70

78 カーソル宣言とホスト変数の関係 カーソル宣言で使用したホスト変数が評価されるのは OPEN 文の実行時です このため 複数の入れ子プログラムで ホスト変数が指定された同一のカーソルをオープンする場合は カーソル宣言に指定したホスト変数は 大域名として一番外側のプログラムに記述する必要があります 例 カーソル宣言文を一番外側のプログラムに記述する例を以下に示します 71

79 (1) プログラム AMPLE01 AMPLE02 で共通に使うカーソル名 (2) プログラム AMPLE01 AMPLE02 で共通に使うホスト変数 2.9 システムコールを使用する場合の注意事項 ここでは UNIX 系システムにおけるデータベースを処理するアプリケーションで fork 関数 exec 関数および signal 関数などのシステムコールを使用する場合の注意事項について説明します 新しいプロセスの生成方法 アプリケーションで 新しいプロセスの生成および実行を行う場合は fork 関数と exec 関数の 2 つの関数を利用します 親プロセスから fork 関数を用いて子プロセスを生成し 子プロセスでのプログラムの実行は exec 関数を使用してください 以下に使い方を示します 72

80 fork 関数または exec 関数のどちらかだけを使用して 新しいプロセスの生成および実行を行う場合は 以下の注意事項があります fork 関数または exec 関数は QL 文の実行前に行う必要があります QL 文を実行した後に fork 関数または exec 関数を使用すると アプリケーションは正しく動作しません マルチスレッド環境において fork 関数または exec 関数は はじめてのセション ( セション ID) を作成する前に行う必要があります シグナル操作 アプリケーションで signal 関数を使用している いないにかかわらず QL 文実行中は以下のシグナルは割込みの対象とはなりません IGUP IGQUIT IGTTP IGTTIN IGTTOU アプリケーションの中の QL 文以外の部分を実行しているときは 割込み対象シグナルはアプリケーション中での signal 関数の指定に従います 73

81 シグナルの抑止 アプリケーションでシグナル IGINT を利用しないようにすることができます シグナルを利用しないようにするには 動作環境ファイルの実行パラメタ IGNAL_INF=NO を設定します 2.10 QL 文のデータ操作文に関する注意事項 表の設計変更により 列を追加したり 列の定義順序を変更したりする場合があります このため データベースの定義変更を考慮したアプリケーションを作成しなければなりません 以下に注意点を示します 以下の条件を満たす QL データ操作文は使用しないでください 選択リストに * や 表名.* 相関名.* を指定したカーソル宣言または単一行 ELECT 文 挿入列リストを省略した INERT 文 上記の QL 文は 表の設計変更により列を追加したり 列の定義順序を変更した場合にエラーになります アプリケーションにこのような影響を与えないためには 選択リストに * を指定するかわりに すべての列をコンマで区切って指定してください また INERT 文には挿入列リストを指定してください なお ymfoware/rdb には 表の設計変更による列の変更によって アプリケーションに影響があるか否かをチェックする機能があります あらかじめ以下の方法でチェックしておくことを推奨します アプリケーションのコンパイル時にチェックする アプリケーションに埋め込まれた QL 文をチェックします アプリケーションのコンパイル リンク時に K オプションを指定します このオプションを指定すると 選択リストに * を指定したカーソル宣言または単一行 ELECT 文や 挿入列リストを省略した INERT 文が存在する場合に アプリケーションのコンパイルがエラーになります アプリケーションの実行時にチェックする アプリケーションで実行する QL 文をチェックします 実行時のチェックはコンパイル時のチェックと異なり アプリケーションで動的 QL 文を実行するときにも QL 文をチェックします 選択リストに * を指定したカーソル宣言または単一行 ELECT 文や 挿入列リストを省略した INERT 文を実行した場合 QL 文の実行がエラーになります QL 文のチェックを有効にするためには クライアント用の動作環境ファイルの実行パラメタに ALTER_CECK = (YE) を指定します 詳細については クライアント用の動作環境ファイルの作成 を参照してください 2.11 コールバック機能の利用方法 ここでは コールバック機能の利用方法について説明します コールバック関数の概要 コールバック関数の登録方法 コールバック機能とは アプリケーションで QL 文を実行するとき あらかじめ QL 文の種別に対して登録した関数を実行する機能です コールバック機能を利用すると QL 文の実行ログを採取したり QL 文の実行を迂回することができます また コールバック関数には QL 文の実行結果が通知されるため デッドロックやコネクション切断などの特定のエラーが発生した QL 文の実行ログを採取することも可能になります コールバック関数の概要 コールバック機能を利用する場合は コールバック関数とよばれる利用者定義関数を作成し QL 文の種別ごとに登録します これにより アプリケーションで QL 文が実行されるたびに 登録されたコールバック関数が実行されます コールバック関数にはセション ID( マルチスレッド環境で動作するアプリケーションの場合 ) QL 文 実行結果および入出力データが通知されるため 利用者は必要に応じてデータを加工してください 74

82 コールバック関数 コールバック関数は 利用者が作成する関数です 関数名は利用者によって任意に指定できますが 復帰値や関数のパラメタは規定されています コールバック関数は QL 文の処理の直前か直後かによって 入口コールバック関数または出口コールバック関数と呼ばれます 入口コールバックまたは出口コールバックは コールバック関数の登録時に指定します 入口コールバック関数は 復帰値によってその後の動作が異なります 入口コールバック関数が QLRDB_CONTINUE を返した場合は QL 文の処理を実行します しかし QLRDB_NOCONTINUE を返した場合は QL 文の処理は実行されず 出口コールバック関数が実行されます 入口コールバック関数でエラーが発生した場合など QL 文の処理を実行したくない場合は QLRDB_NOCONTINUE を返してください 出口コールバック関数には QL 文の実行結果として QLTATE および QLMG が通知されます エラーが発生した QL 文の実行ログを採取する場合は QLTATE および QLMG の情報を使用してください ただし アプリケーションでホスト変数 QLMG が定義されていない場合は QLMG は通知されません また 入口コールバック関数には QLTATE および QLMG は通知されません アプリケーションとデータを共有するため コールバック関数に対し利用者定義領域のアドレスを設定することができます コールバック関数の結果をアプリケーションに通知するには 利用者定義領域を使用してください 利用者定義領域のアドレスは コールバック関数の登録時に指定します 75

83 コールバック関数の登録方法 アプリケーションにコールバック関数を登録する方法には以下があります アプリケーションのソースに記述する方法 動的ライブラリを使用して登録する方法 QL 文を実行する場面に合わせて 個別の処理が必要なコールバック関数の場合は アプリケーションのプログラムソースに記述する方法で登録します コールバック関数を登録するには アプリケーションの修正およびコンパイルが必要になります アプリケーションの全体を通して 汎用的な処理を行うコールバック関数の場合は 動的ライブラリを使用する方法で登録します アプリケーションの修正は必要ありません アプリケーションのソースに記述する方法 コールバック関数を静的に登録するには アプリケーション中に QLetCallback 関数を記述します 登録は各 QL 文の種別ごとに行うため 登録する QL 文種別の数だけ QLetCallback 関数を実行します また 複数の QL 文種別に対し同一のコールバック関数を登録する場合は 登録する QL 文種別のリストを QLetCallback 関数に指定することで 一括して登録することができます QLetCallback 関数はアプリケーション中のどこでも記述することができますが コールバック関数を実行したい QL 文より前に記述する必要があります 一度登録した QL 文種別に対し再度コールバック関数を登録すると コールバック関数を変更することができます また 登録したコールバック関数を解除したい場合は QLetCallback 関数の関数アドレスを指定するパラメタに NULL を指定してください コールバック関数の変更および解除は アプリケーション中のどの位置でも可能です マルチスレッド環境で動作するアプリケーションの場合 コールバック関数はセションごとに QL 文種別に登録されます そのため QLetCallback 関数のパラメタにはコールバック関数を登録するセション ID を指定してください また QLetCallback 関数を実行できるのは QLThrAllocID 関数によるセション作成後になります コールバック関数を登録する QL 文の種別は リストの形式で指定します リストは short 型の配列変数の各要素に 登録したい QL 文の種別を設定して作成します また 0 が設定されている要素までをリストとみなすため リストの最後には必ず 0 を設定してください これは 1 種類の QL 文に対し登録する場合でも同様に設定する必要があります 一度に設定できる QL 文の種別に制限はありません また 重複して指定された場合もエラーにはなりません 一度に複数の QL 文種別に対し登録した場合でも 再登録や解除は 個々または別の組合せで行うことが可能です 例 /* INERT 文 UPDATE 文にコールバック関数を登録する場合 */ QLRETURN CallbackQL1( ); QLRETURN CallbackQL2( ); QLRETURN CallbackQL3( ); short list[3]; /* 一括して登録する場合 */ list[0] = QLRDB_CF_INERT; list[1] = QLRDB_CF_UPDATE; list[2] = 0; QLetCallback( 0, CallbackQL1, NULL, list, RDB_CALL_IN ); /* 個別に登録する場合 */ list[0] = QLRDB_CF_INERT; list[1] = 0; QLetCallback( 0, CallbackQL2, NULL, list, RDB_CALL_IN ); list[0] = QLRDB_CF_UPDATE; list[1] = 0; 76

84 QLetCallback( 0, CallbackQL3, NULL, list, RDB_CALL_IN ); 各 QL 文の種別に対し現在コールバック関数が登録されているかどうかは QLGetCallback 関数を使用することで取得できます QLGetCallback 関数は コールバック関数が登録されている場合は QLRDB_ENTRY を返し 登録されていない場合は QLRDB_NOENTRY を返します 動的ライブラリを使用して登録する方法 コールバック関数を動的に登録するためには QLDynetCallback 関数を含む登録用の動的ライブラリを作成します 動的ライブラリには 以下の ymfoware/rdb のライブラリをリンクしてください 32 ビットで実行するアプリケーション libsqldrv.so をリンクします また マルチスレッド環境で動作するアプリケーションの場合は libsqldrvm.so をリンクしてください 64 ビットで実行するアプリケーション libsql64drv.so をリンクします また マルチスレッド環境で動作するアプリケーションの場合は libsql64drvm.so をリンクしてください 32 ビットで実行するアプリケーション f3cwdrv.lib をリンクします また マルチスレッド環境で動作するアプリケーションの場合は f3cwdrvm.lib をリンクしてください Windows erver(r) 2003 for Itanium または Windows erver(r) 2008 for Itanium において 64 ビットで実行するアプリケーション f3cwdrv_ia64.lib をリンクします また マルチスレッド環境で動作するアプリケーションの場合は f3cwdrvm_ia64.lib をリンクしてください Windows(R) XP for x64 Windows erver(r) 2003 x64 Editions または Windows erver(r) 2008 for x64 において 64 ビットで実行するアプリケーション f3cwdrv_x64.lib をリンクします また マルチスレッド環境で動作するアプリケーションの場合は f3cwdrvm_x64.lib をリンクしてください QLDynetCallback 関数は利用者が作成する関数ですが 関数名 復帰値およびパラメタは規定されています 利用者はこの関数内で QLetCallback 関数を使用してコールバック関数を登録します QLDynetCallback 関数が正常終了する場合は 復帰値として QLRDB_NORMAL を返してください しかし エラーなどで関数が異常終了する場合は QLRDB_NORMAL 以外を返却してください QLDynetCallback 関数がエラーを返すとコールバック関数を利用するアプリケーションに以下のエラーが返ります マルチスレッド環境で動作するアプリケーションの場合は QLThrAllocID 関数でエラー復帰します シングルスレッド環境で動作するアプリケーションの場合は QLDynetCallback 関数が実行された QL 文の実行結果として QLTATE に を設定しエラー復帰します またアプリケーションにホスト変数 QLMG が定義されている場合は 返却された値を埋め込んだ以下のエラーメッセージを出力します QLMG JYP1085E コールバック関数の登録処理でエラーが発生しました. 詳細種別 動的ライブラリは 環境変数 RDBETCALLBACK またはクライアント用の動作環境ファイルの ET_CALLBACK パラメタに指定します 環境変数 RDBETCALLBACK は アプリケーションを実行する前に指定してください 環境変数に指定する場合 C シェルで設定する場合 setenv RDBETCALLBACK ライブラリ名 77

85 bash B シェル K シェルで設定する場合 RDBETCALLBACK= ライブラリ名 ;export RDBETCALLBACK set RDBETCALLBACK= ライブラリ名 動作環境ファイルに指定する場合 ET_CALLBACK = ( ライブラリ名 ) 環境変数または動作環境ファイルに設定するライブラリ名が絶対パスでの指定でない場合は 以下のディレクトリにライブラリを格納する必要があります 環境変数 LD_LIBRARY_PAT に指定したディレクトリ PAT に指定したディレクトリ 環境変数 RDBETCALLBACK と動作環境ファイルのパラメタ ET_CALLBACK の両方が指定された場合 環境変数 RDBETCALLBACK に指定された値が有効になります アプリケーションが実行されると プロセス内で最初に実行される QL 文の処理において 環境変数およびクライアント用の動作環境ファイルがチェックされ 動的ライブラリ内の QLDynetCallback 関数が実行されます なお プロセス内の最初の QL 文に対しコールバック関数が指定されている場合もコールバック関数は実行されます なお マルチスレッド環境で動作するアプリケーションの場合 QLDynetCallback 関数は QLThrAllocID 関数の処理で実行されます 78

86 79

87 第 3 章 アプリケーションの作成 アプリケーションを開発することにより データベースのデータを検索したり 更新することができます アプリケーションは 利用するホスト言語プログラムの中にデータ操作を行うための QL 文を埋め込んで作成します このような QL 文を埋め込んだプログラムを QL 埋込みホストプログラムと呼びます また このとき使用する言語を ホスト言語と呼びます 本章では アプリケーションの作成方法について説明しています 参照 基本的なデータ操作を行うための QL の使用方法については QL ビギナーズガイド を参照してください 3.1 QL 埋込み C プログラムの作成方法 アプリケーションのコーディングは データベースを処理する部分を QL 文で そのほかの部分を利用する言語で記述します 利用可能な言語には C 言語および COBOL 言語があります QL 文を含む C 言語で作成されたアプリケーションを QL 埋込み C プログラムと呼びます 本節では QL 埋込み C プログラムの作成方法について説明します アプリケーションのコーディング規則 C プログラムの中に QL 文を組み込んだアプリケーションを QL 埋込み C プログラムと呼びます QL 文は 以下に示すように EXEC QL および ; ではさんで指定します 図 3.1 QL 文のコーディング形式 (QL 埋込み C プログラム ) QL 文の指定例を以下に示します 例 1 埋込みQL 宣言節の例 EXEC QL BEGIN DECLARE ECTION ; 例 2 FETC 文の例 EXEC QL FETC CU1 INTO GNO, GOOD, QO ; また QL 文の記述の途中で改行すると 改行した位置と次の行の先頭の位置の間に 1 文字の空白があるのと同じになります なお 文字列定数および各国語文字列定数の途中で改行することはできません QL 文の指定位置および指定順序 アプリケーション中に埋め込んで使用する QL 文には 実行文と非実行文があります 実行文は データベースをアクセスしたり トランザクションの制御を行うために使用します 非実行文は 実行文で利用するカーソルの宣言やホスト変数の宣言 例外条件発生時の動作を定義します 非実行文は アプリケーションの実行対象にはなりません したがって アプリケーション中の GOTO 文などによる制御の影響を受けません なお QL 文は サーバの O 環境で使用できる範囲が異なります QL 文の利用範囲については 付録 J QL 文の使用範囲 を参照してください QL 文の一覧を以下に示します 80

88 表 3.1 QL 文分類 QL 文 備考 単一行 ELECT 文 非カーソル系データ操作 UPDATE 文 探索 INERT 文 DELETE 文 探索 実行文 カーソル宣言 (DECLARE CUROR) 非実行文 OPEN 文 カーソル系データ操作 CLOE 文 FETC 文 UPDATE 文 位置づけ DELETE 文 位置づけ 実行文 ALLOCATE DECRIPTOR 文 動的 QL 文 DEALLOCATE DECRIPTOR 文 DECRIPTOR 取得文 DECRIPTOR 設定文 PREPARE 文 DEALLOCATE PREPARE 文 DECRIBE 文 EXECUTE 文 EXECUTE IMMEDIATE 文動的カーソル宣言 実行文非実行文 動的 OPEN 文 動的 FETC 文動的 CLOE 文動的 DELETE 文 位置づけ動的 UPDATE 文 位置づけ 実行文 ストアドプロシジャ CALL 文 実行文 COMMIT 文 トランザクション制御文 ROLLBACK 文 ET TRANACTION 文 実行文 CONNECT 文 コネクション管理文 ET CONNECTION 文 DICONNECT 文 実行文 ET CATALOG 文 セション管理文 ET CEMA 文 ET EION AUTORIZATION 文 実行文 表宣言 表宣言 非実行文 埋込み例外宣言 WENEVER 文 非実行文 BEGIN DECLARE ECTION 埋込みQL 宣言節 END DECLARE ECTION 非実行文 81

89 分類 QL 文 備考 資源操作文 RELEAE TABLE 文 実行文 利用者制御文 ET UER PAWORD 文 実行文 アクセス制御文 ET ROLE 文 実行文 QL 埋込み C プログラムでの QL 文の指定位置について説明します 埋込み QL 宣言節の指定位置 埋込み QL 宣言節は ホスト変数を定義するためのものです 埋込み QL 宣言節は C 言語仕様上で変数宣言が記述可能な位置に記述します なお ホスト変数を参照するカーソル宣言や実行文の記述位置より ソースファイル上で先行して定義します また ホスト変数の変数名は C プログラムソース上で 一意にかつ QL 以外で始まる名前にする必要があります ホスト変数の宣言 ホスト変数は アプリケーションとデータベースの間でデータの受渡しをするのに使用する変数です すなわち アプリケーションで参照するデータをデータベースから取り出すため または逆に アプリケーションで設定したデータをデータベースに格納するために QL 文に指定する変数です ホスト変数の宣言は 埋込み QL 宣言節で行います 宣言の記述方法そのものは C 言語での変数の宣言と同じです 以下に ホスト変数の宣言の例を示します 図 3.2 ホスト変数宣言の例 (QL 埋込み C プログラム ) 状態変数の宣言 状態変数は 処理結果の状態をアプリケーションに伝えるための変数です 状態変数には状態コードが設定されます 状態コードは 処理が正常に完了した または処理中になんらかの例外条件が発生したという状態を表します 状態変数の変数名は QLTATE です QLTATE は長さ 5 桁の文字列型 (char QLTATE[6]) の変数であり 埋込み QL 宣言節で宣言します 埋込み QL を使用するアプリケーション中では 状態変数を必ず宣言します メッセージ変数の宣言 メッセージ変数は 処理結果をメッセージとしてアプリケーションに伝えるための変数です メッセージ変数の変数名は QLMG です QLMG は文字列型の変数であり 埋込み QL 宣言節で宣言します メッセージ変数の宣言のしかたを以下に示します char QLMG[n] n メッセージ変数の長さ ( バイト数 ) であり 2 以上 以下の値を指定します メッセージ変数にメッセージが設定されるときの規則を以下に示します 設定されるメッセージは 1 つだけです 82

90 メッセージの長さがメッセージ変数の長さ (n) を超える場合 メッセージの先頭から n 文字分設定されます カーソル宣言の指定位置 カーソル宣言は C プログラムソース上のどの位置にも記述できます ただし 宣言したカーソル名を参照するカーソル系の QL 文より ソースファイル上で先行して記述します なお カーソル名は C プログラムソース上で一意にすることが必要です 埋込み例外宣言の指定位置 埋込み例外宣言は C プログラムの関数内であればどの位置にも記述できます 埋込み例外宣言の意味と有効範囲については QL 文の処理結果の確認 で説明します 実行文の指定位置 データ操作文やトランザクション制御文などの実行文は C 言語の実行文が記述可能な位置ならどの位置にも記述できます INCLUDE 文の指定位置 アプリケーション中に INCLUDE 文を指定することができます インクルードファイルには QL 文および C 言語の言語テキストを記述できます インクルードファイルに ホスト変数および状態変数の宣言を格納しておくことにより 複数のアプリケーションで共通に使用する変数をまとめて宣言することができます 表宣言 表宣言は スキーマ名の修飾をしない表名を定義する宣言文です 表宣言で定義した表名を それ以降の QL 文で記述する場合 スキーマ名を省略することができます INCLUDE 文と表宣言の例を以下に示します [ インクルードファイル OTVAR ] char QLTATE[6]; long TOCK; [QL 埋込み C プログラム ] EXEC QL BEGIN DECLARE ECTION; EXEC QL INCLUDE OTVAR; EXEC QL END DECLARE ECTION; main(){ EXEC QL DECLARE 在庫表 TABLE ON C1; EXEC QL ELECT 在庫数量 INTO TOCK FROM 在庫表 WERE 製品番号 = 240; スキーマ名修飾省略 printf("%d n",tock); } ホスト変数および標識変数の指定方法 ホスト変数は アプリケーションとデータベースの間でデータの受渡しをするのに使用する変数です QL 文中でホスト変数と対にして指定し データの内容が NULL 値かどうかを表すために使用する変数を 標識変数と呼びます アプリケーションで参照するデータをデータベースから取り出す場合 標識変数には 取り出したデータが NULL 値かどうかを表す情報が設定されます 逆に アプリケーションで設定したデータをデータベースに格納する場合には 標識変数には 格納するデータが NULL 値かどうかを表す情報を設定しておきます 標識変数は 埋込み QL 宣言節で宣言します 宣言の記述方法はホスト変数と同じです なお 標識変数のデータ型は QL の MALLINT に対応するデータ型であることが必要です 参照 各ホスト言語でのデータ型と QL のデータ型との対応については QL リファレンス を参照してください 83

91 ホスト変数および標識変数を QL 文中に指定する場合には 変数の前にコロン を付けて指定します 以下にその指定例を示します ( ゴシック部がホスト変数または標識変数です ) ただし QL 文以外の C 言語のステートメント中では 一般の C 言語の変数と同じで コロン は付けません 標識変数には QL 文の処理結果が以下のように格納されます 取り出すデータが NULL 値の場合 標識変数には 1 が格納されます 取り出すデータのデータ型が文字列または各国語文字列で かつ NULL 値ではなく 取り出すデータの長さが相手指定の文字列または各国語文字列の長さよりも長い場合は 取り出すデータの有効な長さが標識変数に格納されます 取り出すデータの有効な長さが 32,000 バイトを超える場合は 標識変数に 0 または 32,000 が格納されます 上記以外の場合は 標識変数に 0 が格納されます なお 標識変数を指定していない場合 取り出すデータが NULL 値になると QL 文の処理はエラーになります 例 1 ホスト変数の指定例 TOCK および OUE をホスト変数 QFLAG を TOCK の標識変数 そして WFLAG を OUE の標識変数として指定します QL 文中にホスト変数および標識変数を指定する場合は コロン を付けます EXEC QL ELECT 在庫数量, 倉庫番号 INTO TOCK INDICATOR QFLAG, OUE INDICATOR WFLAG FROM 在庫表 WERE 製品番号 = 110; 例 2 QL 文以外の C 言語のステートメント上のホスト変数の指定例 TOCK をホスト変数 QFLAG を TOCK の標識変数として使用しています C 言語のステートメントでは これらの変数にコロン は付けません EXEC QL FETC CU1 INTO TOCK INDICATOR QFLAG; if( QFLAG == 1) goto p_null ; if( TOCK == 0) goto p_loop ; ホスト変数を使用する場合の注意事項 文字列型または各国語文字列型の場合 NULL 文字 ( 0) はデータ受渡しの対象にはなりません そのため アプリケーションで文字列の終わりを認識するような処理を行う場合 NULL 文字を設定しなければなりません 以下に例を示します QLTATE[5]=' 0'; printf( "QLTATE%s n", QLTATE ); ホスト変数へ入出力するデータの文字コード系の考慮 ホスト変数へ入出力するデータの文字コード系が ymfoware/rdb の文字コード系と異なる場合は そのホスト変数に格納するデータの文字コード系を クライアント用の動作環境ファイルまたは環境変数に設定します 以下に ホスト変数へ入出力するデータの文字コード系が ymfoware/rdb の文字コード系と異なる場合の例 および ホスト変数へ入出力するデータの文字コード系と ymfoware/rdb の文字コード系が同じ場合の例を示します 例 1 ホスト変数へ入出力するデータの文字コードと ymfoware/rdb の文字コード系が異なる場合 以下の例では ymfoware/rdb の文字コード系がシフト JI コード また ELECT 文 (1) でホスト変数に格納されたデータの文字コード系が UNICODE であるとします そして このデータを格納するデータベースの文字コード系は UNICODE であるとします 84

92 この場合 クライアント用の動作環境ファイルまたは環境変数には ホスト変数に格納されているデータが UNICODE であることを示すパラメタを設定します 設定するパラメタについての詳細は クライアント用の動作環境ファイルの作成 を参照してください こうすることによって サーバでのコード変換の必要がなくなります EXEC QL BEGIN DECLARE ECTION; char QLTATE[6]; char QLMG[256]; char CARACTER ET NCAR 1[10]; EXEC QL END DECLARE ECTION; memset(1,' 0',sizeof(1)); EXEC QL ELECT COL1 INTO 1 FROM 1.T0 WERE COL0=3; (1) EXEC QL INERT INTO 1.T1 VALUE(3,1); (2) (1) データベースより UNICODE などの ymfoware/rdb の文字コード系と異なるコードのデータが取得できます (2) 上記の ELECT 文で取得したデータのコードのまま INERT 文が実行できます このように アプリケーションにおいて ymfoware/rdb の文字コード系と異なるコード系のデータが操作可能です 例 2 ホスト変数へ入出力するデータの文字コードが ymfoware/rdb の文字コード系と同じ場合 以下の例では ymfoware/rdb の文字コード系がシフト JI コードであるとします この場合 ホスト変数に入出力するデータの文字コード系はシフト JI コードになります EXEC QL BEGIN DECLARE ECTION; char QLTATE[6]; char QLMG[256]; char CARACTER ET NCAR 1[10]; EXEC QL END DECLARE ECTION; memset(1,' 0',sizeof(1)); memcpy(1," 日本語 ",6); (1) EXEC QL INERT INTO 1.T1 VALUE(1); (2) (1) ymfoware/rdb の文字コード系の 日本語 がホスト変数 1 に格納されます (2) ymfoware/rdb の文字コード系の 日本語 で INERT 文を実行します このように ymfoware/rdb の文字コード系を使用してデータ操作を行う場合に適しています マルチスレッド環境でのホスト変数の宣言 マルチスレッド環境で実行するアプリケーションでは ホスト変数には auto 変数を使用することを推奨します extern 変数および static 変数などを使用した場合は スレッド間でホスト変数が共有されるため 複数のスレッドから同時にデータベースをアクセスすると 参照および更新が正しくできない場合があります extern 変数および static 変数などを使用する場合は セマフォを利用するなどして 並列に動作するスレッド間の排他制御を考慮したアプリケーションを作成してください 参照 セマフォの詳細については O のシステム関数について説明されているマニュアルを参照してください long long 型および 8 バイトで実装される long 型のホスト変数の利用について long 型は コンパイラにより 4 バイトになる場合と 8 バイトになる場合があります 8 バイトで実装される long 型および long long 型のホスト変数を利用した場合 ホスト変数には最大 20 桁のデータを代入できます 85

93 一方 データベースで扱えるデータの最大桁数は 18 桁です このため 19 桁以上の値を代入したホスト変数を QL 文中の検索条件などで利用した場合 データベースアクセス時にエラーとなります 検索条件などに 19 桁以上の値を指定することで データベースアクセス時のエラーが発生することを防ぎたい場合は アプリケーション中で事前にホスト変数の値が 18 桁以下であるかをチェックしてください 条件値以下のすべての値を取り出すための条件値が 18 桁を超えている場合に アプリケーションにて条件値を 18 桁の最大数に変更するプログラム例を以下に示します 例 下記の表にアクセスし 列 VALUE1 の値が検索条件の値以下の行の列 CODE1 をすべて取り出す例を示します スキーマ C1 表 TBL1 列 CODE1MALLINT UNIQUE NOT NULL VALUE1DECIMAL(18,0) 18 桁以下の場合に 真を返却するマクロ (sample1.h) #define CheckGetPrecision18(data) ((long long)(data) <= LL ) 検索条件の組立て (C 言語 ) short gyoumu1() { long long condition; short code[65536]; int count; } condition = LL; /* 実際は 画面入力などを元にデータを組み立てます */ count = dba_kingaku_ettei( code, condition ); return 0; データベースアクセスアプリケーション (QL 埋込み C プログラム ) #include "sample1.h" short dba_kingaku_ettei( short *para1, long long para2 ) { EXEC QL BEGIN DECLARE ECTION; char QLTATE[6]; char QLMG[256]; short code1; long long condition; EXEC QL END DECLARE ECTION; int count; EXEC QL WENEVER QLERROR GOTO ERROR; EXEC QL WENEVER NOT FOUND GOTO NOTFOUND; condition = para2; /* データベースの対応カラムの精度と比較 */ if (!CheckGetPrecision18( condition ) ) { condition = LL; /* 条件値を 18 桁の最大値に変更 */ } /* カーソル宣言 */ EXEC QL DECLARE CUR1 CUROR FOR ELECT CODE1 FROM C1.TBL1 WERE VALUE1 <= condition; EXEC QL OPEN CUR1; for ( count = 0 ;; count++ ) { 86

94 } EXEC QL FETC CUR1 INTO code1; para1[count] = code1; NOTFOUND EXEC QL CLOE CUR1; return(count); ERROR EXEC QL CLOE CUR1; return(1); } QL 文の処理結果の確認 アプリケーションは QL 文を実行したあと 実行結果を確認して処理を進めて行くことが必要です この QL 文の実行結果を確認する方法には 以下の 2 通りがあります a. 状態変数およびメッセージ変数を使用する場合 b. 埋込み例外宣言 (WENEVER 文 ) を使用する場合 状態変数およびメッセージ変数を使用する場合 QL 文の実行結果は 各 QL 文の実行ごとに 状態変数 QLTATE およびメッセージ変数 QLMG に通知されます アプリケーションでは その値を判定しながら処理を進めます QLTATE および QLMG は あらかじめ埋込み QL 宣言節で宣言しておく必要があります 宣言の詳細は 状態変数の宣言 および メッセージ変数の宣言 を参照してください QLTATE に通知される値とその意味は 付録 C QLTATE 値 を参照してください また QLMG に通知される内容は メッセージ集 を参照してください QLTATE および QLMG を使用した QL 文の実行結果の確認方法は A.12 状態変数およびメッセージ変数の使用例 を参照してください 埋込み例外宣言 (WENEVER 文 ) を使用する場合 埋込み例外宣言は QL 文が例外条件を生じた場合に実行する処理を指定する QL 文です これにより QL 文の実行ごとに 実行結果をチェックする必要がなくなります 埋込み例外宣言の指定例を以下に示します 例 1 データなし以外のエラーが発生した場合には ERR001 へ進むことを指定します EXEC QL WENEVER QLERROR GOTO ERR001; (1) (2) (1) 条件 (2) 例外動作 例 2 検索の結果データが見つからない場合に 処理をそのまま続行することを指定します EXEC QL WENEVER NOT FOUND CONTINUE; (1) (2) (1) 条件 (2) 例外動作条件は 以下の2 通りの指定ができます 87

95 NOT FOUND 検索データが見つからない場合に指定の例外動作を行います QLERROR 検索データが見つからない 以外の例外 ( エラー ) が発生した場合に指定の例外動作を行います 例外動作は 以下の 2 通りの指定ができます CONTINUE 次のステートメントに進みます GOTO < 行き先 > 行き先で指定のステートメントに進みます ここで < 行き先 > は 制御を移す先の文に付けられた名札 ( ラベル ) の前にコロン を付けて指定します 例 3 QL 埋込み C プログラムで QL 文にエラーが発生した場合には P_ERROR へ進み 変数 rcode に 8 を設定することを指定します EXEC QL WENEVER QLERROR GOTO P_ERROR ; P_ERROR rcode = 8 ; WENEVER 文は複数個宣言することができます 条件の同じ WENEVER 文を指定した場合 アプリケーション中での記述順序があとの宣言が有効になります 実行の順序とは関係ありません WENEVER 文の有効範囲の例を以下に示します 88

96 図 3.3 WENEVER 文を使用したアプリケーションの例 (1) 状態変数 QLTATE およびメッセージ変数 QLMG を宣言します (2) QL 文の実行で NOT FOUND 以外のエラーが生じた場合に P_ERROR へ進み エラー情報を出力しプログラムは終了します (3) カーソル CU1 の操作で NOT FOUND( 検索データが見つからない ) が生じた場合に P_NEXT へ進みカーソル CU1 のクローズと在庫数量の出力を行います (4) カーソル CU2 の操作で NOT FOUND( 検索データが見つからない ) が生じた場合に P_END へ進みカーソル CU2 のクローズと発注数量の出力を行い プログラムは終了します 日本語文字使用時の注意事項 ここでは アプリケーション中に日本語文字を使用する方法について説明します 89

97 ホスト変数の長さ シフト JI コードの場合 シフト JI コードの日本語文字を使用する場合 各国語文字列型のデータをデータベースから取得 またはデータベースに格納する場合 日本語文字は 2 バイトとなります このため ホスト変数の長さは 以下のように算出してください ホスト変数の長さ = 日本語文字数 * 2 バイト + 1 EUC コードの場合 EUC コードの日本語文字を使用する場合は 日本語文字に 3 バイトの拡張漢字または利用者定義文字を含む可能性があります このため ホスト変数の長さは 格納に十分な大きさを考慮して以下のように算出してください ホスト変数の長さ = 日本語文字数 * 3 バイト + 1 UTF8 形式の場合 UTF8 形式の日本語文字を使用する場合は 日本語文字コードは 2~6 バイトとなります ホスト変数の長さ = 日本語文字数 * 6 バイト + 1 QL 記述子域のオクテット長 動的 QL を使用して 各国語文字列型のデータをデータベースから取得する場合 QL 記述子域のオクテット長 ( バイト数 ) は 以下のようになります シフト JI コードの場合 シフト JI コードの日本語文字を使用する場合は 1 文字を 2 バイトに換算した値となります EUC コードの場合 EUC コードの日本語文字を使用する場合は 取得するデータが 2 バイト表現の日本語文字か 3 バイト表現の日本語文字かにかかわらず QL 記述子域のオクテット長 ( バイト数 ) は 1 文字を 3 バイトに換算した値となります UTF8 形式の場合 UTF8 形式の日本語文字を使用する場合は 1 文字を 6 バイトに換算した値となります 切捨ておよび補正 データベース中の日本語文字の長さは 2 バイトです これに対して EUC コードおよび UTF8 形式の日本語文字を使用する場合 ホスト変数の長さは EUC コードは 3 バイトであり UTF8 形式は 6 バイトです このため ホスト変数の使用に際して 以下の留意事項があります ホスト変数に設定する値の補正 ホスト変数に EUC コードまたは UTF8 形式の日本語文字を設定してデータベースにデータを格納する場合 ホスト変数に設定する日本語文字列の長さがホスト変数の長さよりも短い場合は 有効文字列以外の領域には 英数字の空白を設定してください なお 日本語の空白は 有効な文字列とみなします ホスト変数に設定される値の切捨ておよび補正 データベースから取り出した EUC コードまたは UTF8 形式の日本語文字をホスト変数に格納する場合 自動的に切捨ておよび補正が行われます 切捨て 補正 ホスト変数に格納される日本語文字の長さがホスト変数の長さよりも長い場合は 格納可能な文字数のみ格納し 残りは切り捨てられます ホスト変数に格納される日本語文字の長さがホスト変数の長さよりも短い場合は 有効な文字列以外の領域には英数字の空白が設定されます 90

98 3.1.6 可変長文字列のデータ操作 ホスト変数の可変長文字列を C プログラムで操作する場合は 文字列の長さが必要です このため コンパイル時には 可変長文字列を文字列の長さと文字列を持つ構造体形式に変換します C プログラムは 変換された構造体の変数でデータ操作を行います 詳細は A.1 可変長文字列のデータ操作例 を参照してください 日本語可変長文字列のデータ操作 ホスト変数の日本語可変長文字列を C プログラムで操作する場合は 文字列の長さが必要です このため コンパイル時には 日本語可変長文字列の長さと日本語文字列を持つ構造体に変換します C プログラムは 変換された構造体の変数でデータ操作を行います 詳細は A.2 日本語可変長文字列のデータ操作例 を参照してください ポインタ変数として宣言したホスト変数の使用方法 ここでは ポインタ変数として宣言したホスト変数の使用方法について 以下を説明します ポインタ変数のデータ領域の設定とサイズ ポインタ変数の使用方法 ポインタ変数のデータ領域の設定とサイズ ポインタ変数は 領域のアドレスを保持する変数です ポインタ変数を利用すると 動的に領域を獲得することができます また 関数のパラメタで領域のアドレスを渡すことができるため アプリケーション間で領域を共有できます ホスト変数をポインタ変数として宣言した場合 ホスト変数はデータではなくデータ領域の先頭アドレスを保持します したがって アプリケーション中で 最初にホスト変数を使用する前に 参照するデータ領域のアドレスを設定してください ポインタ変数が参照するデータ領域のサイズは コンパイル時または実行時に 以下のように認識されます 数値型の場合 数値型の場合 ポインタ変数が参照する領域のサイズは参照する先の数値型のサイズになります 参照 数値型については QL リファレンス を参照してください 文字列型の場合 文字列型のポインタ変数が参照する領域のサイズは 先頭アドレスから NULL 文字までの長さとなります 文字列型のポインタ変数を値指定に使用する場合 参照先のデータ領域に設定した文字列の最後に NULL 文字を設定する必要があります 例 EXEC QL BEGIN DECLARE ECTION; char *country; (1) EXEC QL END DECLARE ECTION; country = malloc(11); (2) strcpy( country, "Japanese" ); (3) EXEC QL INERT INTO C.TBL( COUNTRY ) (4) VALUE( country ); (1) 文字列型のポインタ変数 country を宣言します (2) country に 11 バイトの領域のアドレスを設定します 91

99 (3) country の参照する領域に文字列を設定します strcpy 関数を使用して 文字列の最後に NULL 文字を設定します (4) INERT 文の値指定に country を指定します 文字列型のポインタ変数を相手指定に使用する場合 参照先のデータ領域の最後に NULL 文字を設定します ymfoware/rdb は先頭アドレスから NULL 文字までを領域のサイズとします 例 EXEC QL BEGIN DECLARE ECTION; char *country; (1) EXEC QL END DECLARE ECTION; country = malloc(11); (2) memset( country, ' ', 10 ); (3) *(country+10) = ' 0'; (4) EXEC QL ELECT COUNTRY INTO country (5) FROM C.TBL WERE DATANO = 1; (1) 文字列型のポインタ変数 country を宣言します (2) country に 11 バイトの領域のアドレスを取得します (3) 領域の値は不定なので 空白文字を設定します (4) 11 バイト目に NULL 文字を設定します (5) 単一行 ELECT 文の相手指定に country を指定します 可変長文字列型の場合 可変長文字列型の場合はコンパイル時に構造体に変換されるため データ領域はデータ長に 2 バイト足したサイズが必要になります 可変長文字列型のサイズは 変換された構造体のメンバ sqllen に設定してください アプリケーション中に以下のように宣言します VARCAR *country; コンパイル時に構造体に変換します struct country_qlvar { short sqllen; char sqlvar[1]; } *country; 可変長文字列型のポインタ変数を相手指定に使用する場合 QL 文を実行するとデータ領域長を設定するメンバ sqllen に取得したデータの長さが設定されます したがって 再度 QL 文を実行する場合は 実行前に領域長を設定し直す必要があります 例 EXEC QL BEGIN DECLARE ECTION; VARCAR *country; short loop; EXEC QL END DECLARE ECTION; char buff[12]; country = (struct country_qlvar *)malloc(13); (1) country>sqllen = 10; (2) for ( loop=0; loop<max_country; loop++ ) { (3) EXEC QL ELECT COUNTRY INTO country (4) FROM C.TBL WERE DATANO = loop; 92

100 } country>sqllen = 10; (5) (1) country に 13 バイトの領域のアドレスを設定します (2) 変換後の構造体のメンバ sqllen に領域長を設定します (3) MAX_COUNTRY 件のデータを取り出します (4) country を指定した ELECT 文を実行します (5) 次の QL 文の実行前に 変換後の構造体のメンバ sqllen に領域長を設定します BLOB 型の場合 BLOB 型の場合はコンパイル時に構造体に変換されるため データ領域はデータ長に 8 バイト足したサイズが必要になります また データ領域は 1K バイト (1024 バイト ) 単位で取得してください BLOB 型のサイズは 変換された構造体のメンバホスト変数名 _length に設定してください アプリケーション中に以下のように宣言します QL TYPE I BLOB *image; コンパイル時に構造体に変換します struct image_qlblob { long image_reserced; long image_length; char image_data[1]; } *image; BLOB 型のポインタ変数を相手指定に使用する場合 QL 文を実行するとデータ領域長を設定するメンバ変数名 _length に取得したデータの長さが設定されます したがって 再度 QL 文を実行する場合は 実行前に領域長を設定し直す必要があります 例 EXEC QL BEGIN DECLARE ECTION; QL TYPE I BLOB *image; short loop; EXEC QL END DECLARE ECTION; char buff[12]; image = (struct image_qlblob *)malloc(10248); (1) image>image_length = 10240; (2) for ( loop=0; loop<max_country; loop++ ) { (3) EXEC QL ELECT COUNTRY INTO image (4) FROM C.TBL WERE DATANO = loop; image>image_length = 10240; (5) } (1) image に バイトの領域のアドレスを設定します (2) 変換後の構造体のメンバ image_length に領域長を設定します (3) MAX_COUNTRY 件のデータを取り出します (4) image を指定した ELECT 文を実行します (5) 次の QL 文の実行前に 変換後のメンバ image_length に領域長を設定します 93

101 ROW_ID 型の場合 ROW_ID 型の場合 ポインタ変数が参照する領域は 24 バイト必要です また サイズは 24 になります DECIMAL 型の場合 精度が p の DECIMAL 型の場合 ポインタ変数が参照する領域は (p 2)+1 バイト必要です また サイズも (p 2)+1 になります NUMERIC 型の場合 精度が p の NUMERIC 型の場合 ポインタ変数が参照する領域は p+1 バイト必要です また サイズも p+1 になります 構造体型の場合 構造体型の場合 ポインタ変数が参照する領域のサイズは各メンバのサイズの合計となります QLTATE の場合 QLTATE をポインタ宣言する場合は 5 バイト以上の領域が必要です ポインタ変数の使用方法 以下に ポインタ変数を使用したデータ操作を実現するためのプログラミング例を示します データ領域を動的に取得する例 EXEC QL BEGIN DECLARE ECTION; char QLTATE[6]; char QLMG[256]; short datano; QL TYPE I BLOB *image; EXEC QL END DECLARE ECTION; short main() { image = (struct image_qlblob *)malloc( ); (1) image>image_length = 10240; datano = 5; /* データの取得 */ EXEC QL ELECT IMAGE (2) INTO image FROM C01.TBL01 WERE DATANO = datano; return 1; } (1) ホスト変数 image に領域のアドレスを設定します (2) 該当するデータを取得します 関数パラメタをデータ領域として使用する例 /* データ取得関数 */ short get_data( void *, short ); short main() { void *image; image = malloc( ); (1) 94

102 } ret = get_data( image, 5 ); (2) return 1; short get_data( void *image_data; short number; { EXEC QL BEGIN DECLARE ECTION; char QLTATE[6]; char QLMG[256]; QL TYPE I BLOB *image; short datano; EXEC QL END DECLARE ECTION; image = (struct image_qlblob *)image_data; (3) image>image_length = 10240; (4) datano = number; /* データの取得 */ EXEC QL ELECT IMAGE (5) INTO image FROM C01.TBL01 WERE DATANO = datano; return 0; } (1) データ取得関数に指定するデータ領域を取得します (2) データ取得関数を呼び出します (3) ホスト変数に領域アドレスを設定します (4) ホスト変数の領域長を設定します (5) データを取得します 構造体として宣言したホスト変数の使用方法 ここでは 構造体として宣言したホスト変数の使用方法について 以下を説明します 構造体ホスト変数の使用方法 標識変数の使用方法 複数行の一括挿入 構造体型として宣言したホスト変数を構造体ホスト変数と呼びます 構造体ホスト変数を宣言すると 各メンバがデータベースの各列に対応するように扱われるので 複数列のデータを行単位で操作することができます また 複数行の一括挿入もできます ポインタ変数と組み合わせて利用することにより アプリケーションが簡潔化され 保守性が向上します なお 標識変数を使用する場合は 構造体型の標識変数を宣言する必要があります 構造体型ホスト変数を使用する場合は 以下の点に注意してください INERT 文の VALUE 句に指定する場合は 挿入列リストの数と構造体のメンバの個数は同じでなければなりません また 構造体のメンバの順序は 挿入列リストに指定されている列の順序に対応します INERT 文の挿入列リストが省略された場合は 構造体のメンバが表のすべての列に対応している必要があります 95

103 単一行 ELECT 文の INTO 句に指定する場合は 選択リストの数と構造体のメンバの個数は同じでなければなりません また 構造体のメンバの順序は 選択リストに指定されている列の順序に対応します FETC 文の INTO 句に指定する場合は カーソル宣言で指定した問合せ指定の選択リストの数と構造体のメンバの個数は同じでなければなりません また 構造体のメンバの順序は 選択リストに指定されている列の順序に対応します 選択リストに * が指定された場合は FROM 句で指定した順に各表の各列のすべてに対応したメンバを定義する必要があります EXECUTE 文の結果 UING 句に指定する場合は 被準備文である動的単一行 ELECT 文の相手指定の個数と構造体のメンバの個数は同じでなければなりません また 構造体のメンバの順序は 被準備文の相手指定の順序に対応します EXECUTE 文のパラメタ UING 句に指定する場合は 被準備文の動的パラメタ指定の個数と構造体のメンバの個数は同じでなければなりません また 構造体のメンバの順序は 被準備文の動的パラメタの順序に対応します それぞれの列に対応するメンバの型は 列の型に対して指定可能でなければなりません 構造体のメンバを指定する場合は メンバの型で宣言されたホスト変数と同様に使用することができます 構造体を定義する場合に メンバとして構造体を指定することはできません 構造体ホスト変数の使用方法 データを構造体ホスト変数で取得する例 #include <stdio.h> #include <string.h> EXEC QL BEGIN DECLARE ECTION char QLTATE[6]; char QLMG[256]; struct { (1) long num; char name[21]; char atta[41]; short year; } data; short number; EXEC QL END DECLARE ECTION; short main() { /* データの取得 */ EXEC QL ELECT * INTO data (2) FROM C01.TBL01 WERE NUMBER = number; } return 1; (1) 構造体型のホスト変数を宣言します (2) 該当するデータを取得します ポインタ宣言した構造体変数を使用する例 short get_10_data( void * ); short set_10_data( void * ); EXEC QL BEGIN DECLARE ECTION; struct _tbl { (1) 96

104 short number; QL TYPE I BLOB(10K) image1; QL TYPE I BLOB(10K) image2; }; EXEC QL END DECLARE ECTION; EXEC QL BEGIN DECLARE ECTION; char QLTATE[6]; char QLMG[256]; EXEC QL END DECLARE ECTION; short main() { struct _tbl *buff; buff = (struct _tbl *)malloc( sizeof( struct _tbl ) ); (2) memset(buff, 0x00, sizeof(struct _tbl)); get_10_data( (void *)buff ); (3) set_10_data( (void *)buff ); (4) return 1; } short get_10_data( void *data0 ) { EXEC QL BEGIN DECLARE ECTION; struct _tbl *outdata; (5) EXEC QL END DECLARE ECTION; outdata = (struct _tbl *)data0; (6) EXEC QL ELECT DATANO,IMAGE1,IMAGE2 INTO outdata (7) FROM C01.TBL01; return 0; } short set_10_data( void *data0 ) { EXEC QL BEGIN DECLARE ECTION; struct _tbl *indata; (8) EXEC QL END DECLARE ECTION; indata = (struct _tbl *)data0; (9) EXEC QL UPDATE C01.TBL01 ET IMAGE = indata>image1 (10) WERE DATANO = indata>number; return 0; } (1) 構造体の型を宣言します (2) 領域を取得します (3) データ領域をデータ取得関数のパラメタに設定し 関数を呼びます (4) データ領域をデータ設定関数のパラメタに設定し 関数を呼びます (5) 構造体型のホスト変数を定義します (6) ホスト変数に領域のアドレスを設定します (7) データを取得します 97

105 (8) 構造体型のホスト変数を定義します (9) ホスト変数に領域のアドレスを設定します (10) データを更新します 標識変数の使用方法 構造体ホスト変数を使用する場合 標識変数は以下のようになります 構造体標識変数 short 型のメンバを持ち 構造体として宣言した変数を 標識変数として指定します メンバはすべて short 型でなければなりません メンバの数はホスト変数のメンバの数と同じでなければなりません 標識変数のメンバの順序は ホスト変数のメンバの順序に対応します EXEC QL BEGIN DECLARE ECTION; char QLTATE[6]; char QLMG[256]; struct { long col1; (1) char col2[21]; (2) char col3[41]; (3) short col4; (4) } data; struct { short ind1; (5) short ind2; (6) short ind3; (7) short ind4; (8) } indi; EXEC QL END DECLARE ECTION; EXEC QL ELECT COL01, COL02, COL03, COL04 INTO data indi FROM C01.TBL01 WERE DATANO = 1; (1) のメンバに対応する標識変数は (5) になります 同様に (2)(6) (3)(7) (4)(8) が対応します 配列指定の標識変数 short 型の配列指定の変数 1 つをメンバとする構造体型の変数を標識変数とし 配列の要素数はホスト変数のメンバ数と同じとします メンバは short 型でなければなりません メンバの配列数はホスト変数のメンバの数と同じでなければなりません 標識変数の配列の順序は ホスト変数のメンバの順序に対応します EXEC QL BEGIN DECLARE ECTION; char QLTATE[6]; char QLMG[256]; struct { long col1; (1) char col2[21]; (2) char col3[41]; (3) short col4; (4) 98

106 } data; struct { short ind[4]; (5) } indi; EXEC QL END DECLARE ECTION; EXEC QL ELECT COL01, COL02, COL03, COL04 INTO data indi FROM C01.TBL01 WERE DATANO = 1; (1) のメンバに対応する標識変数は (5) の indi.ind[0] です 同様に (2)indi.ind[1] (3)indi.ind[2] (4)indi.ind[3] が対応します 複数行の一括挿入 配列指定された構造体型のホスト変数または 構造体型のホスト変数のポインタを使用することで INERT 文により複数行のデータを一括挿入することができます 複数行の一括挿入 (1) 配列指定された構造体型を利用 以下の方法で 複数行を一括挿入する例を示します 挿入データとして 配列指定された構造体型のホスト変数を指定 構造体のメンバには配列指定を含めることはできません ただし 文字列型の 1 次元配列は指定可能です 挿入する行数を INERT 文の FOR 句に指定します 標識変数を指定することはできません EXEC QL BEGIN DECLARE ECTION; char QLTATE[6]; char QLMG[256]; struct { short col1; short col2; VARCAR col3[10]; VARCAR col4[10]; } data[5]; short rowcount; EXEC QL END DECLARE ECTION; data[0].col1 = 1; data[0].col2 = 100; strcpy( data[0].col3.sqlvar, "KANAGAWA" ); data[0].col3.sqllen = strlen( data[0].col3.sqlvar ); strcpy( data[0].col4.sqlvar, "ODAWARA" ); data[0].col4.sqllen = strlen( data[0].col4.sqlvar ); data[1].col1 = 2; data[1].col2 = 200; strcpy( data[1].col3.sqlvar, "IZUOKA" ); data[1].col3.sqllen = strlen( data[1].col3.sqlvar ); strcpy( data[1].col4.sqlvar, "MIIMA" ); data[1].col4.sqllen = strlen( data[1].col4.sqlvar ); data[4].col1 = 5; data[4].col2 = 500; strcpy( data[4].col3.sqlvar, "KANAGAWA" ); data[4].col3.sqllen = strlen( data[4].col3.sqlvar ); 99

107 strcpy( data[4].col4.sqlvar, "YOKOAMA" ); data[4].col4.sqllen = strlen( data[4].col4.sqlvar ); rowcount = 5; EXEC QL INERT INTO C1.TBL1( COL01, COL02, COL03, COL04 ) VALUE( data ) FOR rowcount; 複数行の一括挿入 (2) 構造体のポインタ型を利用 以下の方法で 複数行を一括挿入する例を示します 挿入データとして 構造体のポインタ型のホスト変数を指定 構造体のメンバには配列指定を含めることはできません ただし 文字列型の 1 次元配列は指定可能です 挿入する行数を INERT 文の FOR 句に指定します 標識変数を指定することはできません INERT 文の FOR 句に指定した値と実際のデータ個数を必ず一致させてください INERT 文の VALUE 句にデータのポインタを正しく設定してください EXEC QL BEGIN DECLARE ECTION; struct _tbl{ short col1; short col2; CAR col3[5]; CAR col4[5]; }; char QLTATE[6]; char QLMG[256]; EXEC QL END DECLARE ECTION; short insert_dat(struct _tbl *, short ); int main() { short i, data_count; struct _tbl *data; data_count = 3; data = (struct _tbl *) malloc(sizeof(struct _tbl)*data_count); memset(data, 0x00, sizeof(struct _tbl)*data_count); data[0].col1 = 1; data[0].col2 = 100; strcpy( data[0].col3, "AAAA" ); strcpy( data[0].col4, "BBBB" ); data[1].col1 = 2; data[1].col2 = 200; strcpy( data[1].col3, "CCCC" ); strcpy( data[1].col4, "DDDD" ); data[2].col1 = 3; data[2].col2 = 300; strcpy( data[2].col3, "EEEE" ); strcpy( data[2].col4, "FFFF" ); insert_dat(data, data_count); } return 0; 100

108 short insert_dat( struct _tbl *data, short data_count) { EXEC QL BEGIN DECLARE ECTION; struct _tbl *indata; short rowcount; EXEC QL END DECLARE ECTION; indata = data; rowcount = data_count; EXEC QL CONNECT TO DEFAULT; EXEC QL DELETE FROM T1.TBL4; EXEC QL INERT INTO T1.TBL4(COL01, COL02, COL03, COL04) VALUE (indata) FOR rowcount; EXEC QL COMMIT WORK; EXEC QL DICONNECT ALL; } return 0; BLOB 型のコンパイル時の展開方法 ここでは BLOB 型を QL 上で指定する方法について説明します ホスト変数は BLOB 型を持つ列に代入する値として指定することができます ホスト変数は 以下の形式でホストプログラム内に定義する必要があります QL TYPE I BLOB(< 長さ >< 単位 >) 変数名 ; < 長さ > 以下の範囲の任意の整数を設定単位が K の場合 1 ~ 単位が M の場合 1 ~ 2048 単位が G の場合 1 ~ 2 < 単位 >K( キロバイト ) M( メガバイト ) G( ギガバイト ) ただし コンパイル時には 以下のような構造体形式に変換します C プログラムは 変換された構造体の変数でデータ操作を行います 参照 BLOB 型の詳細については QL リファレンス を参照してください [32 ビットで実行する QL 埋込み C プログラムをコンパイルする場合 ] アプリケーション中に以下のように宣言します QL TYPE I BLOB (1K) area; コンパイル時に構造体に変換します struct{ long area_reserved; unsigned long area_length; char area_data[1024]; }area; 101

109 [64 ビットで実行する QL 埋込み C プログラムをコンパイルする場合 ] アプリケーション中に以下のように宣言します QL TYPE I BLOB (1K) area; コンパイル時に構造体に変換します struct{ int unsigned int char }area; area_reserved; area_length; area_data[1024]; DECIMAL 型または NUMERIC 型として宣言したホスト変数のコンパイル時の展開方法 ここでは DECIMAL 型および NUMERIC 型で宣言したホスト変数のデータ形式について説明します DECIMAL 型のデータ形式 DECIMAL 型のホスト変数を宣言すると コンパイル時に char 型の配列に変換します C プログラムでは 変換された char 型の変数でデータ操作を行います 以下に DECIMAL 型ホスト変数を char 型の配列に変換した例を示します 例 DECIMAL 型ホスト変数を char 型の配列に変換した例 アプリケーション中に以下のように宣言します DECIMAL(15,5) dec1; コンパイル時に char 型の配列に変換します char dec1[8]; DECIMAL 型のホスト変数を使用する場合 変換された char 型領域のデータ形式は以下のようになります DECIMAL(p,q) host1; と宣言されたホスト変数の場合 n m 例 データに対応する数値 (16 進数の 0 から 9) 符号 ( 正 16 進数の A,C,E,F 負 16 進数の B,D) データ設定の例 EXEC QL BEGIN DECLARE ECTION; DECIMAL(5,2) D1; DECIMAL(6,2) D2; EXEC QL END DECLARE ECTION; 102

110 精度 5 位取り 2 のホスト変数 D1 に を設定する場合 精度 5 位取り 2 のホスト変数 D1 に を設定する場合 精度 6 位取り 2 のホスト変数 D2 に を設定する場合 備考. 精度が偶数の場合の先頭 4 ビットは 0 になります NUMERIC 型のデータ形式 NUMERIC 型のホスト変数を宣言すると コンパイル時に char 型の配列に変換します C プログラムでは 変換された char 型の変数でデータ操作を行います 以下に NUMERIC 型ホスト変数を char 型の配列に変換した例を示します 例 NUMERIC 型ホスト変数を char 型の配列に変換した例 アプリケーション中に以下のように宣言します NUMERIC(15,5) num1; コンパイル時に char 型の配列に変換します char num1[16]; NUMERIC 型のホスト変数を使用する場合 変換された char 型領域のデータ形式は以下のようになります NUMERIC(p,q) host1; と宣言されたホスト変数の場合 n mm 例 データに対応する数値 (16 進数の 0 から 9) 符号 ( 正 16 進数の 2B 負 16 進数の 2D) データ設定の例 EXEC QL BEGIN DECLARE ECTION; NUMERIC(5,2) N1; EXEC QL END DECLARE ECTION; 103

111 精度 5 位取り 2 のホスト変数 N1 に を設定する場合 精度 5 位取り 2 のホスト変数 N1 に を設定する場合 拡張 QL 文識別子を使用した動的 QL 文の実行方法 ここでは 拡張 QL 文識別子を使用した動的 QL 文の実行方法について説明します 拡張 QL 文識別子 拡張 QL 文識別子は 文字列型のホスト変数で指定し アプリケーションの実行時に値を動的に設定します 拡張 QL 文識別子は 以下の QL 文に指定できます ALLOCATE CUROR 文 DEALLOCATE PREPARE 文 DECRIBE 文 EXECUTE 文 PREPARE 文 拡張 QL 文識別子の使用方法 拡張 QL 文識別子を使用すると ホスト変数を指定することにより被準備文の名前を実行時に動的に指定することが可能になるため PREPARE 文や EXECUTE 文など 被準備文の名前を指定する QL 文をまとめることができます そのため 多数の被準備文を使用するアプリケーションでも 開発量の削減を実現できます 拡張 QL 識別子ではなく QL 文識別子を使用すると 被準備文の名前を QL 文中に識別子として文字列で指定するため 複数の QL 文を準備する場合は 準備する QL 文の数だけ PREPARE 文を記述する必要があります また 各被準備文を実行する場合は 個々の QL 文識別子ごとに EXECUTE 文などの QL 文を記述しなければなりません そのため 多数の被準備文を使用するアプリケーションは その開発規模が大きくなってしまいます 拡張 QL 文識別子を使用した場合と QL 文識別子を使用した場合で 複数の被準備文を実行する例を以下に示します 例 1 拡張 QL 文識別子を使用して複数の被準備文を実行する例を以下に示します for ( loop=0; loop<nn; loop++ ) { EXEC QL PREPARE cmd FROM strsql; (1) } for ( loop=0; loop<nn; loop++ ) { EXEC QL EXECUTE cmd; (2) } (1) 拡張 QL 文識別子を使用して ループにより nn 個の準備可能文を準備します 104

112 例 2 (2) 拡張 QL 文識別子を使用して ループにより nn 個の被準備文を実行します QL 文識別子を使用して複数の被準備文を実行する例を以下に示します EXEC QL PREPARE CMD1 FROM strsql; (1) EXEC QL PREPARE CMD2 FROM strsql; (1) EXEC QL PREPARE CMD3 FROM strsql; (1) EXEC QL PREPARE CMDnn FROM strsql; (1) EXEC QL EXECUTE CMD1; (2) EXEC QL EXECUTE CMD2; (2) EXEC QL EXECUTE CMD3; (2) EXEC QL EXECUTE CMDnn; (2) (1)QL 文識別子 CMD1~CMDnn までに対応する QL 文を準備します (2)QL 文識別子 CMD1~CMDnn までに対応する被準備文を実行します 拡張 QL 文識別子の有効範囲 拡張 QL 文識別子の有効範囲はセションになります そのため複数のコンパイル単位にまたがって使用することができ 拡張 QL 文識別子を使用する QL 文ごとにカプセル化し 共有することが可能です 例 複数のコンパイル単位にまたがって拡張 QL 文識別子を使用する例を以下に示します パラメタ command_name に 'CMD1' が指定されたとします sub_pre.sc short sub_prep( char *command_name ) { EXEC QL BEGIN DECLARE ECTION; VARCAR cmd1[36]; VARCAR strsql[256]; EXEC QL END DECLARE ECTION; strcpy(cmd1.sqlvar, command_name); cmd1.sqllen = strlen(cmd1.sqlvar); EXEC QL PREPARE cmd1 FROM strsql; (1) } (1) 拡張 QL 文識別子 cmd1 を使用して 実行する QL 文を準備します 被準備文の名前は CMD1 になります sub_exec.sc short sub_exec( char *command_name ) { EXEC QL BEGIN DECLARE ECTION; VARCAR cmd1[36]; EXEC QL END DECLARE ECTION; strcpy(cmd1.sqlvar, command_name); cmd1.sqllen = strlen(cmd1.sqlvar); EXEC QL EXECUTE cmd1 UING QL DECRIPTOR 'DEC1'; (1) 105

113 } (1) 名前が CMD1 の被準備文を実行します 拡張カーソル名を使用したカーソル操作 ここでは 拡張カーソル名で指定されたカーソルの使用方法について説明します 拡張カーソル ALLOCATE CUROR 文を使用して宣言したカーソルを拡張カーソルといいます 拡張カーソルは ALLOCATE CUROR 文に拡張カーソル名および拡張 QL 文識別子を指定して定義します 拡張カーソル名は 文字列型のホスト変数を使用して定義し アプリケーションの実行時に値を動的に設定します 拡張カーソル名は 以下の QL 文に指定できます ALLOCATE CUROR 文 動的 CLOE 文 動的 DELETE 文 位置づけ 動的 FETC 文 動的 OPEN 文 動的 UPDATE 文 位置づけ 拡張カーソル名の使用方法 拡張カーソル名を使用すると ホスト変数を指定することによりカーソルの名前を実行時に動的に指定することが可能になるため 複数のカーソルを宣言する場合にカーソル宣言をまとめることができます そのため 多数のカーソルを操作するアプリケーションでも 開発量の削減を実現できます 拡張カーソル名ではなくカーソル名を使用すると カーソルの名前を QL 文中に識別子として文字列で指定するため 複数のカーソルを宣言する場合は 使用するカーソルの数だけカーソル宣言を記述する必要があります また カーソルを操作する場合は 個々のカーソル名を記述した QL 文を記述しなければなりません そのため 多数のカーソルを使用するアプリケーションは その開発規模が大きくなってしまいます 拡張カーソル名を使用した場合とカーソル名を使用した場合で 複数のカーソルを宣言する例を以下に示します 例 1 例 2 拡張カーソル名を使用して 複数のカーソルを宣言する例を示します for ( loop=0; loop<nn; loop++ ) { EXEC QL PREPARE cmd FROM strsql; (1) EXEC QL ALLOCATE cur1 CUROR FOR cmd1; (2) } (1) 拡張 QL 文識別子を使用して ループにより nn 個の準備可能文を準備します (2) 拡張カーソル名を使用して ループにより nn 個のカーソルを宣言します カーソル名を使用して 複数のカーソルを宣言する例を示します EXEC QL BEGIN DECLARE ECTION; VARCAR strsql[256]; EXEC QL END DECLARE ECTION; EXEC QL PREPARE CMD1 FROM strsql; (1) 106

114 EXEC QL PREPARE CMD2 FROM strsql; (1) EXEC QL PREPARE CMD3 FROM strsql; (1) EXEC QL PREPARE CMDnn FROM strsql; (1) EXEC QL DECLARE CUR1 CUROR FOR CMD1; (2) EXEC QL DECLARE CUR2 CUROR FOR CMD2; (2) EXEC QL DECLARE CUR3 CUROR FOR CMD3; (2) EXEC QL DECLARE CURnn CUROR FOR CMDnn; (2) (1)QL 文識別子 CMD1~CMDnn を定義します (2)QL 文識別子 CMD1~CMDnn に対し カーソル CUR1~CURnn を宣言します 拡張カーソル名の有効範囲 拡張カーソル名の有効範囲はセションになります そのため複数のコンパイル単位にまたがって使用することができ 拡張カーソル名を使用する QL 文ごとにカプセル化し 共有することが可能です 例 複数のコンパイル単位にまたがった拡張カーソルの使用例を示します パラメタ cursor_name に 'CUR1' が指定されたとします sub_pre.sc short sub_pre( char *command_name ) { EXEC QL BEGIN DECLARE ECTION; VARCAR cmd1[36]; VARCAR strsql[256]; EXEC QL END DECLARE ECTION; strcpy(cmd1.sqlvar, command_name); cmd1.sqllen = strlen(cmd1.sqlvar); EXEC QL PREPARE cmd1 FROM strsql; (1) } (1) ホスト変数 cmd1 を使用して拡張 QL 文識別子を定義します sub_alloc_cur.sc short sub_alloc_cur( char *command_name, char *cursor_name ) { EXEC QL BEGIN DECLARE ECTION; VARCAR cur1[36]; VARCAR cmd1[36]; EXEC QL END DECLARE ECTION; strcpy(cmd1.sqlvar, command_name); cmd1.sqllen = strlen(cmd1.sqlvar); strcpy(cur1.sqlvar, cursor_name); cur1.sqllen = strlen(cur1.sqlvar); EXEC QL ALLOCATE cur1 CUROR FOR cmd1; (1) 107

115 (1) 拡張カーソル名 cur1 と拡張 QL 文識別子 cmd1 を使用して拡張カーソルを宣言します sub_open.sc short sub_open( char *cursor_name ) { EXEC QL BEGIN DECLARE ECTION; VARCAR cur1[36]; EXEC QL END DECLARE ECTION; strcpy(cur1.sqlvar, cursor_name); cur1.sqllen = strlen(cur1.sqlvar); EXEC QL OPEN cur1; (1) (1) 拡張カーソル CUR1 をオープンします 3.2 QL 埋込み COBOL プログラムの作成方法 アプリケーションのコーディングは データベースを処理する部分を QL 文で そのほかの部分を利用する言語で記述します 利用可能な言語には C 言語および COBOL 言語があります QL 文を含む COBOL 言語で作成されたアプリケーションを QL 埋込み COBOL プログラムと呼びます 本節では QL 埋込み COBOL プログラムの作成方法について説明します アプリケーションのコーディング規則 アプリケーションのコーディングは データベースを処理する部分を QL 文で そのほかの部分を利用する言語で記述します 以下にアプリケーションのコーディング規則について説明します QL 埋込み COBOL プログラム COBOL プログラムの中に QL 文を組み込んだアプリケーションを QL 埋込み COBOL プログラムと呼びます QL 文は 図 3.4 QL 文のコーディング形式 (QL 埋込み COBOL プログラム ) に示すように EXEC QL および ENDEXEC ではさんで指定します EXEC QL QL 文および ENDEXEC は B 領域に書きます 固定形式の COBOL プログラムの場合は ステートメントの第 12 カラムから第 72 カラムの間が B 領域になります 可変形式の COBOL プログラムの場合は 第 12 カラムからそのレコードの最後までが B 領域になります 図 3.4 QL 文のコーディング形式 (QL 埋込み COBOL プログラム ) QL 文の指定例を以下に示します ゴシック部が QL 文です 108

116 例 1 埋込み QL 宣言節の例 EXEC QL BEGIN DECLARE ECTION ENDEXEC. 例 2 FETC 文の例 EXEC QL FETC CU1 INTO GNO, GOOD, QO ENDEXEC. 参照 また QL 文の継続 ( 行のつながり ) の規則は COBOL の正書法の規則に準じます COBOL の正書法については NetCOBOL 使用手引書 COBOL97 使用手引書 または COBOL 文法書 を参照してください QL 文の指定位置および指定順序 アプリケーション中に埋め込んで使用する QL 文には 実行文と非実行文があります 実行文は データベースをアクセスしたり トランザクションの制御を行うために使用します 非実行文は 実行文で利用するカーソルの宣言やホスト変数の宣言 例外条件発生時の動作を定義します 非実行文は アプリケーションの実行対象にはなりません したがって アプリケーション中の GOTO 文などによる制御の影響を受けません なお QL 文は サーバの O 環境で使用できる範囲が異なります QL 文の使用範囲については 付録 J QL 文の使用範囲 を参照してください QL 文の一覧を以下に示します 表 3.2 QL 文 分類 QL 文備考 非カーソル系データ操作 カーソル系データ操作 動的 QL 文 単一行 ELECT 文 UPDATE 文 探索 INERT 文 DELETE 文 探索 カーソル宣言 (DECLARE CUROR) OPEN 文 CLOE 文 FETC 文 UPDATE 文 位置づけ DELETE 文 位置づけ ALLOCATE DECRIPTOR 文 DEALLOCATE DECRIPTOR 文 DECRIPTOR 取得文 DECRIPTOR 設定文 PREPARE 文 実行文 非実行文 実行文 実行文 109

117 分類 QL 文備考 DEALLOCATE PREPARE 文 DECRIBE 文 EXECUTE 文 EXECUTE IMMEDIATE 文 動的カーソル宣言 動的 OPEN 文 動的 FETC 文 動的 CLOE 文 動的 DELETE 文 位置づけ 動的 UPDATE 文 位置づけ 非実行文 実行文 ストアドプロシジャ CALL 文実行文 トランザクション制御文 コネクション管理文 セション管理文 COMMIT 文 ROLLBACK 文 ET TRANACTION 文 CONNECT 文 ET CONNECTION 文 DICONNECT 文 ET CATALOG 文 ET CEMA 文 ET EION AUTORIZATION 文 実行文 実行文 実行文 表宣言表宣言非実行文 埋込み例外宣言 WENEVER 文非実行文 埋込み QL 宣言節 BEGIN DECLARE ECTION END DECLARE ECTION 非実行文 資源操作文 RELEAE TABLE 文実行文 利用者制御文 ET UER PAWORD 文実行文 アクセス制御文 ET ROLE 文実行文 QL 埋込み COBOL プログラムでの QL 文の指定位置について説明します 埋込み QL 宣言節の指定位置 埋込み QL 宣言節は ホスト変数を定義するためのものです 埋込み QL 宣言節は DATA DIVIION の作業場所節 (WORKINGTORAGE ECTION) または LINKAGE ECTION に記述します また ホスト変数の変数名は COBOL プログラムソース上で QL 以外で始まる名前で命令し 一意にする必要があります ホスト変数の宣言 ホスト変数は アプリケーションとデータベースの間でデータの受渡しをするのに使用する変数です すなわち アプリケーションで参照するデータをデータベースから取り出すため または逆に アプリケーションで設定したデータをデータベースに格納するために QL 文に指定する変数です ホスト変数の宣言は 埋込み QL 宣言節で行います 宣言の記述方法そのものは COBOL での変数の宣言と同じです ホスト変数の宣言の例を以下に示します 110

118 図 3.5 ホスト変数宣言の例 (QL 埋込み COBOL プログラム ) 状態変数の宣言 状態変数は 処理結果の状態をアプリケーションに伝えるための変数です 状態変数には状態コードが設定されます 状態コードは 処理が正常に完了した または処理中になんらかの例外条件が発生したという状態を表します 状態変数の変数名は QLTATE です QLTATE は長さ 5 桁の文字列型 (01 QLTATE PIC X(5)) の変数であり 埋込み QL 宣言節で宣言します 埋込み QL を使用するアプリケーション中では 状態変数を必ず宣言します メッセージ変数の宣言 メッセージ変数は 処理結果をメッセージとしてアプリケーションに伝えるための変数です メッセージ変数の変数名は QLMG です QLMG は固定長文字列型の変数であり 埋込み QL 宣言節で宣言します メッセージ変数の宣言のしかたを以下に示します 01 QLMG PIC X(n) n メッセージ変数の長さ ( バイト数 ) です 1 以上 以下の値を指定します 1 以上 以下の値を指定します メッセージ変数にメッセージが設定される際の規則を以下に示します 設定されるメッセージは 1 つだけです メッセージの長さがメッセージ変数の長さ (n) を超える場合 メッセージの先頭から n 文字分設定されます メッセージ変数のメッセージのうしろの領域は空白パディングされます カーソル宣言の指定位置 カーソル宣言は PROCEDURE DIVIION 節内に記述します ただし 宣言したカーソル名を参照するカーソル系の QL 文よりソースファイル上で先行して記述します なお カーソル名は COBOL プログラムソース上で一意にすることが必要です 埋込み例外宣言の指定位置 埋込み例外宣言は PROCEDURE DIVIION に記述します 埋込み例外宣言の意味と有効範囲については QL 文の処理結果の確認 で説明します 実行文の指定位置 データ操作文やトランザクション制御文などの実行文は PROCEDURE DIVIION に記述します 111

119 INCLUDE 文の指定位置 アプリケーション中に INCLUDE 文を指定することができます インクルードファイルには QL 文および COBOL の言語テキストを記述できます インクルードファイルに ホスト変数および状態変数の宣言を格納しておくことにより 複数のアプリケーションで共通に使用する変数をまとめて宣言することができます INCLUDE 文に指定するファイル名 INCLUDE 文には 以下のファイル名を指定してください インクルードファイル名から拡張子.COBOL を除いたファイル名 インクルードファイル名 インクルードファイルの検索優先順位 INCLUDE 文が指定された場合 インクルードファイルは 以下の順番に検索されます 1. 指定されたファイル名に 拡張子.COBOL を付加したファイル名 2. 指定されたファイル名 表宣言 表宣言は スキーマ名の修飾をしない表名を定義する宣言文です 表宣言で定義した表名を それ以降の QL 文で記述する場合 スキーマ名を省略することができます INCLUDE 文と表宣言の例を以下に示します [ インクルードファイル OTVAR ] 01 QLTATE PIC X(5). 01 TOCK PIC 9(9) BINARY. [QL 埋込み COBOL プログラム ] EXEC QL BEGIN DECLARE ECTION ENDEXEC. EXEC QL INCLUDE OTVAR ENDEXEC. EXEC QL END DECLARE ECTION ENDEXEC. PROCEDURE DIVIION. EXEC QL DECLARE 在庫表 TABLE ON C1 ENDEXEC. EXEC QL ELECT 在庫数量 INTO TOCK FROM 在庫表 WERE 製品番号 = 240 ENDEXEC. スキーマ名修飾省略 DIPLAY " 在庫数量 = " TOCK. TOP RUN ホスト変数および標識変数の指定方法 ホスト変数は アプリケーションとデータベースの間でデータの受渡しをするのに使用する変数です QL 文中でホスト変数と対にして指定し データの内容が NULL 値かどうかを表すために使用する変数を 標識変数と呼びます アプリケーションで参照するデータをデータベースから取り出す場合 標識変数には 取り出したデータが NULL 値かどうかを表す情報が設定されます 逆に アプリケーションで設定したデータをデータベースに格納する場合には 標識変数には 格納するデータが NULL 値かどうかを表す情報を設定しておきます 標識変数は 埋込み QL 宣言節で宣言します 宣言の記述方法はホスト変数と同じです なお 標識変数のデータ型は MALLINT に対応するデータ型であることが必要です 参照 各ホスト言語でのデータ型と QL のデータ型との対応については QL リファレンス を参照してください ホスト変数および標識変数を QL 文中に指定する場合には 変数の前にコロン を付けて指定します 以下にその指定例を示します ( ゴシック部がホスト変数または標識変数です ) ただし QL 文以外の COBOL ステートメント中では 一般の COBOL の変数と同じで コロン は付けません 標識変数には QL 文の処理結果が以下のように格納されます 112

120 取り出すデータが NULL 値の場合 標識変数には 1 が格納されます 取り出すデータのデータ型が文字列または各国語文字列で かつ NULL 値ではなく 取り出すデータの長さが相手指定の文字列または各国語文字列の長さよりも長い場合は 取り出すデータの有効な長さが標識変数に格納されます 上記以外の場合は 標識変数に 0 が格納されます なお 標識変数を指定していない場合 取り出すデータが NULL 値になると QL 文の処理はエラーになります 例 1 ホスト変数の指定例 TOCK および OUE をホスト変数 QFLAG を TOCK の標識変数 そして WFLAG を OUE の標識変数として指定します QL 文中にホスト変数および標識変数を指定する場合は コロン を付けます EXEC QL ELECT 在庫数量, 倉庫番号 INTO TOCK INDICATOR QFLAG, OUE INDICATOR WFLAG FROM 在庫表 WERE 製品番号 = 110 ENDEXEC. 例 2 QL 文以外の COBOL ステートメント上のホスト変数の指定例 TOCK をホスト変数 QFLAG を TOCK の標識変数として使用しています COBOL ステートメントでは これらの変数にコロン は付けません EXEC QL FETC CU1 INTO TOCK INDICATOR QFLAG ENDEXEC. IF QFLAG = 1 GO TO PNULL. IF TOCK = 0 GO TO PLOOP QL 文の処理結果の確認 アプリケーションは QL 文を実行したあと 実行結果を確認して処理を進めて行くことが必要です この QL 文の実行結果を確認する方法には 以下の 2 通りがあります a. 状態変数およびメッセージ変数を使用する場合 b. 埋込み例外宣言 (WENEVER 文 ) を使用する場合 状態変数およびメッセージ変数を使用する場合 QL 文の実行結果は 各 QL 文の実行ごとに 状態変数 QLTATE およびメッセージ変数 QLMG に通知されます アプリケーションでは その値を判定しながら処理を進めます QLTATE および QLMG は あらかじめ埋込み QL 宣言節で宣言しておく必要があります 宣言の詳細は 状態変数の宣言 および メッセージ変数の宣言 を参照してください QLTATE に通知される値とその意味は 付録 C QLTATE 値 を参照してください また QLMG に通知される内容は メッセージ集 を参照してください QLTATE および QLMG を使用した QL 文の実行結果の確認方法は B.4 状態変数およびメッセージ変数の使用例 を参照してください 埋込み例外宣言 (WENEVER 文 ) を使用する場合 埋込み例外宣言は QL 文が例外条件を生じた場合に実行する処理を指定する QL 文です これにより QL 文の実行ごとに 実行結果をチェックする必要がなくなります 埋込み例外宣言の指定例を以下に示します 例 1 データなし以外のエラーが発生した場合には ERR001 へ進むことを指定します 113

121 EXEC QL WENEVER QLERROR GOTO ERR001 ENDEXEC. (1) (2) (1) 条件 (2) 例外動作 例 2 検索の結果データが見つからない場合に 処理をそのまま続行することを指定します EXEC QL WENEVER NOT FOUND CONTINUE ENDEXEC. (1) (2) (1) 条件 (2) 例外動作 条件は 以下の 2 通りの指定ができます NOT FOUND 検索データが見つからない場合に指定の例外動作を行います QLERROR 検索データが見つからない 以外のエラーが発生した場合に指定の例外動作を行います 例外動作は 以下の 2 通りの指定ができます CONTINUE 次のステートメントに進みます GOTO < 行き先 > 行き先で指定のステートメントに進みます ここで < 行き先 > は 制御を移す先の節名 ( セクション名 ) または段落名 ( パラグラフ名 ) の前にコロン を付けて指定します 例 3 QL 埋込み COBOL プログラムで QL 文にエラーが発生した場合には PERROR へ進み 変数 RCODE に 8 を設定することを指定します EXEC QL WENEVER QLERROR GOTO PERROR ENDEXEC. PERROR. MOVE 8 TO RCODE. WENEVER 文は複数個宣言することができます 条件の同じ WENEVER 文を指定した場合 アプリケーション中での記述順序であとの宣言が有効になります 実行の順序とは関係ありません WENEVER 文の有効範囲の例を以下に示します 114

122 図 3.6 WENEVER 文を使用したアプリケーションの例 (1) 状態変数 QLTATE およびメッセージ変数 QLMG を宣言します (2) QL 文の実行で NOT FOUND 以外のエラーが生じた場合に PERROR へ進み エラー情報を出力し プログラムは終了します (3) カーソル CU1 の操作で NOT FOUND( 検索データが見つからない ) が生じた場合に PNEXT へ進み カーソル CU1 のクローズと在庫数量の出力を行います (4) カーソル CU2 の操作で NOT FOUND( 検索データが見つからない ) が生じた場合に PEND へ進み カーソル CU2 のクローズと発注数量の出力を行い プログラムは終了します 可変長文字列のデータ操作 可変長文字列データを操作する場合は 文字列の長さが必要です このため データ操作を行うホスト変数は 可変長文字列の長さをもつ符号付き 2 進項目と 文字列自身をもつ英数字項目からなる集団項目の形式で定義します また 日本語可変長文字列のデータ操作も同様に行えます 115

123 詳細は B.1 可変長文字列のデータ操作例 を参照してください BLOB 型のコンパイル時の展開方法 ここでは BLOB 型を QL 上で指定する方法について説明します ホスト変数は BLOB 型を持つ列に代入する値として指定することができます ホスト変数は 以下の形式でホストプログラム内に定義する必要があります 01 変数名 QL TYPE I BLOB(< 長さ >< 単位 >). < 長さ >1 ~2G の任意の整数を設定単位が K の場合 1 ~ 単位が M の場合 1 ~2048 単位が G の場合 1 ~2 < 単位 >K( キロバイト ) M( メガバイト ) G( ギガバイト ) ただし コンパイル時には 以下のような集団項目形式に変換します COBOL プログラムは 変換された集団項目の変数でデータ操作を行います 参照 BLOB 型の詳細については QL リファレンス を参照してください アプリケーション中に以下のように宣言します 01 AREA QL TYPE I BLOB (1K). コンパイル時に集団項目に変換します 01 AREA. 49 AREAREERVED PIC 9(9) UAGE I BINARY. 49 AREALENGT PIC 9(9) UAGE I BINARY. 49 AREADATA PIC X(1024) 集団項目ホスト変数の記述方法 データベースの複数列を集団項目として操作できるホスト変数を 集団項目ホスト変数と呼びます 集団項目ホスト変数を宣言すると 集団項目に属する基本項目が データベースの各列に対応するように扱われます このとき 標識変数を使用する場合は 集団項目繰り返し標識変数を宣言します 集団項目ホスト変数に対応した標識変数定義を繰り返し記述できます 集団項目ホスト変数を指定する場合は コンパイルオプションに G を指定する必要があります 集団項目ホスト変数は 繰り返し指定ができます 集団項目ホスト変数に繰り返し指定を指定する場合は コンパイルオプションに E1 を指定する必要があります なお G は省略できます 集団項目ホスト変数を INERT 文に指定することにより 複数の行を一括して挿入することができます なお 集団項目ホスト変数や集団項目繰り返しホスト変数の宣言中に 別の集団項目ホスト変数や集団項目繰り返しホスト変数を入れ子で宣言することはできません 以下に コンパイルオプションの指定例と 集団項目ホスト変数の使用例を示します 集団項目指定 例 1 集団項目を指定する場合のコンパイルオプションの指定例 sqlcobol G demo09main.scob M o../bin/demo09 demo09sub.o 116

124 sqlcobol G demo09main.scob M o.. bin demo09.exe demo09sub.obj 例 2 集団項目ホスト変数の使用例 WORKINGTORAGE ECTION. EXEC QL BEGIN DECLARE ECTION. 01 QLTATE PIC X(5). 01 QLMG PIC X(255). 01 G1. 02 OT1 PIC 9(4) BINARY. (1) 02 OT2 PIC N(10). (2) 02 OT3 PIC 9(9) BINARY. (3) 02 OT4 PIC 9(4) BINARY. (4) 01 G2. 02 IND PIC 9(4) BINARY OCCUR 4. (5) EXEC QL END DECLARE ECTION. PROCEDURE DIVIION. * 変数初期化 INITIALIZE QLTATE. INITIALIZE QLMG. INITIALIZE G1. INITIALIZE G2. * QL 呼出し EXEC QL ELECT COL1, COL2, COL3, COL4 INTO G1 G2 FROM.T1 (6) WERE COL1= 100 ENDEXEC. * DIPLAY "COL1=" OT1. DIPLAY "IND= " IND(1). DIPLAY "COL2=" OT2. DIPLAY "IND= " IND(2). DIPLAY "COL3=" OT3. DIPLAY "IND= " IND(3). DIPLAY "COL4=" OT4. DIPLAY "IND= " IND(4). (1)~(4) 集団項目ホスト変数 G1 を定義します (5) 集団項目繰り返し標識変数を定義します (6) 集団項目ホスト変数 G1 の各基本項目に対して 単一行 ELECT 文で データベースからデータを取り出します 集団項目繰り返し指定 集団項目繰り返し指定を利用することで 複数行のデータを一括挿入できます 例 1 集団項目繰り返しホスト変数のコンパイルオプションの指定例 sqlcobol E1 demo09main.scob M o../bin/demo09 demo09sub.o 例 2 sqlcobol E1 demo09main.scob M o.. bin demo09 demo09sub.obj 集団項目繰り返しホスト変数および複数行の一括挿入の使用例 WORKINGTORAGE ECTION. EXEC QL BEGIN DECLARE ECTION. 117

125 01 QLTATE PIC X(5). 01 QLMG PIC X(255). 01 CTR PIC 9(4) BINARY. 01 G1. 02 GREP OCCUR 3. (1) 03 OT1 PIC 9(4) BINARY. (2) 03 OT2 PIC X(10). (3) 03 OT3 PIC 9(9) BINARY. (4) 03 OT4 PIC 9(4) BINARY. (5) 01 G2. 02 OT1 PIC 9(4) BINARY. 02 OT2 PIC X(10). 02 OT3 PIC 9(9) BINARY. 02 OT4 PIC 9(4) BINARY. 01 G3. 02 IND PIC 9(4) BINARY OCCUR 4. (6) EXEC QL END DECLARE ECTION. PROCEDURE DIVIION. * 変数初期化 INITIALIZE QLTATE. INITIALIZE QLMG. INITIALIZE G1. INITIALIZE G2. INITIALIZE G3. * 値の設定 PERFORM TET BEFORE VARYING CTR FROM 1 BY 1 UNTIL CTR > 3 COMPUTE OT1 OF GREP OF G1(CTR) = CTR ENDPERFORM. * MOVE "AAA" TO OT2 OF GREP OF G1(1). MOVE "BBB" TO OT2 OF GREP OF G1(2). MOVE "CCC" TO OT2 OF GREP OF G1(3). * COMPUTE OT3 OF GREP OF G1(1) = COMPUTE OT3 OF GREP OF G1(2) = COMPUTE OT3 OF GREP OF G1(3) = * COMPUTE OT4 OF GREP OF G1(1) = COMPUTE OT4 OF GREP OF G1(2) = COMPUTE OT4 OF GREP OF G1(3) = * INERT EXEC QL INERT INTO.T(COL1,COL2,COL3,COL4) VALUE(G1.GREP) FOR 3 (7) ENDEXEC. * カーソル宣言 EXEC QL DECLARE CU1 CUROR FOR ELECT COL1,COL2,COL3,COL4 FROM.T WERE COL1 < 100 ENDEXEC. * EXEC QL OPEN CU1 ENDEXEC. * PERFORM TET BEFORE VARYING CTR FROM 1 BY 1 UNTIL CTR > 3 * FETC EXEC QL FETC CU1 INTO G2 INDICATOR G3 ENDEXEC * DIPLAY DIPLAY "COL1=" OT1 OF G2 DIPLAY "IND= " IND(1) 118

126 DIPLAY "COL2=" OT2 OF G2 DIPLAY "IND= " IND(2) DIPLAY "COL3=" OT3 OF G2 DIPLAY "IND= " IND(3) DIPLAY "COL4=" OT4 OF G2 DIPLAY "IND= " IND(4) ENDPERFORM. (1)~(5) 集団項目繰り返しホスト変数を宣言します 集団項目ホスト変数 GREP に対して 繰り返し OCCUR 3 を定義します (6) 集団項目繰り返し標識変数を宣言します (7) 複数行の INERT 文を実行します 繰り返しの基本項目に値を設定しておいて 集団項目ホスト変数 GREP を INERT 文に指定して 複数行のデータをデータベースに挿入します COBOL プログラム作成時の注意事項 データベースを処理する COBOL プログラムでは 初期化プログラムの利用はできません 初期化プログラムとは 呼び出されたときに 常にプログラムを初期状態としたい場合 プログラム名段落に INITIAL を指定したプログラムのことです クラス定義を使用する場合の注意事項 COBOL ソース単位がクラス定義 ( オブジェクト指向プログラミング機能 ) の場合 アプリケーション作成時の注意事項を以下に示します ホスト変数定義は OBJECT 定義のデータ部または OBJECT 定義に含まれるメソッド定義のデータ部に記述しなければなりません 複数のオブジェクトメソッドに埋込み QL 文を記述する場合は OBJECT 定義のデータ部に QLTATE および QLMG を定義しなければなりません 埋込み QL 文は OBJECT 定義に含まれるメソッド定義の手続き部に記述しなければなりません OBJECT 定義のデータ部に WORKINGTORAGE ECTION を必ず記述しなければなりません COBOL ソース単位がクラス定義の場合 COBOL97(V40L10) 以降でコンパイルしなければなりません 以下に クラス定義 ( オブジェクト指向プログラミング機能 ) を使用する場合のプログラミング例を示します IDENTIFICATION DIVIION. CLAID. CLANAME. IDENTIFICATION DIVIION. FACTORY. DATA DIVIION. WORKINGTORAGE ECTION. 01 DATA1 PIC X(5). PROCEDURE DIVIION. IDENTIFICATION DIVIION. METODID. METODNAME1 DATA DIVIION. WORKINGTORAGE ECTION. 01 DATA2 PIC X(5). PROCEDURE DIVIION. MOVE "AAAAA" TO DATA1 MOVE "11111" TO DATA2 IDENTIFICATION DIVIION. 119

127 OBJECT. DATA DIVIION. WORKINGTORAGE ECTION. EXEC QL BEGIN DECLARE ECTION ENDEXEC. 01 QLTATE PIC X(5). 01 QLMG PIC X(255). 01 VAR1 PIC 9(4) BINARY. EXEC QL END DECLARE ECTION ENDEXEC. 01 DATA3 PIC X(5). PROCEDURE DIVIION. IDENTIFICATION DIVIION. METODID. METODNAME1 DATA DIVIION. WORKINGTORAGE ECTION. 01 DATA3 PIC X(5). PROCEDURE DIVIION. EXEC QL INERT INTO.T VALUE(1,2,3,4,5) ENDEXEC. IDENTIFICATION DIVIION. METODID. METODNAME2 DATA DIVIION. WORKINGTORAGE ECTION. 01 DATA3 PIC X(5). PROCEDURE DIVIION. EXEC QL ELECT C2 INTO VAR1 FROM.T WERE C1 = 1 ENDEXEC UNICODE を使用する場合のエンディアンの選択 アプリケーションの文字コード系を UNICODE で動作させる場合 日本語項目の表現形式は UC2 のリトルエンディアン形式となります 以下の富士通 COBOL 製品を使用した場合 コンパイル時に UC2 の形式としてビッグエンディアン形式を選択することができます NetCOBOL Enterprise Edition V8.0 以降 レコード順ファイルや相対ファイルを使用して アプリケーションにデータの入出力を行う場合 ファイルの日本語項目の表現形式は アプリケーションのコンパイル時に指定した形式と同じになります コンパイル時に UC2 の形式をビッグエンディアン形式にすることで レコード順ファイルや相対ファイルのデータが UC2 のビッグエンディアン形式となり 他のプラットフォームと共通で使用可能となる利点があります 120

128 オプションの指定方法 以下に UC2 のビッグエンディアン形式を使用する場合のコンパイル例を示します sqlcobol を使用する場合 sqlcobol RC BE demou01main.scob M o../bin/demo01 sqlpcob を使用する場合 sqlpcob RC BE demou01main.scob cobol WC,"RC(UC2,BE)" M o../bin/demo01 demou01main.cobol L/opt/FJVrdb2b/lib lsqldrv 注意 プレコンパイルとコンパイルを別々に実行する場合は COBOL コンパイラに RC オプションを必ず指定してください また 複数のコンパイル単位から構成されるアプリケーションは すべて同じ RC オプションを指定してコンパイルしてください 使用例 例 レコード順ファイルを使用したプログラム例を以下に示します コンパイル時に UC2 の形式をビッグエンディアン形式にすることで プログラム内にエンディアンを意識した処理を入れることなく 共通のデータファイルを使用可能になります IDENTIFICATION DIVIION PROGRAMID. RIN ENVIRONMENT DIVIION INPUTOUTPUT ECTION FILECONTROL ELECT FILE AIGN TO "./FILE0001" DATA DIVIION FILE ECTION FD FILE RECORD FNCOL01 PIC N(5) WORKINGTORAGE ECTION EXEC QL BEGIN DECLARE ECTION ENDEXEC QLTATE PIC X(5) QLMG PIC X(255) OT1 PIC N(10) EXEC QL END DECLARE ECTION ENDEXEC * PROCEDURE DIVIION * * * CONNECT EXEC QL CONNECT TO DEFAULT ENDEXEC DIPLAY "PTTQLMG " QLMG * ELECT EXEC QL ELECT COL1 INTO OT1 FROM.T WERE COL1= ENDEXEC. 121

129 DIPLAY "PTTQLMG " QLMG * COMMIT EXEC QL COMMIT WORK ENDEXEC DIPLAY "PTTQLMG " QLMG * DICONNECT EXEC QL DICONNECT DEFAULT ENDEXEC DIPLAY "PTTQLMG " QLMG OPEN OUTPUT file WRITE RECORD01 FROM OT CLOE FILE EXIT PROGRAM 拡張 QL 文識別子を使用した動的 QL 文の実行方法 ここでは 拡張 QL 文識別子を使用した動的 QL 文の実行方法について説明します 拡張 QL 文識別子 拡張 QL 文識別子は 文字列型のホスト変数で指定し アプリケーションの実行時に値を動的に設定します 拡張 QL 文識別子は 以下の QL 文に指定できます ALLOCATE CUROR 文 DEALLOCATE PREPARE 文 DECRIBE 文 EXECUTE 文 PREPARE 文 拡張 QL 文識別子の使用方法 拡張 QL 文識別子を使用すると ホスト変数を指定することにより被準備文の名前を実行時に動的に指定することが可能になるため PREPARE 文や EXECUTE 文など 被準備文の名前を指定する QL 文をまとめることができます そのため 多数の被準備文を使用するアプリケーションでも 開発量の削減を実現できます 拡張 QL 識別子ではなく QL 文識別子を使用すると 被準備文の名前を QL 文中に識別子として文字列で指定するため 複数の QL 文を準備する場合は 準備する QL 文の数だけ PREPARE 文を記述する必要があります また 各被準備文を実行する場合は 個々の QL 文識別子ごとに EXECUTE 文などの QL 文を記述しなければなりません そのため 多数の被準備文を使用するアプリケーションは その開発規模が大きくなってしまいます 拡張 QL 文識別子を使用した場合と QL 文識別子を使用した場合で 複数の被準備文を実行する例を以下に示します 例 1 拡張 QL 文識別子を使用した複数の被準備文を実行するアプリケーション PERFORM VARYING LOOP FROM 1 BY 1 UNTIL LOOP > nn EXEC QL PREPARE cmd FROM strsql ENDEXEC. (1) ENDPERFORM. 122

130 例 PERFORM VARYING LOOP FROM 1 BY 1 UNTIL LOOP > nn EXEC QL EXECUTE cmd ENDEXEC. (2) ENDPERFORM. (1) 拡張 QL 文識別子を使用して ループにより nn 個の準備可能文を準備します (2) 拡張 QL 文識別子を使用して ループにより nn 個の被準備文を実行します QL 文識別子を使用した複数の被準備文を実行するアプリケーション EXEC QL PREPARE CMD1 FROM strsql ENDEXEC. (1) EXEC QL PREPARE CMD2 FROM strsql ENDEXEC. (1) EXEC QL PREPARE CMD3 FROM strsql ENDEXEC. (1) EXEC QL PREPARE CMDnn FROM strsql ENDEXEC. (1) EXEC QL EXECUTE CMD1 ENDEXEC. (2) EXEC QL EXECUTE CMD2 ENDEXEC. (2) EXEC QL EXECUTE CMD3 ENDEXEC. (2) EXEC QL EXECUTE CMDnn ENDEXEC. (2) (1)QL 文識別子 CMD1~CMDnn までに対応する QL 文を準備します (2)QL 文識別子 CMD1~CMDnn までに対応する被準備文を実行します 拡張 QL 文識別子の有効範囲 拡張 QL 文識別子の有効範囲はセションになります そのため複数のコンパイル単位にまたがって使用することができ 拡張 QL 文識別子を使用する QL 文ごとにカプセル化し 共有することが可能です 例 複数のコンパイル単位にまたがって拡張 QL 文識別子を使用するアプリケーション sub_pre.scob IDENTIFICATION DIVIION PROGRAMID. UBPREP EXEC QL PREPARE cmd1 FROM strsql ENDEXEC. (1) EXIT PROGRAM. (1) ホスト変数 cmd1 を使用して拡張 QL 文識別子 CMD1 を定義します sub_exec.scob IDENTIFICATION DIVIION PROGRAMID. UBEXEC EXEC QL EXECUTE cmd1 UING QL DECRIPTOR 'DEC1' ENDEXEC. (1) EXIT PROGRAM. (1) 拡張 QL 文識別子 CMD1 の被準備文を実行します 拡張カーソル名を使用したカーソル操作 ここでは 拡張カーソル名で指定されたカーソルの使用方法について説明します 123

131 拡張カーソル ALLOCATE CUROR 文を使用して宣言したカーソルを拡張カーソルといいます 拡張カーソルは ALLOCATE CUROR 文に拡張カーソル名および拡張 QL 文識別子を指定して定義します 拡張カーソル名は 文字列型のホスト変数を使用して定義し アプリケーションの実行時に値を動的に設定します 拡張カーソル名は 以下の QL 文に指定できます ALLOCATE CUROR 文 動的 CLOE 文 動的 DELETE 文 位置づけ 動的 FETC 文 動的 OPEN 文 動的 UPDATE 文 位置づけ 拡張カーソル名の使用方法 拡張カーソル名を使用すると ホスト変数を指定することによりカーソルの名前を実行時に動的に指定することが可能になるため 複数のカーソルを宣言する場合にカーソル宣言をまとめることができます そのため 多数のカーソルを操作するアプリケーションでも 開発量の削減を実現できます 拡張カーソル名ではなくカーソル名を使用すると カーソルの名前を QL 文中に識別子として文字列で指定するため 複数のカーソルを宣言する場合は 使用するカーソルの数だけカーソル宣言を記述する必要があります また カーソルを操作する場合は 個々のカーソル名を記述した QL 文を記述しなければなりません そのため 多数のカーソルを使用するアプリケーションは その開発規模が大きくなってしまいます 拡張カーソル名を使用した場合とカーソル名を使用した場合で 複数のカーソルを宣言する例を以下に示します 例 1 例 2 拡張カーソル名を使用して 複数のカーソルを宣言する例を示します PERFORM VARYING LOOP FROM 1 BY 1 UNTIL LOOP > nn EXEC QL PREPARE cmd1 FROM strsql ENDEXEC. (1) EXEC QL ALLOCATE cur1 CUROR FOR cmd1 ENDEXEC.(2) ENDPERFORM. (1) 拡張 QL 文識別子を使用して ループにより nn 個の準備可能文を準備します (2) 拡張カーソル名を使用して ループにより nn 個のカーソルを宣言します カーソル名を使用して 複数のカーソルを宣言する例を示します EXEC QL PREPARE CMD1 FROM strsql ENDEXEC. (1) EXEC QL PREPARE CMD2 FROM strsql ENDEXEC. (1) EXEC QL PREPARE CMD3 FROM strsql ENDEXEC. (1) EXEC QL PREPARE CMDnn FROM strsql ENDEXEC. (1) EXEC QL DECLARE CUR1 CUROR FOR CMD1 ENDEXEC. (2) EXEC QL DECLARE CUR2 CUROR FOR CMD2 ENDEXEC. (2) EXEC QL DECLARE CUR3 CUROR FOR CMD3 ENDEXEC. (2) 124

132 002nn0 EXEC QL DECLARE CURnn CUROR FOR CMDnn ENDEXEC. (2) (1)QL 文識別子 CMD1~CMDnn を定義します (2)QL 文識別子 CMD1~CMDnn に対し カーソル CUR1~CURnn を宣言します 拡張カーソル名の有効範囲 拡張カーソル名の有効範囲はセションになります そのため複数のコンパイル単位にまたがって使用することができ 拡張カーソル名を使用する QL 文ごとにカプセル化し 共有することが可能です 例 複数のコンパイル単位にまたがった拡張カーソルの使用例を示します sub_pre.scob IDENTIFICATION DIVIION PROGRAMID. UBPREP EXEC QL PREPARE cmd1 FROM strsql ENDEXEC. (1) (1) ホスト変数 cmd1 を使用して拡張 QL 文識別子を定義します sub_alloc_cur.scob IDENTIFICATION DIVIION PROGRAMID. UBALLOC EXEC QL ALLOCATE cur1 CUROR FOR cmd1 ENDEXEC. (1) (1) 拡張カーソル名 cur1 と拡張 QL 文識別子 cmd1 を使用して拡張カーソルを宣言します sub_open.scob IDENTIFICATION DIVIION PROGRAMID. UBOPEN EXEC QL OPEN cur1 ENDEXEC. (1) (1) 拡張カーソル cur1 をオープンします 3.3 行識別子の使用時の注意事項 ここでは 行識別子の概要と注意事項について説明します 行識別子とは 行識別子 ( 疑似列 ) は データベース中の任意の表の行を一意に識別するためのものです 行識別子名は ROW_ID です 行識別子は 単一行 ELECT 文または FETC 文により取り出すことができます 取り出した行識別子は 探索条件に指定して任意の行を操作するために使用します 行識別子を使用することにより データベース中の単一行を高速に操作することができます また あらかじめ検索した集合の任意の行を一意に識別して操作することができます 例 行識別子を使用して行の更新を行います EXEC QL BEGIN DECLARE ECTION; ROW_ID _RID; EXEC QL END DECLARE ECTION; 125

133 EXEC QL ELECT ROW_ID INTO _RID FROM 在庫管理. 在庫表 WERE 製品番号 = 351; EXEC QL UPDATE 在庫管理. 在庫表 ET 倉庫番号 = 3 WERE ROW_ID = _RID; 行識別子使用時の注意 行識別子を使用する場合の注意事項を 以下に示します 行識別子を使用したアプリケーションのコンパイルでは sqlcc sqlfcc および sqlcobol コマンドに W96 オプションまたは W2000 オプションを指定してください 単一行 ELECT 文やカーソルを使用した FETC 文で取り出した行識別子を QL データ操作文の WERE 句の探索条件に指定する場合 QL データ操作文は 行識別子を取り出した単一行 ELECT 文やカーソルが識別する問合せ式と同じ表を操作する必要があります 取り出した行識別子を 異なる表を操作するデータ操作の探索条件に指定すると 検索データは見つかりません 取り出した行識別子は そのトランザクション内で再検索または更新に使用することができます ただし トランザクションの独立性水準により同一トランザクション内においても 同じデータを検索できなかったり 異なる行を更新してしまうことがあります 独立性水準 ERIALIZABL E REPEATABLE READ READ COMMITTED READ UNCOMMITTE D 同一行の操作 同一行の操作を保証します 同一行の操作を保証します 以下のいずれかの条件で取得した行識別子は 再検索で異なる行を識別することがあります 単一行 ELECT 文 トランザクションアクセスモードが READ ONLY カーソルの更新可能性句が READ ONLY 再検索で異なる行を識別することがあります 取り出した行識別子を 他のトランザクションで再検索または更新に利用すると 同じデータを検索できなかったり 異なる行を更新することがあります このような場合は 行識別子を取り出したときに行のデータも同時に取り出しておき 行識別子を利用して更新する前に 行識別子で再検索して行のデータが他のトランザクションにより変更されていないかどうかを調べる必要があります 事象 検索データなし 前回の検索結果と値が異なる 原因 該当行が 他のトランザクションにより削除または更新されています 他のトランザクションにより行が更新されています 他のトランザクションにより行が削除されたあと 別の行が挿入されています 3.4 ロール使用時の記述方法 権限定義時に利用者に付与したロールは アプリケーションで ET ROLE 文を実行することにより有効になります 126

134 また アプリケーションでは 権限の定義時にデフォルトロールを設定していた場合は 現行セション単位にロールを変更することができます ロールの変更は ET ROLE 文で行います アプリケーションの例を以下に示します EXEC QL CONNECT TO ' 在庫管理 DB' A 'C1' EXEC QL ET ROLE 'TOCK_A2' ; EXEC QL INERT INTO 伝票 ( 在庫カラム, 倉庫カラム ) VALUE(1,2); EXEC QL COMMIT WORK ; EXEC QL DICONNECT 'C1' ; 参照 ET ROLE 文の詳細については QL リファレンス を参照してください 3.5 一時表の使用方法 一時表には アプリケーションのセション内で利用できる表と トランザクション内で利用できる表があります ( 一時表の定義時に 行削除指定によって設定できます ) 一時表を使用する業務が 1 つのトランザクションで構成されている場合は トランザクション内で利用できる一時表を使用します この場合 一時表に格納した行は トランザクション終了時に削除されます 同時に データベーススペースに割り付けた一時表の領域も解放されます また 業務が複数のトランザクションで構成されている場合は セション内で利用できる一時表を使用します この場合 データベーススペースに割り付けた一時表の領域はセション終了時まで保持されます しかし 一時表を使用する処理が完了し 以降の処理で一時表を使用しない場合には 行削除指定で設定した一時表の利用範囲に関係なく データベーススペースに割り付けた一時表の領域を解放することができます 一時表の解放は RELEAE TABLE 文を使用します 一時表を解放する場合は トランザクションが終了している必要があります 月末業務や年度末業務など 定常的に行われない業務で使用した一時表を RELEAE TABLE 文で領域を解放することによって データベーススペースを効率よく利用できます アプリケーション中に 以下の QL 文を記述します EXEC QL RELEAE GLOBAL TEMPORARY TABLE TOCK. 在庫一時表 ; 注意 RELEAE TABLE 文は 動的 QL 文では使用できません 127

135 128

136 第 4 章 ルーチンを利用するアプリケーションの作成 本章では ルーチンを利用するアプリケーションの作成方法について説明します 4.1 プロシジャルーチンを利用する場合 通常のクライアント サーバ間は クライアント側にアプリケーション全体を置き サーバにはデータベースの検索 更新処理だけをさせる形態になっています この場合 クライアントとサーバ間を検索結果などの大量なデータが行き来して 実際のアプリケーションはクライアント側で制御するようになり 大規模なトランザクション開発に適していません このような場合は プロシジャルーチンを利用して サーバ側でアプリケーションを実行することができます クライアント サーバの詳細については 1.2 クライアント サーバモデルの概要 を参照してください 本節では プロシジャルーチンを利用する場合について 以下の項目を説明します プロシジャルーチンとは プロシジャルーチンを利用するアプリケーションの作成の流れ プロシジャルーチンの定義 プロシジャルーチンの実行 プロシジャルーチンの処理結果 プロシジャルーチン利用時のトランザクション プロシジャルーチンとは クライアント側にあるアプリケーションをサーバで実行する形態の場合は クライアントからサーバに QL 文を送信し サーバ側の実行結果をクライアント側で受信して処理を行っています このとき QL 文単位で送信 受信を繰り返すため クライアント側に通信負荷がかかります 大規模なアプリケーション開発の場合 このようなクライアント側の性能限界を解消し 開発 / 保守の生産性を向上させるためにはプロシジャルーチンを利用します プロシジャルーチンとは サーバに登録する処理手続きのことです プロシジャルーチンをサーバに登録しておいて クライアント側からプロシジャルーチンを呼び出し サーバ側で一連のトランザクション処理を実行します プロシジャルーチンとして登録する処理手続きは プロシジャルーチン内で完結する処理が適しています たとえば プロシジャルーチン内でアクセスしたデータを基に別の表を作成する処理などです 以下に プロシジャルーチンを利用する場合のクライアント サーバ間の処理概要を示します 図 4.1 プロシジャルーチンを利用したクライアント サーバ間の処理概要 プロシジャルーチンを利用するアプリケーションの作成の流れ プロシジャルーチンを利用するアプリケーションは 以下の手順で作成します 1. プロシジャルーチンの定義 129

137 2. プロシジャルーチンの実行上記の指定方法を その流れにそって次節以降で説明します 参照 各 QL 文の詳細については QL リファレンス を参照してください プロシジャルーチンの定義 プロシジャルーチンをスキーマに登録するには 以下に示すプロシジャルーチン定義文を使用します CREATE PROCEDURE CM.RNAME ( IN PARA INT) (1) (2) (3) (4) (5) BEGIN DECLARE VAR INT; ET VAR = PARA + 1; INERT INTO CM.TBL(ITEM) VALUE(VAR); END (1) スキーマ名 (2) ルーチン名 (3) パラメタモード (4) パラメタ名 (5) データ型 プロシジャルーチンで定義できる QL 文を QL 手続き文と呼びます プロシジャルーチンは QL 手続き文を組み合わせることで アプリケーションロジックのルーチンの開発を行います QL 手続き文には以下の QL 文があります データ操作文 トランザクション管理文 ( トリガからの呼出し以外 ) COMMIT 文 ROLLBACK 文 QL 制御文 複合文 QL 変数宣言 IF 文 CALL 文 代入文 LOOP 文 WILE 文 REPEAT 文 LEAVE 文 GOTO 文 分岐先文 WENEVER 文 条件宣言 130

138 ハンドラ宣言 IGNAL 文 ( トリガからの呼出し時 ) REIGNAL 文 ( トリガからの呼出し時 ) 参照 QL 制御文の詳細については QL リファレンス を参照してください プロシジャルーチン定義をファイルに作成し サーバ側で rdbddlex コマンドを実行してプロシジャルーチンを登録します rdbddlex コマンドでプロシジャルーチンを定義する場合 注釈を指定することができます 定義ファイルからプロシジャルーチンを登録する例と定義ファイルの例を以下に示します 例 在庫表から 在庫数量が 50 以下の製品に対する発注を 倉庫番号によって営業所別のテーブルに振り分けます [ 定義ファイルからプロシジャルーチンを登録する例 ] rdbddlex d RDBDB x /home/rdb/ddl/ddl.dat 入力ファイル指定 [ 定義ファイル (ddl.dat) の例 ] EXEC QL CREATE PROCEDURE 在庫管理. 営業所別発注処理 (IN 検索キー INT) BEGIN QL 変数宣言 DECLARE 製品番号 V MALLINT; DECLARE 製品名 V NCAR(10); DECLARE 在庫数量 V INT; DECLARE 倉庫番号 V MALLINT; DECLARE 数量 V INT; DECLARE QLTATE CAR(5); カーソル宣言 DECLARE CUR1 CUROR FOR ELECT 製品番号, 製品名, 在庫数量, 倉庫番号 FROM 在庫管理. 在庫表 ; DECLARE CUR2 CUROR FOR ELECT 取引先, 取引製品, 発注数量 FROM 在庫管理. 発注表 ; 検索キーに 1 が指定された場合,CUR1 に対する検索と補充テーブルの INERT を行う. IF 検索キー = 1 TEN OPEN CUR1; LABEL1 データが終了するまでデータを検索する. LOOP FETC CUR1 INTO 製品番号 V, 製品名 V, 在庫数量 V, 倉庫番号 V; IF QLTATE <> '00000' TEN LEAVE LABEL1; END IF; 在庫数量が 50 以下の場合, 補充データの作成を行う. IF 在庫数量 V <= 50 TEN 補充の数量を算出する. 131

139 ET 数量 V = 50 在庫数量 V; 倉庫番号によって発注先のテーブルを変更する. IF 倉庫番号 V = 2 TEN INERT INTO 在庫管理. 営業所 2( 製品番号, 製品名, 数量 ) VALUE( 製品番号 V, 製品名 V, 数量 V); IF QLTATE <> '00000' TEN LEAVE LABEL1; END IF; ELE INERT INTO 在庫管理. 営業所 1( 製品番号, 製品名, 数量 ) VALUE( 製品番号 V, 製品名 V, 数量 V); IF QLTATE <> '00000' TEN LEAVE LABEL1; END IF; END IF; END IF; END LOOP LABEL1; 検索キーに 2 が指定された場合, CUR2 に対する処理を行う. ELEIF 検索キー = 2 TEN OPEN CUR2; END IF; END ENDEXEC; 上記の例の入力ファイル指定が C UER DEFAULT DDL.DAT のような形式になります プロシジャルーチンの実行 サーバ上のスキーマに登録済のプロシジャルーチンを クライアント側から呼び出して実行するには QL 制御文の CALL 文を使用します プロシジャルーチンに引数を指定することで 外部からの入力情報によって処理制御を切り替えることができます CALL 文の引数に NULL 値を設定または返却する場合には 標識変数を指定します プロシジャルーチンを使用したアプリケーションのコンパイルでは sqlcc sqlfcc または sqlcobol コマンドに W95 オプション W96 オプションまたは W2000 オプションを指定してください CALL 文の指定方法には以下に示すように 2 種類があります [ 動的 QL 文 (PREPARE 文 /EXECUTE 文 ) での実行 ] strcpy(ot, "CALL 在庫管理. 営業所別発注処理 (?)"); (1) (2) EXEC QL PREPARE TMID FROM OT; EXEC QL EXECUTE TMID UING INDATA; (3) (1) スキーマ名 (2) ルーチン名 (3) 引数 [ 静的 QL 文での実行 ] EXEC QL CALL 在庫管理. 営業所別発注処理 (INDATA); (1) (2) (3) (1) スキーマ名 (2) ルーチン名 (3) 引数 132

140 図 4.2 ルーチン実行時のクライアントとサーバの関係に [ 定義ファイルからプロシジャルーチンを登録する例 ] に示したプロシジャルーチン定義を実行した場合のクライアントとサーバの関係を示します 図 4.2 ルーチン実行時のクライアントとサーバの関係 一時表を利用してプロシジャルーチンの結果を返却する方法 プロシジャルーチン内の処理で取り出したデータを呼出し側のアプリケーションに返却するには パラメタ変数を利用します しかし 表から抽出した大量のデータを返却する場合 パラメタ変数では実現できません このような場合 一時表を利用することで実現できます 以下に 概要を示します 図 4.3 一時表を利用したプロシジャルーチンとのデータの受渡し (1) アプリケーションからプロシジャルーチン ( 該当者の過去診断情報 ) を呼び出します (2) プロシジャルーチンで抽出されたデータを 一時表 ( 該当者一時表 ) に格納します 133

141 (3) プロシジャルーチンが終了します (4) 一時表に格納されている プロシジャルーチン内での抽出結果を アプリケーションに取り込みます プロシジャルーチン内で抽出した結果を一時表に格納する例を以下に示します CREATE PROCEDURE CM2. 該当者の過去診断情報 ( IN P 年齢範囲 1 MALLINT, IN P 年齢範囲 2 MALLINT, IN P 性別 NCAR(2), IN P 血液型 CAR(5) ) BEGIN DECLARE QLTATE CAR(5); DECLARE QLMG CAR(256); DECLARE 管理番号 INTEGER; 入力された条件に該当する 過去の患者の管理番号を抽出する DECLARE CUR01 CUROR FOR ELECT 管理番号 FROM CM1. 患者管理表 WERE 年齢 BETWEEN P 年齢範囲 1 AND P 年齢範囲 2 AND 性別 = P 性別 AND 血液型 = P 血液型 ; ハンドラ宣言 DECLARE EXIT ANDLER FOR QLEXCEPTION BEGIN ROLLBACK WORK; 例外が発生した場合 ROLLBACKして終了する REIGNAL; 発生した例外事象をCALL 文の結果として通知する END; DECLARE CONTINUE ANDLER FOR NOT FOUND BEGIN END; データなし例外発生時は処理を継続する 最初に初期化 DELETE FROM CM00. 該当者一時表 ; 該当者の管理番号の抽出 OPEN CUR01; LOOP1LOOP FETC CUR01 INTO 管理番号 ; IF (QLTATE = '02000') TEN LEAVE LOOP1; END IF; 該当者の過去の診察情報を取り出して一時表に格納する INERT INTO CM00. 該当者一時表 ELECT 患者名, 診察日, 担当医, 診断結果, 診断詳細, 血圧 FROM CM1. 診察結果管理 WERE 管理番号 = 管理番号 ; END LOOP LOOP1; CLOE CUR01; COMMIT WORK; END 備考. 一時表 該当者一時表 は ON COMMIT PREERVE ROW 指定とします 一時表に格納されている プロシジャルーチン内での抽出結果をアプリケーションで取り出す例を以下に示します #include <stdio.h> EXEC QL BEGIN DECLARE ECTION; short AGE1; short AGE2; char CARACTER ET I NCAR EX[5]; char BLOOD[6]; 134

142 EXEC QL END DECLARE ECTION; int main( ) { EXEC QL WENEVER QLERROR GOTO ERR_END; /* プロシジャルーチンの呼び出し */ AGE1 = 20; AGE2 = 40; strcpy(ex, " 男性 "); strcpy(blood, "A R+"); EXEC QL CALL CM2. 該当者の過去診断情報 (AGE1, AGE2, EX, BLOOD ); /* 一時表のデータを出力する */ EXEC QL DECLARE CUR1 CUROR FOR ELECT * FROM CM00. 該当者一時表 ORDER BY 患者名, 診察日 ; EXEC QL OPEN CUR1; EXEC QL WENEVER NOT FOUND GOTO LOOP_END; for (cnt = 1; ; cnt++) { EXEC QL FETC CUR1 INTO D_NAME, D_DATE, D_DOCTOR, D_DIAGNOE, D_INFO, D_BP; printf("[%d] 患者名 =%s, 診察日 =%s, 担当医 =%s, " " 診断結果 =%s, 診断詳細 =%s, 血圧 =%s n", cnt, D_NAME, D_DATE, D_DOCTOR, D_DIAGNOE, D_INFO, D_BP); } LOOP_END EXEC QL CLOE CUR1; プロシジャルーチンの処理結果 ここでは プロシジャルーチン内での処理結果の確認方法と プロシジャルーチンの呼出し元のアプリケーションでの処理結果の確認方法について説明します プロシジャルーチン内での処理結果の確認 プロシジャルーチン内の QL 手続き文の実行中に 例外コード 40 の例外 ( ロールバック例外 ) が発生した場合は トランザクションをロールバックし 呼出し元のアプリケーションに無条件に復帰します このときの例外事象は呼出し元の QLTATE および QLMG に通知されます プロシジャルーチン内の QL 手続き文の実行中に 例外コード 40 以外の例外が発生した場合は 処理結果はプロシジャルーチン内の QLTATE と QLMG に通知されます 利用者は プロシジャルーチン内に QLTATE および QLMG を QL 変数として宣言しておき その内容を参照することによって例外事象を知ることができます プロシジャルーチン内ではハンドラを使用することができます ハンドラとは プロシジャルーチン実行中に例外が発生した際に実行されるサブルーチンです ハンドラ宣言はどのような例外が発生した場合にどのような動作を行うかを指定します プロシジャルーチン実行中に例外コード 40 以外の例外が発生した際 該当するハンドラが呼び出され 特定の処理を行い プロシジャルーチンの処理を回復することができます 該当するハンドラが存在しなかった場合は ハンドラで処理されなかったとして 発生した例外の QLTATE および QLMG が呼び出し元に返却されます また ハンドラ動作内で新たに例外が発生した場合 ハンドラ動作は終了して 新たに発生した例外の QLTATE および QLMG が呼び出し元に返却されます プロシジャルーチンの呼出し元での処理結果の確認 CALL 文を実行して プロシジャルーチンに記述された一連の処理が中断なく実行された場合 呼出し元の QLTATE および QLMG には正常終了が通知されます 例外によってプロシジャルーチンが実行されない またはプロシジャルーチン内で例外が発生して処理が中断された場合は その例外事象が呼出し元の QLTATE および QLMG に通知されます プロシジャルーチンが実行されない場合とは アクセス規則違反や CALL 文引数とプロシジャルーチンのパラメタ間の代入エラーが発生した場合などがあります プロシジャルーチンの処理が中断される場合とは プロシジャルー 135

143 チン内の QL 手続き文で例外コード 40 の例外 ( ロールバック例外 ) が発生した場合 発生した例外がハンドラで処理されない場合 またはハンドラ動作中に新たに例外が発生した場合です 以下に具体例を示します #include <stdio.h> EXEC QL BEGIN DECLARE ECTION; VARCAR BUF[256]; char QLTATE[6]; (1) char QLMG[256]; long DENPYO; long DCODE; char CNAME[41]; EXEC QL END DECLARE ECTION; main() { memset( QLTATE, 0x00, sizeof(qltate) ); memset( QLMG, 0x00, sizeof(qlmg) ); strcpy( BUF.sqlvar, "CALL スキーマ 00.PCALL000(?,?,?)" ); BUF.sqllen = strlen( BUF.sqlvar ); EXEC QL WENEVER QLERROR GOTO ERR_QL; EXEC QL PREPARE 識別子 FROM BUF; EXEC QL EXECUTE 識別子 UING DENPYO,DCODE,CNAME; (2) EXEC QL COMMIT WORK ; return(0); ERR_QL printf(" プロシジャルーチン実行で異常発生 n"); (3) printf(" エラーコード ===> %s n", QLTATE); printf(" エラーメッセージ ===> %s n", QLMG); ERR_EXIT EXEC QL ROLLBACK ; return(1); } (1) QLTATE QLMG およびプロシジャルーチンのパラメタをホスト変数として宣言します (2) プロシジャルーチン PCALL000 を呼び出します (3) CALL 文の結果がエラーだった場合 QLTATE および QLMG を表示して終了します 136

144 図 4.4 プロシジャルーチン内の処理結果の通知方法 プロシジャルーチン利用時のトランザクション ここでは プロシジャルーチン利用時のトランザクションについて説明します トランザクション制御の詳細については 2.3 トランザクションと排他制御 を参照してください プロシジャルーチンは 呼出し元のアプリケーションと同一トランザクションとして動作します アプリケーションから呼び出されたプロシジャルーチン内でトランザクション管理文 (COMMIT 文または ROLLBACK 文 ) が実行された場合 プロシジャルーチンが実行されているトランザクションを終了します その後 プロシジャルーチン内でトランザクションを開始する QL 文が実行された場合 プロシジャルーチン内で新しいトランザクションが開始されます ( トランザクションモードは前トランザクションと同一です ) 開始されたトランザクションは 呼出し元のアプリケーションにも継続されます ただし 以下のような状態で呼び出されるプロシジャルーチンでは トランザクション管理文の実行はエラーとなります 複数コネクションが接続されているアプリケーションから呼び出されるプロシジャルーチン トランザクションモニタ配下のアプリケーションから呼び出されるプロシジャルーチン また トランザクション管理文を使用するプロシジャルーチンは 以下の状態で呼び出すことはできません RDAV を経由した呼出し プロシジャルーチン内の QL 文の実行でエラーが起きた場合は エラーを起こした QL 文が無効となります ただし QLTATE 値の例外コードが 40 の場合は トランザクションをロールバックします プロシジャルーチンが QLTATE 値の例外コードが 40 以外の状態で終了する場合 プロシジャルーチン内で行われたすべてのデータベース更新は無効となります プロシジャルーチン内での QL 文の実行時には 動作環境ファイルの TRAN_PEC の指定は無効ですが アプリケーションに復帰した後は TRAN_PEC の指定に従って制御されます 137

145 4.2 ファンクションルーチンを利用する場合 本節では ファンクションルーチンを利用する場合について 以下の項目を説明します ファンクションルーチンとは ファンクションルーチンとは 利用者が作成できる関数です ファンクションルーチンは プロシジャルーチンと同様にサーバに登録します ファンクションルーチンの呼出しは QL 文の選択リストや値指定などに指定して実行します ファンクションルーチンを利用することで 利用者は ymfoware/rdb が提供する関数以外に自由に関数を作成し 数値関数 データ列値関数 日時値関数と同様に QL 文中で実行することができます 例 ファンクションルーチンを使用した QL 文の記述例 スキーマ名およびルーチン名は それぞれ 管理 CM 高額購入伝票データ整形 であるとします ELECT 管理 CM. 高額購入伝票データ整形 ( 番号, 製品名, 金額, 発注数 ) FROM 管理 CM. 伝票テーブル WERE 発注数 > 0 AND 金額 >= _YEN ; ymfoware/rdb では ファンクションルーチンは外部ルーチンとして提供しています 外部ルーチンとは 利用者が C 言語などで作成したプログラムを動的リンクライブラリとしてサーバに登録し QL 文から呼び出すものです 外部ルーチンの利点は 文字列型データの整形など QL の関数では限界がある複雑な処理を C 言語などを使用することで容易に行うことができる点です ymfoware/rdb では 外部ルーチンを作成する言語として C 言語を使用できます ファンクションルーチンの処理を行うプログラムは ymfoware/rdb プロセス外のファンクションルーチン専用のプロセスで動作し このプロセスはアプリケーションごとに作成されます ymfoware/rdb プロセス内の QL 文の処理中に レコード単位に引数が通知され ファンクションルーチンの結果値を随時 ymfoware/rdb に返却します ファンクションルーチンを利用するアプリケーションの作成の流れ アプリケーションでファンクションルーチンを利用するには 以下の手順が必要です 1. ファンクションルーチンの定義 2. ライブラリの作成 3. テストドライバの作成 単体テストの実施 138

146 4. ファンクションルーチンの実行それぞれの方法を 次項以降で説明します 参照 各 QL 文の詳細については QL リファレンス を参照してください ファンクションルーチンの定義 ファンクションルーチンをスキーマに登録するには 以下に示すファンクションルーチン定義文を使用します CREATE FUNCTION CM1.UERFUNC001 ( IN CAR(20), IN INTEGER, ) (1) (2) RETURN VARCAR(60) LANGUAGE C NAME UserFunc001 (3) (4) LIBRARY /usr/local/lib/libuserfunc001.so (5) (1) ルーチン名 (2) パラメタ宣言 (3) 戻りデータ型 (4) C プログラムの関数シンボル名 (5) ファンクションルーチンのライブラリ 上記の例のファンクションルーチンのライブラリが D FORYMFO FUNCLIB UERFUNC001.DLL のような形式になります ファンクションルーチン定義をファイルに作成し サーバ側で rdbddlex コマンドを実行してファンクションルーチンを登録します ファンクションルーチンを登録する例と定義ファイルの例を以下に示します rdbddlex d RDBDB /home/rdb/ddl/userfunc001.dat 入力ファイル指定 [ 定義ファイル (userfunc001.dat) の例 ] CREATE FUNCTION CM1.UERFUNC001(IN CAR(20), IN INTEGER, IN INTEGER ) RETURN VARCAR(60) LANGUAGE C NAME 'UserFunc001' LIBRARY '/usr/local/lib/libuserfunc001.so'; 上記の例の入力ファイル指定が D FORYMFO DDL UERFUNC001.DAT のような形式になります 139

147 4.2.4 ライブラリの作成 ymfoware/rdb では ファンクションルーチンは外部ルーチンとして提供しています したがって 利用者が作成したアプリケーションは 動的リンクライブラリとしてサーバに登録します 以下に ファンクションルーチンのライブラリの作成手順について説明します ライブラリとして登録する C プログラムの作成方法 ライブラリとして登録する C プログラムのコンパイル リンク Windows(R) 2000 Windows erver(r) 2003 および Windows erver(r) 2008 でライブラリを作成する場合の注意事項 ライブラリとして登録する C プログラムの作成方法 ここでは ファンクションルーチンのライブラリとして利用者が登録する C プログラムの作成方法について 以下を説明します C プログラムの関数インタフェース ファンクションルーチンのライブラリで使用可能な標準関数 C プログラムの関数インタフェース C プログラムの関数の引数は 以下の順に 2 つの引数を固定で指定します 例 1 1. 引数データのポインタリスト 2. 結果データのポインタリスト ファンクションルーチンのパラメタが 3 個の場合の関数宣言の例 /* 引数データのポインタリスト */ typedef struct in_ptr_list_tag { void *ptr[6]; /* ファンクションのパラメタの個数 2*/ } in_ptr_list_t; /* 結果データのポインタリスト */ typedef struct out_ptr_list_tag { void *ptr[2]; /* 返却データと標識データの格納先 */ } out_ptr_list_t; void UserFunc001(in_ptr_list_t *in_p, /* 引数データのポインタリスト */ out_ptr_list_t *out_p) /* 結果データのポインタリスト */ { 例 2 ファンクションルーチンのパラメタが 10 個の場合の関数宣言の例 /* 引数データのポインタリスト */ typedef struct in_ptr_list_tag { void *ptr[20]; /* ファンクションのパラメタの個数 2 */ } in_ptr_list_t; /* 結果データのポインタリスト */ typedef struct out_ptr_list_tag { void *ptr[2]; /* 返却データと標識データの格納先 */ } out_ptr_list_t; void UserFunc002(in_ptr_list_t *in_p, /* 引数データのポインタリスト */ 140

148 { out_ptr_list_t *out_p) /* 結果データのポインタリスト */ 引数データのポインタリスト ファンクションルーチンの入力パラメタを C プログラムの関数が受け取るには 引数データのポインタリストを利用します 引数データのポインタリストは CREATE FUNCTION 文のパラメタ宣言順に 入力データの格納先アドレスおよび対応する標識データの格納先アドレスが並びます 入力データが NULL 値でない場合は 標識データに 0 が通知されます 入力データが NULL 値の場合は 標識データに負の値が通知され 入力データの値は保証されません 入力データは ファンクションルーチンのパラメタ宣言で指定したデータ型と対応する C 言語のデータ型で表現されます また 標識データは 2 バイト整数型で表現されます パラメタのデータ型と C 言語のデータ型の対応については 付録 K ファンクションルーチンのパラメタのデータ型と対応するデータ形式 を参照してください 結果データのポインタリスト ファンクションルーチンの結果として C プログラムの関数から返却する結果データは 結果データのポインタリストを利用します 結果データのポインタリストには 結果データの格納先アドレスと結果の標識データの格納先アドレスが設定されています C プログラムの関数は 処理終了までに結果データを指定先の領域に格納する必要があります 結果データは CREATE FUNCTION 文で指定した戻りデータ型に対応した形式で設定してください 標識データは 2 バイト整数型で 0 を設定してください 結果を NULL 値として返却する場合は 標識データに負の値を設定してください 標識データが負の値の場合は 結果データは返却されません パラメタのデータ型と C 言語のデータ型の対応については 付録 K ファンクションルーチンのパラメタのデータ型と対応するデータ形式 を参照してください 141

149 ファンクションルーチンのパラメタと C プログラムの関数の引数のインタフェースについて 具体的な使用例を以下に示します 例 ファンクションルーチン UERFUNC001 の定義文 CREATE FUNCTION CM1.UERFUNC001(IN CAR(20), IN INTEGER, IN INTEGER ) RETURN VARCAR(60) LANGUAGE C NAME 'UserFunc001' LIBRARY '/usr/local/lib/libuserfunc001.so'; 例 ファンクションルーチン UERFUNC001 の C プログラム ( プログラム名 userfunc001.c) の作成例 /* compile cc G o libuserfunc001.so userfunc001.c */ /* DEBUG cc G o libuserfunc001.so userfunc001.c DDEBUG */ #include <stdio.h> #include <string.h> /* 引数データのポインタリスト */ typedef struct in_ptr_list_tag { void *ptr[6]; /* ファンクションのパラメタの個数 2 */ } in_ptr_list_t; /* 結果データのポインタリスト */ typedef struct out_ptr_list_tag { void *ptr[2]; /* 返却データと標識データの格納先 */ } out_ptr_list_t; extern void UserFunc001(in_ptr_list_t *in_p, out_ptr_list_t *out_p) { char *c1_data_p, *ret_data_p; int *c2_data_p, *c3_data_p; short *c1_ind_p, *c2_ind_p, *c3_ind_p, *ret_ind_p; char data1[21], ret[61]; int data2, data3; short ind1, ind2, ind3, ret_size; #ifdef DEBUG FILE *fp; #endif #ifdef DEBUG fp = fopen("/usr/local/work/func001.log", "w"); if (fp == NULL) return; fprintf(fp, "UserFunc001 start n"); fflush(fp); #endif /* 入力情報 */ c1_data_p = (char *)in_p>ptr[0]; /* 引数 1 のデータ */ c1_ind_p = (short *)in_p>ptr[1]; /* 引数 1 の標識データ */ c2_data_p = (int *)in_p>ptr[2]; /* 引数 2 のデータ */ c2_ind_p = (short *)in_p>ptr[3]; /* 引数 2 の標識データ */ c3_data_p = (int *)in_p>ptr[4]; /* 引数 3 のデータ */ c3_ind_p = (short *)in_p>ptr[5]; /* 引数 3 の標識データ */ /* 出力情報 */ ret_data_p = (char *)out_p>ptr[0]; /* 結果のデータ格納先 */ 142

150 ret_ind_p = (short *)out_p>ptr[1]; /* 結果の標識データ */ /* 入力データを自動変数に取り出す */ memcpy(data1, c1_data_p, 20); /* 文字列として扱うため終端に NULL 文字設定 */ data1[20] = ' 0'; data2 = *c2_data_p; data3 = *c3_data_p; ind1 = *c1_ind_p; ind2 = *c2_ind_p; ind3 = *c3_ind_p; #ifdef DEBUG fprintf(fp, "UserFunc001 para1=%s, para2=%ld, para3=%ld n", data1, data2, data3); fflush(fp); #endif /* 結果データの作成 */ sprintf(ret, "NAME=%20s, CODE=%ld, AGE=%ld", data1, data2, data3); ret_size = strlen(ret); #ifdef DEBUG fprintf(fp, "UserFunc001 ret=%s n", ret); fflush(fp); #endif /* 指定された結果データの格納先に結果データを書き込む */ memcpy(ret_data_p, &ret_size, sizeof(short)); memcpy((ret_data_p + sizeof(short)), ret, ret_size); *ret_ind_p = 0; #ifdef DEBUG fprintf(fp, "UserFunc001 end n"); fflush(fp); fclose(fp); #endif return; } 上記の例では #ifdef DEBUG~#endif 間にデバッグ用の処理を追加しています 後述のテストドライバと組み合わせることで ymfoware/rdb を介さない単体テストを行うことができます ファンクションルーチンでは fprintf 関数やいくつかの関数の使用を制限していますが 単体テストであれば 上記のように使用することができます コンパイル時にデファイン値 DEBUG を指定してください ymfoware/rdb を介して実行するときは DEBUG を外して再コンパイルしてください 例 ファンクションルーチン UERFUNC001 の定義文 CREATE FUNCTION CM1.UERFUNC001(IN CAR(20), IN INTEGER, IN INTEGER ) RETURN VARCAR(60) LANGUAGE C NAME 'UserFunc001' LIBRARY 'D FORYMFO FUNCLIB UERFUNC001.DLL'; 例 ファンクションルーチン UERFUNC001 の C プログラムの作成例 #include <stdio.h> #include <string.h> 143

151 /* 引数データのポインタリスト */ typedef struct in_ptr_list_tag { void *ptr[6]; /* ファンクションのパラメタの個数 2 */ } in_ptr_list_t; /* 結果データのポインタリスト */ typedef struct out_ptr_list_tag { void *ptr[2]; /* 返却データと標識データの格納先 */ } out_ptr_list_t; extern declspec(dllexport) void UserFunc001(in_ptr_list_t *in_p, out_ptr_list_t *out_p) { char *c1_data_p, *ret_data_p; int *c2_data_p, *c3_data_p; short *c1_ind_p, *c2_ind_p, *c3_ind_p, *ret_ind_p; char data1[21], ret[61]; int data2, data3; short ind1, ind2, ind3, ret_size; #ifdef DEBUG FILE *fp; #endif #ifdef DEBUG fp = fopen("d FORYMFO WORK FUNC001.LOG", "w"); if (fp == NULL) return; fprintf(fp, "UserFunc001 start n"); fflush(fp); #endif /* 入力情報 */ c1_data_p = (char *)in_p>ptr[0]; /* 引数 1 のデータ */ c1_ind_p = (short *)in_p>ptr[1]; /* 引数 1 の標識データ */ c2_data_p = (int *)in_p>ptr[2]; /* 引数 2 のデータ */ c2_ind_p = (short *)in_p>ptr[3]; /* 引数 2 の標識データ */ c3_data_p = (int *)in_p>ptr[4]; /* 引数 3 のデータ */ c3_ind_p = (short *)in_p>ptr[5]; /* 引数 3 の標識データ */ /* 出力情報 */ ret_data_p = (char *)out_p>ptr[0]; /* 結果のデータ格納先 */ ret_ind_p = (short *)out_p>ptr[1]; /* 結果の標識データ */ /* 入力データを自動変数に取り出す */ memcpy(data1, c1_data_p, 20); /* 文字列として扱うため終端に NULL 文字設定 */ data1[20] = ' 0'; data2 = *c2_data_p; data3 = *c3_data_p; ind1 = *c1_ind_p; ind2 = *c2_ind_p; ind3 = *c3_ind_p; #ifdef DEBUG fprintf(fp, "UserFunc001 para1=%s, para2=%ld, para3=%ld n", data1, data2, data3); fflush(fp); #endif /* 結果データの作成 */ sprintf(ret, "NAME=%20s, CODE=%ld, AGE=%ld", data1, data2, data3); ret_size = strlen(ret); #ifdef DEBUG fprintf(fp, "UserFunc001 ret=%s n", ret); fflush(fp); 144

152 #endif /* 指定された結果データの格納先に結果データを書き込む */ memcpy(ret_data_p, &ret_size, sizeof(short)); memcpy((ret_data_p + sizeof(short)), ret, ret_size); *ret_ind_p = 0; #ifdef DEBUG fprintf(fp, "UserFunc001 end n"); fflush(fp); fclose(fp); #endif return; } 上記の例では #ifdef DEBUG~#endif 間にデバッグ用の処理を追加しています 後述のテストドライバと組み合わせることで ymfoware/rdb を介さない単体テストを行うことができます ファンクションルーチンでは fprintf 関数やいくつかの関数の使用を制限していますが 単体テストであれば 上記のように使用することができます コンパイル時にデファイン値 DEBUG を指定してください ymfoware/rdb を介して実行するときは DEBUG を外して再コンパイルしてください ファンクションルーチンのライブラリで使用可能な標準関数 ファンクションルーチンのライブラリで使用可能な C 言語の標準関数について 以下に示します 使用不可の関数を使用した際の動作は保証されません また プログラム中に QL 文を記述することはできません 表 4.1 使用可能な C 言語の標準関数 関数の種別 文字列関数 算術関数 メモリ制御関数 インクルードファイル 関数名 string.h strcat,strncat,strcmp,strncmp,strcpy,strncpy,strlen stdlib.h atof,atoi,atol stdlib.h abs,rand,srand math.h acos,asin,atan,cos,exp,log,sin,tan,sqrt stdlib.h malloc,free,realloc 時間関数 time.h asctime,ctime,gmtime,localtime,time 標準入出力関数 低水準入出力関数 ファイル操作関数 プロセス制御関数 stdio.h sprintf fgets,gets,fputs,puts,fgetc,getc,fputc,putc, printf,fprintf,scanf,fscanf,sscanf,fflush, fopen,fwrite,fread,fclose,fseek,feof,ferror fcntl.h open,creat unistd.h close,lseek,read,write unistd.h chdir,rmdir stdio.h rename stdlib.h abort unistd.h fork,execl,execv,execle,execve,execvp signal.h signal wait.h wait その他の関数 *.h getenv,putenv,... 使用可能 使用不可 使用の可否 145

153 ライブラリとして登録する C プログラムのコンパイル リンク ファンクションルーチンのライブラリは 動的リンクライブラリとして作成します 動的モードを指定して共有オブジェクトを作成します cc KPIC G o < ライブラリ名 > < ソースファイル名 >... 作成したライブラリは ファンクションルーチン定義文の LIBRARY 句で指定するディレクトリに格納してください 例 cc KPIC G o /usr/local/lib/libuserfunc001.so userfunc001.c QLignalMG 関数を使用する場合は ライブラリ libsqlsigm.so を動的結合する必要があります また インクルードファイル sqlsigm.h をインクルードする必要があります 例 cc KPIC G o /usr/local/lib/libuserfunc001.so L/opt/FUNrdb2b/lib lsqlsigm I/opt/FUNrdb2b/include (1) (2) (3) userfunc001.c (1) RDBライブラリパス指定 (2) RDBライブラリ名 (3) RDBインクルードパス指定動的モードを指定して共有オブジェクトを作成します gcc fpic shared o < ライブラリ名 > < ソースファイル名 >... 作成したライブラリは ファンクションルーチン定義文の LIBRARY 句で指定するディレクトリに格納してください 例 gcc fpic shared o /usr/local/lib/libuserfunc001.so userfunc001.c QLignalMG 関数を使用する場合は ライブラリ libsqlsigm.so を動的結合する必要があります また インクルードファイル sqlsigm.h をインクルードする必要があります 例 gcc fpic shared o /usr/local/lib/libuserfunc001.so L/opt/FJVrdb2b/lib lsqlsigm I/opt/FJVrdb2b/include (1) (2) (3) userfunc001.c (1) RDB ライブラリパス指定 (2) RDB ライブラリ名 (3) RDB インクルードパス指定 DynamicLink Library(DLL) を作成します DLL の対象プラットフォームは サーバが動作するプラットフォームと同じにします Itanium 版 64 ビット EE または Itanium 版 146

154 64 ビット E の場合は Itanium x64 版 64 ビット EE または x64 版 64 ビット E の場合は x64 それ以外の場合は Win32 を対象プラットフォームとして DLL を作成します Microsoft(R) Visual tudio での作成手順の例を以下に示します 1. [ ファイル (F)] メニューから [ 新規作成 (N)] で [ プロジェクト (P)] を選択します 2. [ 新しいプロジェクト ] ウインドウにて [ プロジェクトの種類 (P)] で [Visual C++] の [Win32] を選択し [ テンプレート (T)] で [Win32 プロジェクト ] を選択します 3. [ 新しいプロジェクト ] ウインドウにて [ プロジェクト名 (N)] を指定し [ 場所 (L)] にライブラリ作成場所を指定します [ ソリューションのディレクトリを作成 (D)] のチェックボックスのチェックを外します [OK] を選択します 例 プロジェクト名 = UERFUNC001 位置 = D FORYMFO FUNCMAKE UERFUNC001 指定した位置に 作成した C プログラムファイルを格納しておきます ファンクションルーチンのライブラリ内で QLignalMG 関数を使用する場合は インクルードファイル sqlsigm.h をインクルードする必要があります このインクルードファイルは < サーバ機能のインストール先 > EQL INCLUDE または < クライアント機能のインストール先 > EQL INCLUDE に格納されています 4. [Win32 アプリケーションウィザード ] ウインドウの [Win32 アプリケーションウィザードへようこそ ] の画面にて [ 次へ >] を選択します 5. [Win32 アプリケーションウィザード ] ウインドウの [ アプリケーションの設定 ] の画面にて [ アプリケーションの種類 ] で [DLL] を選択します [ 追加オプション ] で [ 空のプロジェクト (E) ] のチェックボックスをチェックします [ 完了 ] を選択します 6. Itanium 版 64 ビット EE Itanium 版 64 ビット E x64 版 64 ビット EE または x64 版 64 ビット E の場合 事前に Visual tudio のプロジェクト設定で 64 ビットのプロジェクトを作成しておく必要があります [ ビルド (B)] の [ 構成マネージャ (O)...] から [ 構成マネージャ ] ウィンドウを開きます [ プロジェクトのコンテキスト ( ビルドまたは配置するプロジェクト構成をチェック )(R)] の [ プラットフォーム ] のプルダウンから < 新規作成...> を選択します [ 新しいプロジェクトプラットフォーム ] ウィンドウを開きます Itanium 版 64 ビット EE または Itanium 版 64 ビット E の場合 [ 新しいプラットフォーム (P)] のプルダウンから Itanium を選択し [OK] をクリックします x64 版 64 ビット EE または x64 版 64 ビット E の場合 [ 新しいプラットフォーム (P)] のプルダウンから x64 を選択し [OK] をクリックします その際 [ 構成マネージャ ] の [ アクティブソリューションプラットフォーム (P)] のプルダウンと [ プロジェクトのコンテキスト ( ビルドまたは配置するプロジェクト構成をチェック )(R)] の [ プラットフォーム ] で 目的のプラットフォームが選択されていることを確認します 確認ができたら [ 構成マネージャ ] の [ 閉じる ] をクリックします 7. [ プロジェクト (P)] の [ 既存項目の追加 (G)] から 作成した C プログラムファイルをプロジェクトに追加します 例 D FORYMFO FUNCMAKE UERFUNC001 UERFUNC001.C 8. ファンクションルーチンのライブラリ内で QLignalMG 関数を使用する場合は インクルードディレクトリに ymfoware erver の INCLUDE ディレクトリを追加し サーバのプラットフォームに対応した以下のライブラリをリンクする必要があります Itanium 版 64 ビット EE または Itanium 版 64 ビット E の場合リンクするライブラリ f3cwsqlsigm_ia64.lib x64 版 64 ビット EE または x64 版 64 ビット E の場合リンクするライブラリ f3cwsqlsigm_x64.lib 147

155 上記以外の場合リンクするライブラリ f3cwsqlsigm.lib 1. インクルードパスを設定します [ プロジェクト (P)] の [ プロパティ (P)] から [ プロパティ ] ウィンドウを開きます [ 構成プロパティ ] を選択し [ 構成 (C)] のプルダウンから すべての構成 [ プラットフォーム (P)] のプルダウンから すべてのプラットフォーム を選択します [ 構成プロパティ ] の [C/C++] で [ 全般 ] の [ 追加のインクルードディレクトリ ] に < サーバ機能のインストール先 > EQL INCLUDE または < クライアント機能のインストール先 > EQL INCLUDE を追加し [OK] をクリックします 2. ライブラリを設定します [ プロジェクト (P)] の [ 既存項目の追加 (G)] から 使用するライブラリをプロジェクトに追加します 9. [ ビルド (B)] から [ ソリューションのビルド (B)] を選択して ライブラリを作成します 10. 作成したライブラリを ファンクションルーチン定義文の LIBRARY 句で指定するディレクトリに格納します 例 D FORYMFO FUNCMAKE UERFUNC001 RELEAE UERFUNC001.DLL 複写 D FORYMFO FUNCLIB UERFUNC001.DLL ライブラリを作成する場合の注意事項 ファンクションルーチンのライブラリとして作成する C プログラムの関数は エクスポート関数にしておく必要があります エクスポート関数の宣言は declspec(dllexport) を指定します 例 dllexport を指定した関数の宣言 /* 引数データのポインタリスト */ typedef struct in_ptr_list_tag { void *ptr[6]; /* ファンクションのパラメタの個数 2*/ } in_ptr_list_t; /* 結果データのポインタリスト */ typedef struct out_ptr_list_tag { void *ptr[2]; /* 返却データと標識データの格納先 */ } out_ptr_list_t; /* 関数宣言 */ extern declspec(dllexport) void UserFunc001(in_ptr_list_t *in_p, /* 引数データのポインタリスト */ out_ptr_list_t *out_p) /* 結果データのポインタリスト */ { ファンクションルーチンの実行 関数として定義したファンクションルーチンを実行するには QL 文の選択リストや値指定などに指定して実行します ファンクションルーチンを呼び出すアプリケーションのコンパイル リンクでは sqlcc sqlfcc sqlpcob コマンドに W2000 オプションを指定してください 以下に QL 文の記述例を示します 例 スキーマ名およびルーチン名は それぞれ CM1 UERFUNC001 であるとします ELECT CM1.UERFUNC001(NAME, CODE, AGE) FROM CM1.CUTOMER WERE AGE BETWEEN AGE1 AND AGE2 ; 148

156 ファンクションルーチンは ymfoware/rdb から新たに起動されるプロセスで実行されます ファンクションルーチンが動作するプロセスの実効ユーザ ID は RDB システム内で 1 つを指定します 実効ユーザ ID の指定は システム用の動作環境ファイルの実行パラメタ EXTERNAL_PROCE_UER で行います 参照 システム用の動作環境ファイルの実行パラメタについては セットアップガイド を参照してください ファンクションルーチンを実行するプロセスが異常終了した場合の注意事項 ファンクションルーチンを実行するプロセスが何らかの原因で異常終了した場合 以下のエラーメッセージが出力されます コンソールおよび RDBREPORT で指定したメッセージログファイルに 以下のエラーメッセージが出力されます Tue Apr rdb INFO qdg13783i ファンクショルーチンを実行したプロセスのコアファイルを採取しましたコアファイル名は /usr/local/rdb1/rdbcore/core_fnc_ です ( システム名 =rdb1) Tue Apr rdb ERROR qdg13781u ファンクションルーチンを実行するプロセスが異常終了しました原因 =signal number 11 ( システム名 =rdb1) Tue Apr rdb ERROR qdg13782u ファンクションルーチンのライブラリ内で異常が発生しました ( システム名 =rdb1) ( 注 ) 注 ) qdg13782u のメッセージが出力された場合は ファンクションルーチンのライブラリ内で 何らかの原因で異常が発生したことを示します メッセージに示された原因の情報をもとに 異常終了した原因を調査してください イベントログおよび RDBREPORT で指定したメッセージログファイルに 以下のエラーメッセージが出力されます qdg13783i ファンクショルーチンを実行したプロセスのコアファイルを採取しましたコアファイル名は core_fnc_ です ( システム名 =RDB1) qdg13781u ファンクションルーチンを実行するプロセスが異常終了しました原因 =exception code 0xc ( システム名 =RDB1) qdg13782u ファンクションルーチンのライブラリ内で異常が発生しました ( システム名 =RDB1) ( 注 ) 注 ) qdg13782u のメッセージが出力された場合は ファンクションルーチンのライブラリ内で 何らかの原因で異常が発生したことを示します メッセージに示された原因の情報をもとに 異常終了した原因を調査してください ファンクションルーチンからの異常通知 ここでは ファンクションルーチンからの異常通知について説明します C プログラムの処理において 入力データの内容が異常だったときなど ファンクションルーチンの実行結果をエラーにしたい場合があります このような場合 QLignalMG 関数を使用することで 利用者定義の例外を ymfoware/rdb に送信し ファンクションルーチンを呼び出した QL 文をエラーにすることができます [ 記述形式 ] 149

157 void QLignalMG(char *msg_p) msg_p 例外メッセージ格納先アドレス 検出した事象を設定した QLignalMG 関数を実行後 プログラムから ymfoware/rdb に復帰すると QL 文の実行結果はエラーとなり 以下のメッセージが通知されます 通知される例外メッセージの長さは 256 バイトまでです それ以上は切り捨てとなります JYP4557E ファンクションルーチン から例外が送信されました. 例外メッセージ [ 状態コード ] [ メッセージの意味 ] ファンクションルーチン実行中に例外が発生しました [ パラメタの意味 C 例外メッセージ QLignalMG 関数を使用する場合 以下のファイルをインクルードします また ライブラリ作成時に以下のライブラリをリンクする必要があります インクルードするファイル /opt/funrdb2b/include/sqlsigm.h リンクするライブラリ /opt/funrdb2b/lib/libsqlsigm.so インクルードするファイル /opt/fjvrdb2b/include/sqlsigm.h リンクするライブラリ /opt/fjvrdb2b/lib/libsqlsigm.so インクルードするファイル sqlsigm.h インクルードするファイルは < サーバ機能のインストール先 > EQL INCLUDE または < クライアント機能のインストール先 > EQL INCLUDE に格納されています リンクするライブラリ Itanium 版 64 ビット EE または Itanium 版 64 ビット E の場合リンクするライブラリ f3cwsqlsigm_ia64.lib x64 版 64 ビット EE または x64 版 64 ビット E の場合リンクするライブラリ f3cwsqlsigm_x64.lib 上記以外の場合リンクするライブラリ f3cwsqlsigm.lib リンクするライブラリは < サーバ機能のインストール先 > EQL LIB または < クライアント機能のインストール先 > EQL LIB に格納されています 詳細は ライブラリとして登録する C プログラムのコンパイル リンク を参照してください ファンクションルーチンから異常通知する場合のプログラミング例および出力されるエラーメッセージの例を以下に示します ファンクションルーチンは UERFUNC002 C プログラムの関数シンボル名は UserFunc002 であるとします 例 ファンクションルーチンから異常通知する場合のプログラミング例 /**/ /* ファンクションルーチン "UERFUNC002" の C プログラム */ /**/ #include <stdio.h> #include <string.h> #include "sqlsigm.h" /* QLignalMG 関数宣言 */ 150

158 /* 引数データのポインタリスト */ typedef struct in_ptr_list_tag { void *ptr[2]; /* ファンクションのパラメタの個数 2 */ } in_ptr_list_t; /* 結果データのポインタリスト */ typedef struct out_ptr_list_tag { void *ptr[2]; /* 返却データと標識データの格納先 */ } out_ptr_list_t; extern void UserFunc002(in_ptr_list_t *in_p, out_ptr_list_t *out_p) { char *ret_data_p; int *c1_data_p; short *c1_ind_p, *ret_ind_p; char ret[41]; int data1; short ind1, ret_size; /* 入力情報 */ c1_data_p = (int *)in_p>ptr[0]; /* 引数 1のデータ */ c1_ind_p = (short *)in_p>ptr[1]; /* 引数 1の標識データ */ /* 出力情報 */ ret_data_p = (char *)out_p>ptr[0]; /* 結果のデータ */ ret_ind_p = (short *)out_p>ptr[1]; /* 結果の標識データ */ /* 入力データを自動変数に取り出す */ data1 = *c1_data_p; ind1 = *c1_ind_p; if (data1 < 0) { QLignalMG(" 引数 1 が負の値です "); return; } } /* 結果データの作成 */ sprintf(ret, "TETCODE=%ld", data1); ret_size = strlen(ret); /* 指定された結果データの格納先に結果データを書き込む */ memcpy(ret_data_p, &ret_size, sizeof(short)); memcpy((ret_data_p + sizeof(short)), ret, ret_size); *ret_ind_p = 0; return; 例 出力されるエラーメッセージの例 ELECT CM1.UERFUNC002(CODE) FROM CM1.CUTOMER WERE AGE > 40; <QL 文の実行結果 > QLTATE = QLMG = JYP4557Eファンクションルーチン "UserFunc002" から例外が送信されました. 例外メッセージ =" 引数 1が負の値です " 151

159 4.2.7 テストドライバの作成および単体テストの実施 作成したファンクションルーチンは ymfoware/rdb を介して実行する前に テストドライバを利用して単体テストを行い 十分な品質を確保しておく必要があります テストドライバが直接ファンクションルーチンのライブラリを呼び出すことで ymfoware/rdb を介さずに単体テストを行うことができます また QLignalMG 関数を使用してファンクションルーチンから異常通知するプログラムを作成した場合の単体テストは ダミーの QLignalMG 関数を用意し ymfoware/rdb を介さずにテストを行う必要があります UNIX 系の場合 (1) ファンクションルーチンのライブラリ作成 (2) テストドライバの実行形式作成 (3) ダミー QLignalMG 関数のライブラリ作成 (4) リンクするライブラリの設定 (5) リンクするライブラリの再設定ファンクションルーチンのライブラリ作成ファンクションルーチンのライブラリを作成します ライブラリ作成についての詳細は ライブラリの作成 を参照してください 以下にファンクションルーチンのライブラリ作成例を示します 例ファンクションルーチンのライブラリ作成例 cc G o /usr/local/lib/libuserfunc001.so userfunc001.c mt 例 ファンクションルーチンのライブラリ作成例 gcc shared o /usr/local/lib/libuserfunc001.so userfunc001.c D_REENTRANT 152

160 テストドライバの実行形式作成 ファンクションルーチンをテストするためのテストドライバの実行形式を作成します テストドライバのプログラム例およびテストドライバ実行形式の作成例を以下に示します 例 ファンクションルーチン UERFUNC002 用テストドライバ (ftestdrv001.c) のプログラム例 /**/ /* ファンクションルーチン "UERFUNC002" 用テストドライバ */ /**/ #include <stdio.h> #include <stdlib.h> #ifdef NT #include <windows.h> #else #include <dlfcn.h> #endif /* 引数データのポインタリスト */ typedef struct in_ptr_list_tag { void *ptr[2]; /* ファンクションのパラメタの個数 2 */ } in_ptr_list_t; /* 結果データのポインタリスト */ typedef struct out_ptr_list_tag { void *ptr[2]; /* 返却データと標識データの格納先 */ } out_ptr_list_t; /* 呼び出し関数名 */ #define FUNC_NAME "UserFunc002" /* ライブラリのパス */ #ifdef NT #define FUNC_PAT "D FORYMFO FUNCLIB UERFUNC002.DLL" #else #define FUNC_PAT "/export/home/kanda/function/libuserfunc002.so" #endif int main() { void *handle_p; /* dlopenのハンドラ */ void (*sym_p)(); /* アドレスベクタ */ int data1; /* 引数 1データ格納用 */ short ind1; /* 引数 1 標識データ格納 */ char ret[43]; /* 結果データ格納用 */ short r_ind; /* 結果の標識データ格納用 */ short ret_size; /* 結果データの実データ長 */ char buf[41]; /* 結果データ表示用 */ /* 入出力のポインタリスト */ in_ptr_list_t in_ptr_list; out_ptr_list_t out_ptr_list; #ifdef NT printf("drv002loadlibrary start n"); /* ファンクションルーチンのライブラリをオープン */ handle_p = LoadLibrary(FUNC_PAT); #else printf("drv002dlopen start n"); /* ファンクションルーチンのライブラリをオープン */ handle_p = dlopen(func_pat, RTLD_NOW); #endif 153

161 if (handle_p == NULL) { return(1); } #ifdef NT printf("drv002getprocaddress start n"); /* ライブラリの入口アドレスの取得 */ sym_p = (void (*)())GetProcAddress(handle_p, FUNC_NAME); if (sym_p == NULL) { FreeLibrary(handle_p); return(2); } #else printf("drv002dlsym start n"); /* ライブラリの入口アドレスの取得 */ sym_p = (void (*)())dlsym(handle_p, FUNC_NAME); /* ライブラリの入口アドレスの取得 */ sym_p = (void (*)())dlsym(handle_p, FUNC_NAME); if (sym_p == NULL) { dlclose(handle_p); return(2); } #endif printf("drv002make indata n"); /* 入力データの作成 */ data1 = 100; /* 負の値 */ ind1 = 0; in_ptr_list.ptr[0] = &data1; /* 引数 1のデータ */ in_ptr_list.ptr[1] = &ind1; /* 引数 1の標識データ */ printf("drv002make outdata area n"); /* 結果データ格納先の準備 */ memset(ret, 0x00, sizeof(ret)); r_ind = 1; out_ptr_list.ptr[0] = ret; /* 結果データ格納先 */ out_ptr_list.ptr[1] = &r_ind; /* 結果標識データ格納先 */ /* ファンクションルーチンの呼び出し */ printf("drv002call func n"); (*sym_p)(&in_ptr_list, &out_ptr_list); printf("drv002call func end n"); if (r_ind < 0) { /* NULL 値 */ printf("drv002ret = NULL n"); } else { /* VARCAR データ長の取り出し */ memcpy(&ret_size, ret, sizeof(short)); printf("drv002ret_size=%d n", ret_size); /* VARCAR データの取り出し */ memset(buf, 0x00, sizeof(buf)); memcpy(buf, ret + sizeof(short), ret_size); printf("drv002return value = %s n", buf); } /* ライブラリのクローズ */ #ifdef NT FreeLibrary(handle_p); #else dlclose(handle_p); 154

162 #endif printf("drv002end n"); return(0); } 例 テストドライバ実行形式 (ftestdrv001) の作成例 cc o ftestdrv001 ftestdrv001.c ldl 例 テストドライバ実行形式 (ftestdrv001) の作成例 gcc o ftestdrv001 ftestdrv001.c ldl ダミー QLignalMG 関数のライブラリ作成 ファンクションルーチンから異常通知する場合のテストで使用するダミー QLignalMG 関数のライブラリを作成します ダミー QLignalMG 関数のプログラム例およびダミー QLignalMG 関数のライブラリ作成例を以下に示します 例 ダミー QLignalMG 関数 QLignalMG (fdummymsg.c) のプログラム例 /**/ /* QLignalMG 関数のダミープログラム */ /**/ #include <stdio.h> #include <string.h> #define MG1 "JYP4557E ファンクションルーチン %s から例外が送信されました. 例外メッセージ = %s " void QLignalMG(char *msg_p) { char msg_data[1024]; memset(msg_data,0x00,sizeof(msg_data)); sprintf(msg_data,mg1,"testfunction",msg_p); /* QLTATE 出力 */ printf("qltate = n"); /* QLMG 出力 */ printf("qlmg = %s n",msg_data); return; } 例 ダミー QLignalMG 関数のライブラリ作成例 cc G o /usr/local2/lib/libsqlsigm.so fdummymsg.c 例 ダミー QLignalMG 関数のライブラリ作成例 gcc shared o /usr/local/lib/libsqlsigm.so fdummymsg.c リンクするライブラリの設定 単体テストを実行するために ダミー QLignalMG 関数のライブラリおよびファンクションルーチンのライブラリを LD_LIBRARY_PAT に設定します 155

163 以下に 2 つのライブラリの設定例を示します 例 ダミー QLignalMG 関数のライブラリおよびファンクションルーチンのライブラリの設定例 setenv LD_LIBRARY_PAT /usr/local2/lib/usr/local/lib (1) (2) (1) ダミー QLignalMG 関数のライブラリ (2) ファンクションルーチンのライブラリ リンクするライブラリの再設定 単体テストの終了後は ダミー QLignalMG 関数のライブラリを LD_LIBRARY_PAT から外し ymfoware/rdb の QLignalMG 関数のライブラリを LD_LIBRARY_PAT に設定する必要があります 以下に ライブラリの再設定例を示します 例 ライブラリの再設定例 setenv LD_LIBRARY_PAT /usr/local/lib/opt/funrdb2b/lib (1) (2) (1) ファンクションルーチンのライブラリ (2) ymfoware/rdb の QLignalMG 関数ライブラリ 参考 テストドライバの実行例 drv002 dlopen start drv002 dlsym start drv002make indata drv002make outdata area drv002call func QLTATE = QLMG = JYP4557E ファンクションルーチン TestFunction から例外が送信されました. 例外メッセージ = 引数 1が負の値です drv002call func end drv002ret = NULL drv002end 156

164 Windows(R) 2000 Windows erver(r) 2003 および Windows erver(r) 2008 の場合 (1) ファンクションルーチンのライブラリ作成 (2) テストドライバの実行形式作成 (3) ダミー QLignalMG 関数のライブラリ作成 (4) リンクするライブラリの再設定 ファンクションルーチンのライブラリ作成 ファンクションルーチンのライブラリを作成します ライブラリ作成についての詳細は ライブラリの作成 を参照してください テストドライバの実行形式作成 ファンクションルーチンをテストするためのテストドライバの実行形式を作成します テストドライバのプログラム例については UNIX 系の場合を参照してください 以下にテストドライバ実行形式の作成例を示します 例 テストドライバ実行形式 (ftestdrv001) の作成例 cl ftestdrv001.c /Feftestdrv001 DNT ダミー QLignalMG 関数のライブラリ作成 ファンクションルーチンから異常通知する場合のテストで使用するダミー QLignalMG 関数のライブラリを作成します ダミー QLignalMG 関数のプログラム例については UNIX 系の場合を参照してください ダミー QLignalMG 関数のライブラリ作成例として Microsoft(R) Visual tudio における tatic Library の作成例を以下に示します 1. [ ファイル (F)] メニューから [ 新規作成 (N)] で [ プロジェクト (P)] を選択します 2. [ 新しいプロジェクト ] ウインドウにて [ プロジェクトの種類 (P)] で [Visual C++] の [Win32] を選択し [ テンプレート (T)] で [Win32 プロジェクト ] を選択します 157

165 3. [ 新しいプロジェクト ] ウインドウにて [ プロジェクト名 (N)] を指定し [ 場所 (L)] にライブラリ作成場所を指定します [ ソリューションのディレクトリを作成 (D)] のチェックボックスのチェックを外します [OK] を選択します 例 プロジェクト名 = F3CWQLIGM 位置 = D FORYMFO FUNCMAKE F3CWQLIGM 指定した位置に 作成した C プログラムファイルを格納しておきます 4. [Win32 アプリケーションウィザード ] ウインドウの [Win32 アプリケーションウィザードへようこそ ] の画面にて [ 次へ >] を選択します 5. [Win32 アプリケーションウィザード ] ウインドウの [ アプリケーションの設定 ] の画面にて [ アプリケーションの種類 ] で [ スタティックライブラリ ()] を選択します [ 追加オプション ] で [ プリコンパイル済みヘッダー (P)] のチェックボックスのチェックを外します [ 完了 ] を選択します 6. [ プロジェクト (P)] の [ 既存項目の追加 (G)] から 作成した C プログラムファイルをプロジェクトに追加します 例 D FORYMFO FUNCMAKE F3CWQLIGM FDUMMYMG.C 7. [ ビルド (B)] から [ ソリューションのビルド (B)] を選択して ライブラリを作成します リンクするライブラリの再設定 単体テストの終了後は ダミー QLignalMG 関数のライブラリの設定を外し ymfoware/rdb の QLignalMG 関数のライブラリを設定する必要があります Microsoft(R) Visual tudio におけるライブラリの再設定例を以下に示します 1. [ ファイル (F)] メニューから [ 開く (O)] で [ プロジェクト / ソリューション (P)] を選択しファンクションルーチンのライブラリを指定します 例 ファイル場所 = D FORYMFO FUNCMAKE UERFUNC001 ファイル名 = UERFUNC001.sln 2. ファンクションルーチンのライブラリ内で使用したダミー QLignalMG 関数の設定を外し ymfoware/rdb の QLignalMG 関数のライブラリを設定します 1. [ ツール (T)] から [ オプション (O)] を選択し [ プロジェクトおよびソリューション ] の [VC++ ディレクトリ ] を開きます 2. [ ディレクトリを表示するプロジェクト ()] に ライブラリファイル を選択して [ ディレクトリ ] にダミー QLignalMG 関数のライブラリが存在する場合は指定を外し < サーバ機能のインストール先 > EQL LIB または < クライアント機能のインストール先 > EQL LIB の指定を追加します なお ライブラリの対象プラットフォームは サーバが動作するプラットフォームと同じにします 3. [ ビルド (B)] から [ ソリューションのリビルド (R)] を選択して ライブラリを再作成します 4. 作成したライブラリを ファンクションルーチン定義文の LIBRARY 句で指定するディレクトリに格納します 例 D FORYMFO FUNCMAKE UERFUNC001 RELEAE UERFUNC001.DLL 複写 D FORYMFO FUNCLIB UERFUNC001.DLL 参考 テストドライバの実行例 drv002 LoadLibrary start drv002 GetProcAddress start 158

166 drv002make indata drv002make outdata area drv002call func QLTATE = QLMG = JYP4557E ファンクションルーチン "TestFunction" から例外が送信されました. 例外メッセージ =" 引数 1が負の値です " drv002call func end drv002ret = NULL drv002end 159

167 第 5 章 アプリケーションのコンパイル リンク 本章では アプリケーションのコンパイル リンク作業について説明しています 5.1 UNIX 系を使用した場合のアプリケーションのコンパイル リンク UNIX 系を使用した場合のアプリケーションのコンパイル リンクについて説明します アプリケーションのコンパイル リンクの流れ アプリケーションのコーディングが完了すると これをコンパイルおよびリンクしてロードモジュールを作成します ここでは アプリケーションをコンパイルおよびリンクする作業について説明します アプリケーションのコンパイル リンクの概要を以下に示します 図 5.1 アプリケーションのコンパイル リンクの概要 QL 文を使用するアプリケーションでは コンパイル リンクによりアプリケーションのロードモジュールを作成します アプリケーションのロードモジュールは 通常のプログラムと同じ形式のロードモジュールです 以後 アプリケーションのロードモジュールを 単にロードモジュールと呼びます コンパイル リンクのための環境設定 アプリケーションをコンパイル リンクするためには 作業に先立って必要な環境を設定しておく必要があります 設定すべき環境には 以下のものがあります 環境変数の設定 作業用のディレクトリ構成 環境変数の設定 アプリケーションをコンパイル リンクするために必要な環境変数を以下に示します 160

168 表 5.1 アプリケーションをコンパイル リンクする場合に必要な環境変数 環境変数名 意味 アプリケーションのロケールを指定します アプリケーションの言語や文字コード系に何を使いたいかによってロケールを決めます ロケールは具体的には 以下に影響を与えます アプリケーションのソースコード アプリケーションの入出力ファイル クライアント用の動作環境ファイル QL メッセージ (QLMG) LANG( 必須項目 ) QL メッセージは 以下の環境変数の強度にしたがってロケールが決まります ( 強い )LC_ALL > LC_MEAGE > LANG( 弱い ) ymfoware/rdb は ロケールの言語が ja で始まる場合は日本語のメッセージを出力し それ以外のロケール (C ロケールなど ) の場合は英語でメッセージを出力します 環境変数 LANG の設定の例を以下に示します [C シェルの場合 ] setenv LANG ja [bash B シェル K シェルの場合 ] LANG=ja; export LANG アプリケーションのロケールと文字コード系の関係を示します 表 5.2 アプリケーションのロケールと文字コード系の関係 対象 O 文字コード系ロケール olaris EUC コード ja シフト JI コード UNICODE ja_jp.pck ja_jp.utf8 Linux UNICODE ja_jp.utf8 備考 ) メッセージを英語で出力したい場合は ロケールに C を指定してください その際の文字コード系の指定については 文字コード系の決定 を参照してください アプリケーションをコンパイルするときに必要に応じて設定する環境変数を以下に示します これらの環境変数を設定しておくことにより コンパイル時に sqlcc sqlfcc または sqlcobol でオプションを指定する必要がなくなります 表 5.3 アプリケーションをコンパイル リンクする場合に必要に応じて設定する環境変数 環境変数名 意味 アプリケーションで指定するデータベース名を指定します 環境変数 RDBDB の設定の例を以下に示します RDBDB [C シェルの場合 ] setenv RDBDB DB1 [bash B シェル K シェルの場合 ] RDBDB=DB1; export RDBDB QLPC (C プログラム時 ) コンパイル時の起動オプションを指定します 起動オプションには 以下のものがあります I インクルードファイルのディレクトリ 161

169 環境変数名 d データベース名 意味 RQL 文の予約語を QL88 でコンパイルする場合に指定 WQL 文の予約語の種別を指定 W95 プロシジャルーチン ( 条件宣言 ハンドラ宣言 IGNAL 文および REIGNAL 文は除く ) を利用する場合に指定 W96 プロシジャルーチン ( 条件宣言 ハンドラ宣言 IGNAL 文および REIGNAL 文は除く ) トリガ 行識別子または並列指定を利用する場合に指定 W2000 プロシジャルーチン トリガ 行識別子 並列指定 ロールまたはファンクションルーチンを利用する場合に指定 C 固定長文字列型のホスト変数に対してアプリケーションの実行時に NULL 文字 ( 0) を意識した処理をする場合に指定 v964 ビットで実行する QL 埋込み C プログラムをコンパイルする場合に指定 T マルチスレッド環境で動作するまたはセションを操作する関数を利用する QL 埋込み C プログラムをコンパイルする場合に指定 K 選択リストに * を指定したカーソル宣言または単一行 ELECT 文や 挿入列リストを省略した INERT 文が アプリケーションに記述されていないかチェックする場合に指定 環境変数 QLPC の設定の例を以下に示します [C シェルの場合 ] setenv QLPC 'I /sqlapp/include ' [bash B シェル K シェルの場合 ] QLPC='I /sqlapp/include '; export QLPC コンパイル時の起動オプションを指定します 起動オプションには 以下のものがあります I インクルードファイルのディレクトリ d データベース名 RQL 文の予約語を QL88 でコンパイルする場合に指定 WQL 文の予約語の種別を指定 QLPCOB (COBOL プログラム時 ) W95 プロシジャルーチン ( 条件宣言 ハンドラ宣言 IGNAL 文および REIGNAL 文は除く ) を利用する場合に指定 W96 プロシジャルーチン ( 条件宣言 ハンドラ宣言 IGNAL 文および REIGNAL 文は除く ) トリガ 行識別子または並列指定を利用する場合に指定 W2000 プロシジャルーチン トリガ 行識別子 並列指定 ロールまたはファンクションルーチンを利用する場合に指定 ZCOBOL ソース単位がクラス定義 ( オブジェクト指向プログラミング機能 ) の場合に指定 162

170 環境変数名 意味 AQL 埋込み COBOL プログラム中に単一の引用符を記述する場合に指定 fql 埋込み COBOL プログラムが固定形式の場合に指定 nql 埋込み COBOL プログラム中の英小文字を英大文字として扱わない場合に指定 GQL 埋込み COBOL プログラム中に集団項目を使用する場合に指定 E1QL 埋込み COBOL プログラム中に集団項目繰り返しを使用する場合に指定 g エラーメッセージに QL 埋込みプログラムの行番号を出力する場合に指定 T マルチスレッド環境で動作する QL 埋込み COBOL プログラムをコンパイルする場合に指定 K 選択リストに * を指定したカーソル宣言または単一行 ELECT 文や 挿入列リストを省略した INERT 文が アプリケーションに記述されていないかチェックする場合に指定 v964 ビットで実行する QL 埋込み COBOL プログラムをコンパイルする場合に指定 Linux RC アプリケーションの文字コード系が UNICODE の場合に 日本語項目の表現形式を指定 RC BE 日本語項目の表現形式を UC2 のビッグエンディアン形式とする場合に指定 RC LE 日本語項目の表現形式を UC2 のリトルエンディアン形式とする場合に指定 本オプションは アプリケーションの文字コード系が UNICODE の場合のみ指定できます 本オプションを省略した場合は UC2 のリトルエンディアン形式でコンパイルします 環境変数 QLPCOB の設定の例を以下に示します [C シェルの場合 ] setenv QLPCOB 'I /sqlapp/include ' [bash B シェル K シェルの場合 ] QLPCOB='I /sqlapp/include '; export QLPCOB インクルードファイルのディレクトリを指定します INCDIR 環境変数 INCDIR は アプリケーション中に INCLUDE 文を記述した場合に C プログラムの場合は環境変数 QLPC と COBOL プログラムの場合は環境変数 QLPCOB と併用して設定できます 環境変数の指定がない場合は C プログラム時は環境変数 QLPC およびコンパイル時のみ有効となり COBOL プログラム時は環境変数 QLPCOB およびコンパイル時のみ有効となります 環境変数 INCDIR の設定の例を以下に示します [C シェルの場合 ] setenv INCDIR /sqlapp/include/splapp2/include/use/include 163

171 環境変数名 意味 [bash Bシェル Kシェルの場合 ] INCDIR=/sqlapp/include/splapp2/include/use/include; export INCDIR ただし 環境変数 RDBDB を指定した場合 または QLPC および QLPCOB でコンパイル時の起動オプションに d を指定した場合 そのアプリケーションから CONNECT 文を実行することはできません アプリケーションを COBOL で作成する場合は COBOL プログラムのコンパイルのための環境変数の定義も必要となります 参照 COBOL プログラムのコンパイルのために必要な環境変数の定義については un 日本語 COBOL 使用手引書 NetCOBOL 使用手引書 または COBOL97 使用手引書 を参照してください 作業用のディレクトリ構成 アプリケーションのコンパイル リンクで参照あるいは作成するファイルを格納するための 作業用のディレクトリ構成を決めます ディレクトリ構成は 開発および保守のしやすさを考慮して作成してください 本章でアプリケーションのコンパイル リンクの例を示す場合 作業用のディレクトリは以下の構成で作成されているものとします 図 5.2 作業用のディレクトリ構成の例 コンパイル リンクの方法 コンパイル リンクを行うには 以下の 2 つの方法があります コンパイル リンクを一括して実行する プレコンパイルとコンパイルを分けて実行する コンパイル リンクを一括して実行する場合は 標準シェルプロシジャを利用します プレコンパイルとコンパイルを分けて実行する場合は sqlpc コマンドまたは sqlpcob コマンドを利用します 164

172 コンパイル リンクを一括して実行する場合 アプリケーションをコンパイル リンクするためのシェルプロシジャが システムから提供されています これを 標準シェルプロシジャと呼びます 標準シェルプロシジャは 以下のファイルに提供されています なお これらのファイル名は標準シェルプロシジャを /opt 配下のディレクトリにインストールした場合のものです O の種類ファイル名備考 olaris Linux /opt/funrdb2b/demo/shell/sqlcc または /opt/funrdb2b/demo/shell/sqlfcc /opt/funrdb2b/demo/shell/sqlcobol /opt/fjvrdb2b/demo/shell/sqlcc /opt/fjvrdb2b/demo/shell/sqlcobol C 言語用のシェルプロシジャ COBOL 用のシェルプロシジャ C 言語用のシェルプロシジャ COBOL 用のシェルプロシジャ C 言語用の標準シェルプロシジャ C 言語用の標準シェルプロシジャは sqlcc です olaris の場合は sqlfcc も使用できます sqlcc および sqlfcc の入力ファイルは QL 埋込み C プログラムのソースファイルです このファイル名には拡張子として.c および.lst 以外を指定する必要があります 出力ファイルは実行可能プログラムです また sqlcc および sqlfcc は作業用のファイルを作成します 作業用のファイルについては ファイル名が自動的に決定されカレントディレクトリに作成されます C 言語の場合は 文字コード系に依存しないロードモジュールが作成されます 文字コード系は実行時にクライアント用の動作環境ファイルまたは環境変数で指定します sqlcc および sqlfcc の使用例を以下に示します 例 1 sqlcc の使用例を示します main を持つ QL 埋込み C プログラム (demo01.sc) をコンパイル リンクします ロードモジュールは demo01 とします cd /home/rdb2/application/src sqlcc I/home/rdb2/include demo01.sc o../bin/demo01 (1) (2) (3) (1) インクルードファイルを検索するディレクトリを指定するオプション (2) QL 埋込み C プログラムのファイル名 (3) cc コマンド用のオプション 165

173 (3) gcc コマンド用のオプション 例 2 sqlfcc の使用例を示します main を持つ QL 埋込み C プログラム (demo01.sc) をコンパイル リンクします ロードモジュールは demo01 とします cd /home/rdb2/application/src sqlfcc I/home/rdb2/include demo01.sc o../bin/demo01 (1) (2) (3) (1) インクルードファイルを検索するディレクトリを指定するオプション (2) QL 埋込み C プログラムのファイル名 (3) fcc コマンド用のオプション オプション sqlcc または sqlfcc では 使用するインクルードファイルの配置ディレクトリなどのオプションが指定できます 64 ビットで実行する QL 埋込み C プログラムをコンパイル リンクする場合は v9 オプションを指定してください また マルチスレッド環境で動作するまたはセションを操作する関数を利用する QL 埋込み C プログラムをコンパイル リンクする場合は T オプションを指定してください 注意 olaris の場合 v9 オプションと T オプションを同時に指定することはできません 参照 オプションの詳細については コマンドリファレンス を参照してください QL 埋込み C プログラムのファイル名 QL 埋込み C プログラムで記述されたアプリケーションの ソースファイルを指定します cc コマンド用のオプション sqlcc はロードモジュールを作成するために cc コマンドを実行します このとき cc コマンドに渡すオプションを指定します gcc コマンド用のオプション sqlcc はロードモジュールを作成するために gcc コマンドを実行します このとき gcc コマンドに渡すオプションを指定します fcc コマンド用のオプション sqlfcc はロードモジュールを作成するために fcc コマンドを実行します このとき fcc コマンドに渡すオプションを指定します COBOL 用の標準シェルプロシジャ COBOL 用の標準シェルプロシジャは sqlcobol です sqlcobol の入力ファイルは QL 埋込み COBOL プログラムのソースファイルです このファイル名には拡張子として.cobol および.lst 以外を指定する必要があります 出力ファイルはロードモジュールです また sqlcobol は作業用のファイルを作成します 作業用のファイルについては ファイル名が自動的に決定されカレントディレクトリに作成されます sqlcobol の使用例を以下に示します 166

174 例 主プログラムである QL 埋込み COBOL プログラム (demo02.scob) を コンパイル リンクします ロードモジュールは demo02 とします cd /home/rdb2/application/src sqlcobol I/home/rdb2/include demo02.scob M o../bin/demo02 (1) (2) (3) (1) インクルードファイルを検索するディレクトリを指定するオプション (2) QL 埋込み COBOL プログラムのファイル名 (3) cobol コマンド用のオプション オプション sqlcobol では 使用する登録集原文ファイルの配置ディレクトリなどのオプションが指定できます 64 ビットで実行する QL 埋込み COBOL プログラムをコンパイル リンクする場合は v9 オプションを指定してください また マルチスレッド環境で動作する QL 埋込み COBOL プログラムをコンパイル リンクする場合は T オプションを指定してください 注意 olaris の場合 v9 オプションを指定することはできません 参照 オプションの詳細については コマンドリファレンス を参照してください QL 埋込み COBOL プログラムのファイル名 QL 埋込み COBOL プログラムで記述されたアプリケーションの ソースファイルを指定します cobol コマンド用のオプション sqlcobol はロードモジュールを作成するために cobol コマンドを実行します このとき cobol コマンドに渡すオプションを指定します 167

175 プレコンパイルとコンパイルを分けて実行する場合 アプリケーションをコンパイル リンクするために まず sqlpc コマンドまたは sqlpcob コマンドを利用してプレコンパイルします アプリケーションをプレコンパイルすることによって アプリケーション中の QL 文をコンパイルし 標準の C プログラムまたは COBOL プログラムに変換します その後 cc コマンド gcc コマンド fcc コマンドまたは cobol コマンドを利用してロードモジュールを作成します 注意 プレコンパイルによって作成されたソースファイルは 中身を変更しないでください C 言語を使用する場合 C 言語用のプレコンパイルコマンドは sqlpc です sqlpc コマンドの入力ファイルは QL 埋込み C プログラムのソースファイルです このファイル名には拡張子として.c および.lst 以外を指定する必要があります 出力ファイルは C プログラムのソースファイルで ファイル名に拡張子として.c が付きます 参照 sqlpc コマンドの詳細については コマンドリファレンス を参照してください プレコンパイルが終了したら ロードモジュールを作成します ロードモジュールを作成するためには cc コマンド gcc コマンドまたは fcc コマンドを実行します C 言語の場合は 文字コード系に依存しないロードモジュールが作成されます 文字コード系は実行時にクライアント用の動作環境ファイルまたは環境変数で指定します 168

176 C 言語を使用した コンパイル リンクの例を以下に示します 例 1 主プログラムである QL 埋込み C プログラム (demo03.sc) を コンパイル リンクします ロードモジュールは demo03 とします cd /home/rdb2/application/src sqlpc demo03.sc (1) cc o../bin/demo03 lsqldrv L/opt/FUNrdb2b/lib demo03.c (2) (3) (4) 例 2 (1) QL 埋込み C プログラムのファイル名 (2) RDB ライブラリを指定するオプション (3) RDB ライブラリのパスを指定するオプション (4) プレコンパイル後の QL 埋込み C プログラムのファイル名 RELA4(x86) または REL5(x86) の場合 主プログラムである QL 埋込み C プログラム (demo03.sc) を コンパイル リンクします ロードモジュールは demo03 とします cd /home/rdb2/application/src sqlpc demo03.sc (1) gcc o../bin/demo03 lsqldrv L/opt/FJVrdb2b/lib demo03.c (2) (3) (4) 例 3 (1) QL 埋込み C プログラムのファイル名 (2) RDB ライブラリを指定するオプション (3) RDB ライブラリのパスを指定するオプション (4) プレコンパイル後の QL 埋込み C プログラムのファイル名 RELA4(IPF) RELA4(EM64T) REL5(IPF) または REL5(Intel64) の場合 32 ビットで動作するアプリケーションの場合 主プログラムである QL 埋込み C プログラム (demo03.sc) を コンパイル リンクします ロードモジュールは demo03 とします cd /home/rdb2/application/src sqlpc demo03.sc (1) gcc o../bin/demo03 m32 mtune=i386 lsqldrv L/opt/FJVrdb2b/lib demo03.c (2) (3) (4) (5) (1) QL 埋込み C プログラムのファイル名 (2) 32 ビットアプリケーションのコンパイル リンクを指定するオプション (3) RDB ライブラリを指定するオプション 169

177 (4) RDB ライブラリのパスを指定するオプション (5) プレコンパイル後の QL 埋込み C プログラムのファイル名 注意 RELA4(IPF) または REL5(IPF) の場合には 32 ビットで動作するアプリケーションをコンパイル リンクできません 64 ビットで動作するアプリケーションの場合 主プログラムである QL 埋込み C プログラム (demo03.sc) を コンパイル リンクします ロードモジュールは demo03 とします cd /home/rdb2/application/src sqlpc v9 demo03.sc (1) gcc o../bin/demo03 lsql64drv L/opt/FJVrdb2b/lib demo03.c (2) (3) (4) (1) QL 埋込み C プログラムのファイル名 (2) RDB ライブラリを指定するオプション (3) RDB ライブラリのパスを指定するオプション (4) プレコンパイル後の QL 埋込み C プログラムのファイル名 COBOL を使用する場合 COBOL 用のプレコンパイルコマンドは sqlpcob です sqlpcob コマンドの入力ファイルは QL 埋込み COBOL プログラムのソースファイルです このファイル名には拡張子として.cobol および.lst 以外を指定する必要があります 出力ファイルは COBOL プログラムのソースファイルで ファイル名に拡張子として.cobol が付きます 参照 sqlpcob コマンドの詳細については コマンドリファレンス を参照してください プレコンパイルが終了したら ロードモジュールを作成します ロードモジュールを作成するためには cobol コマンドを実行します COBOL を使用した コンパイル リンクの例を以下に示します 例 主プログラムである QL 埋込み COBOL プログラム (demo04.scob) を コンパイル リンクします ロードモジュールは demo04 とします cd /home/rdb2/application/src sqlpcob demo04.scob (1) cobol M o../bin/demo04 lsqldrv L/opt/FUNrdb2b/lib demo04.cobol (2) (3) (4) (1) QL 埋込み COBOL プログラムのファイル名 (2) RDB ライブラリを指定するオプション (3) RDB ライブラリのパスを指定するオプション (4) プレコンパイル後の QL 埋込み COBOL プログラムのファイル名 170

178 コンパイル リンクする場合に必要なオプション cc コマンド gcc コマンド fcc コマンドおよび cobol コマンドの実行時には 必要に応じてオプションを指定します アプリケーションをコンパイル リンクする場合に必要なオプションを以下に示します 表 5.4 アプリケーションをコンパイル リンクする場合に必要なオプション 指定するオプション M COBOL の場合に指定 L/opt/FUNrdb2b/lib (olaris) L/opt/FJVrdb2b/lib (Linux) lsqldrvm lsqldrv lsql64drvm lsql64drv xarch=v9 (olaris) mt (olaris) D_REENTRANT lpthread (Linux) m32 mtune=i386 (Linux) RDB ライブラリパス指定 RDB ライブラリパス指定 オプションの役割 RDB ライブラリ名 (32 ビットでかつ マルチスレッドで実行するアプリケーションをコンパイル リンクする場合に指定 ) RDB ライブラリ名 (32 ビットで実行するアプリケーションをコンパイル リンクする場合に指定 ) RDB ライブラリ名 (64 ビットでかつ マルチスレッドで実行するアプリケーションをコンパイル リンクする場合に指定 ) RDB ライブラリ名 (64 ビットで実行するアプリケーションをコンパイル リンクする場合に指定 ) 64 ビットで実行する QL 埋込み C プログラムをコンパイル リンクする場合に指定 マルチスレッドで実行するアプリケーションをコンパイル リンクする場合に指定 マルチスレッドで実行するアプリケーションをコンパイル リンクする場合に指定 RELA4(EM64T) または REL5(Intel64) で 32 ビットで実行するアプリケーションをコンパイル リンクする場合に指定 複数のコンパイル単位から構成されるアプリケーションのコンパイル リンクの方法 前項では QL 文を使用するアプリケーションが 1 つのコンパイル単位である場合の コンパイル リンクの方法について説明しました 一方 大規模なアプリケーションの開発においては 複数のコンパイル単位から構成されるアプリケーションを作成し これらをコンパイル リンクするような開発方法が必要となります 本項では このようなアプリケーションが QL 文を使用する場合の コンパイル リンクの方法について説明します 複数のコンパイル単位から構成されるアプリケーションでは ロードモジュールはアプリケーションの開発や保守の形態 および実行環境を考慮して それぞれのコンパイル単位を静的リンクするか または動的リンクするかを選択します 静的リンクする場合のコンパイル リンク 複数のコンパイル単位を静的リンクする場合のコンパイル リンクの方法を以下に示します 171

179 図 5.3 複数のコンパイル単位を静的リンクする場合のコンパイル リンクの方法 QL 文を使用するコンパイル単位は sqlcc sqlfcc または sqlcobol を使用してコンパイル リンクを行います 参照 sqlcc sqlfcc および sqlcobol のオプションの指定方法については コマンドリファレンス を参照してください アプリケーションによっては QL 文を使用しないコンパイル単位が存在する場合があります QL 文を使用しないコンパイル単位は cc コマンド gcc コマンド fcc コマンドまたは cobol コマンドを使用してコンパイル リンクを行います また ロードモジュールを静的リンクして作成するには 副プログラムのオブジェクトファイルを作成し 主プログラムに静的にリンクする必要があります アプリケーションを静的リンクする場合に必要なオプションを以下に示します 表 5.5 アプリケーションを静的リンクする場合に必要なオプション コンパイル対象の性質指定するオプション備考 QL 文を含むコンパイル単位 QL 文を含まないコンパイル単位 主プログラム 副プログラム 主プログラム 副プログラムのオブジェクトファイル名 リンクする副プログラム M COBOL の場合に指定 c オブジェクトファイルの作成 副プログラムのオブジェクトファイル名 リンクする副プログラム M COBOL の場合に指定 L/opt/FUNrdb2b/lib L/opt/FJVrdb2b/lib lsqldrvm RDB ライブラリパス指定 (olaris) RDB ライブラリパス指定 (Linux) RDB ライブラリ名 (32 ビットでかつ マルチスレッドで動作するアプリケーションを静的リンクする場合に使用 ) 172

180 コンパイル対象の性質指定するオプション備考 lsqldrv lsql64drvm lsql64drv RDB ライブラリ名 (32 ビットで実行するアプリケーションを静的リンクする場合に使用 ) RDB ライブラリ名 (64 ビットでかつ マルチスレッドで実行するアプリケーションを静的リンクする場合に使用 ) RDB ライブラリ名 (64 ビットで実行するアプリケーションを静的リンクする場合に使用 ) 副プログラム c オブジェクトファイルの作成 C 言語使用時の例 以下の例において sqlfcc を利用する場合は sqlcc を sqlfcc に また cc を fcc に置き換えたものになります 例 1 QL 文を使用する主プログラム (demo04main.sc) と QL 文を使用する 2 個の副プログラム (demo04sub1.sc demo04sub2.sc) を静的リンクします ロードモジュール名は demo04 とします cd /home/rdb2/application/src sqlcc demo04sub1.sc c sqlcc demo04sub2.sc c sqlcc demo04main.sc o../bin/demo04 demo04sub1.o demo04sub2.o 例 2 QL 文を使用しない主プログラム (demo05main.c) と QL 文を使用する副プログラム (demo05sub1.sc) および QL 文を使用しない副プログラム (demo05sub2.c) を静的リンクします ロードモジュール名は demo05 とします なお Linux の場合は L オプションに指定するパス名を読み替えてください cd /home/rdb2/application/src sqlcc demo05sub1.sc c cc c demo05sub2.c cc o../bin/demo05 L/opt/FUNrdb2b/lib lsqldrv demo05main.c demo05sub1.o demo05sub2.o 例 3 64 ビットで実行するアプリケーションを静的リンクする場合の例を示します QL 文を使用しない主プログラム (demo08main.c) と QL 文を使用する副プログラム (demo08sub1.sc) および QL 文を使用しない副プログラム (demo08sub2.c) を静的リンクします ロードモジュール名は demo08 とします cd /home/rdb2/application/src sqlcc v9 demo08sub1.sc c cc xarch=v9 c demo08sub2.c cc xarch=v9 o../bin/demo08 L/opt/FUNrdb2b/lib lsql64drv demo08main.c demo08sub1.o demo08sub2.o 例 4 64 ビットで実行するアプリケーションを静的リンクする場合の例を示します QL 文を使用しない主プログラム (demo09main.c) と QL 文を使用する副プログラム (demo09sub1.sc) および QL 文を使用しない副プログラム (demo09sub2.c) を静的リンクします ロードモジュール名は demo08 とします 173

181 cd /home/rdb2/application/src sqlcc v9 demo09sub1.sc c cc c demo09sub2.c cc o../bin/demo09 L/opt/FJVrdb2b/lib lsql64drv demo09main.c demo09sub1.o demo09sub2.o COBOL 使用時の例 例 1 QL 文を使用する主プログラム (demo06main.scob) と QL 文を使用する 2 個の副プログラム (demo06sub1.scob demo06sub2.scob) を静的リンクします ロードモジュール名は demo06 とします cd /home/rdb2/application/src sqlcobol demo06sub1.scob c sqlcobol demo06sub2.scob c sqlcobol demo06main.scob M o../bin/demo06 demo06sub1.o demo06sub2.o 例 2 QL 文を使用しない主プログラム (demo07main.cobol) と QL 文を使用する副プログラム (demo07sub1.scob) および QL 文を使用しない副プログラム (demo07sub2.cobol) を静的リンクします ロードモジュール名は demo07 とします cd /home/rdb2/application/src sqlcobol demo07sub1.scob c cobol c demo07sub2.cobol cobol M o../bin/demo07 L/opt/FUNrdb2b/lib lsqldrv demo07main.cobol demo07sub1.o demo07sub2.o 例 3 64 ビットで実行するアプリケーションを静的リンクする場合の例を示します QL 文を使用しない主プログラム (demo08main.cobol) と QL 文を使用する副プログラム (demo08sub1.scob) および QL 文を使用しない副プログラム (demo08sub2.cobol) を静的リンクします ロードモジュール名は demo08 とします cd /home/rdb2/application/src sqlcobol v9 demo08sub1.scob c cobol c demo08sub2.cobol cobol M o../bin/demo08 L/opt/FJVrdb2b/lib lsql64drv demo08main.cobol demo08sub1.o demo08sub2.o 動的リンクする場合のコンパイル リンク 複数のコンパイル単位を動的リンクする場合のコンパイル リンクの方法を以下に示します 174

182 図 5.4 複数のコンパイル単位を動的リンクする場合のコンパイル リンクの方法 QL 文を使用するコンパイル単位は sqlcc sqlfcc または sqlcobol を使用してコンパイル リンクを行います 参照 sqlcc sqlfcc および sqlcobol のオプションの指定方法については コマンドリファレンス を参照してください アプリケーションによっては QL 文を使用しないコンパイル単位が存在する場合があります QL 文を使用しないコンパイル単位は cc コマンド gcc コマンド fcc コマンドまたは cobol コマンドを使用してコンパイル リンクを行います また ロードモジュールを動的リンクして作成するためには 副プログラムは共用ライブラリにロードモジュールとして作成し 主プログラムのコンパイル リンク時にリンクする副プログラムのロードモジュール名を指定する必要があります アプリケーションを動的リンクする場合に必要なオプションを以下に示します 表 5.6 アプリケーションを動的リンクする場合に必要なオプション コンパイル対象の性質指定するオプション備考 QL 文を含むコンパイル単位 主プログラム 副プログラム l 副プログラムのロードモジュール名リンクする副プログラム M COBOL の場合に指定 KPIC G fpic shared C 言語で共有ライブラリを作成する場合に指定 (olaris) 動的リンクの指定 (olaris) C 言語で共有ライブラリを作成する場合に指定 (Linux) 動的リンクの指定 (Linux) 175

183 コンパイル対象の性質指定するオプション備考 QL 文を含まないコンパイル単位 主プログラム 副プログラム l 副プログラムのロードモジュール名リンクする副プログラム M COBOL の場合に指定 KPIC G fpic shared C 言語で共有ライブラリを作成する場合に指定 (olaris) 動的リンクの指定 (olaris) C 言語で共有ライブラリを作成する場合に指定 (Linux) 動的リンクの指定 (Linux) C 言語使用時の例 以下の例において sqlfcc を利用する場合は sqlcc を sqlfcc に また cc を fcc に置き換えたものになります 例 1 QL 文を使用する主プログラム (demo10main.sc) と QL 文を使用する 2 個の副プログラム (libsub1.sc libsub2.sc) を動的リンクします ロードモジュール名は 副プログラムを libsub1.so および libsub2.so 主プログラムを demo10main とします なお Linux の場合は KPIC オプションと G オプションの代わりに fpic オプションと shared オプションを指定します cd /home/rdb2/application/src setenv LD_LIBRARY_PAT /home/rdb2/application/lib$ld_library_pat sqlcc libsub1.sc KPIC G o../lib/libsub1.so sqlcc libsub2.sc KPIC G o../lib/libsub2.so sqlcc demo10main.sc o../bin/demo10main lsub1 lsub2 例 2 QL 文を使用しない主プログラム (demo11main.c) と QL 文を使用する副プログラム (libsub3.sc) および QL 文を使用しない副プログラム (libsub4.c) を動的リンクします ロードモジュール名は 副プログラムを libsub3.so および libsub4.so 主プログラムを demo11main とします なお Linux の場合は KPIC オプションと G オプションの代わりに fpic オプションと shared オプションを指定します cd /home/rdb2/application/src setenv LD_LIBRARY_PAT /home/rdb2/application/lib$ld_library_pat sqlcc libsub3.sc KPIC G o../lib/libsub3.so cc KPIC G o../lib/libsub4.so libsub4.c cc o../bin/demo11main demo11main.c lsub3 lsub4 例 3 64 ビットで実行するアプリケーションを動的リンクする場合の例を示します QL 文を使用する主プログラム (demo09main.sc) と QL 文を使用する 2 個の副プログラム (libsub11.sc libsub12.sc) を動的リンクします ロードモジュール名は 副プログラムを libsub11.so および libsub12.so 主プログラムを demo09main とします なお Linux の場合は KPIC オプションと G オプションの代わりに fpic オプションと shared オプションを指定します cd /home/rdb2/application/src setenv LD_LIBRARY_PAT_64 /home/rdb2/application/lib$ld_library_pat_64 176

184 setenv LD_LIBRARY_PAT /home/rdb2/application/lib$ld_library_pat sqlcc v9 libsub11.sc KPIC G o../lib/libsub11.so sqlcc v9 libsub12.sc KPIC G o../lib/libsub12.so sqlcc v9 demo09main.sc o../bin/demo09main lsub11 lsub12 例 4 64 ビットで実行するアプリケーションを動的リンクする場合の例を示します QL 文を使用する主プログラム (demo09main.sc) と QL 文を使用する 2 個の副プログラム (libsub11.sc libsub12.sc) を動的リンクします ロードモジュール名は 副プログラムを libsub11.so および libsub12.so 主プログラムを demo09main とします cd /home/rdb2/application/src setenv LD_LIBRARY_PAT /home/rdb2/application/lib$ld_library_pat sqlcc v9 libsub11.sc fpic shared o../lib/libsub11.so sqlcc v9 libsub12.sc fpic shared o../lib/libsub12.so sqlcc v9 demo09main.sc o../bin/demo09main lsub11 lsub12 COBOL 使用時の例 例 1 QL 文を使用する主プログラム (demo12main.scob) と QL 文を使用する 2 個の副プログラム (libsub5.scob libsub6.scob) を動的リンクします ロードモジュール名は 副プログラムを libsub5.so および libsub6.so 主プログラムを demo12main とします cd /home/rdb2/application/src setenv LD_LIBRARY_PAT /home/rdb2/application/lib$ld_library_pat sqlcobol libsub5.scob G o../lib/libsub5.so sqlcobol libsub6.scob G o../lib/libsub6.so sqlcobol demo12main.scob M o../bin/demo12main lsub5 lsub6 例 2 QL 文を使用しない主プログラム (demo13main.cobol) と QL 文を使用する副プログラム (libsub7.scob) および QL 文を使用しない副プログラム (libsub8.cobol) を動的リンクします ロードモジュール名は 副プログラムを libsub7.so および libsub8.so 主プログラムを demo13main とします cd /home/rdb2/application/src setenv LD_LIBRARY_PAT /home/rdb2/application/lib$ld_library_pat sqlcobol libsub7.scob G o../lib/libsub7.so cobol G o../lib/libsub8.so libsub8.cobo cobol M o../bin/demo13main lsub7 lsub8 demo13main.cobol 例 3 64 ビットで実行するアプリケーションを動的リンクする場合の例を示します QL 文を使用する主プログラム (demo14main.scob) と QL 文を使用する 2 個の副プログラム (libsub11.scob libsub12.scob) を動的リンクします ロードモジュール名は 副プログラムを libsub11.so および libsub12.so 主プログラムを demo14main とします cd /home/rdb2/application/src setenv LD_LIBRARY_PAT /home/rdb2/application/lib$ld_library_pat sqlcobol v9 libsub11.scob G o../lib/libsub11.so sqlcobol v9 libsub12.scob G o../lib/libsub12.so sqlcobol v9 demo14main.scob M o../bin/demo14main lsub11 lsub 動的プログラム構造のコンパイル リンク 動的プログラム構造のアプリケーションは 以下に示す方法でコンパイル リンクします 動的プログラム構造は COBOL のアプリケーションだけ利用できます 177

185 図 5.5 動的プログラム構造の場合のコンパイル リンクの方法 QL 文を使用するコンパイル単位は sqlcobol を使用してコンパイル リンクを行います 参照 sqlcobol のオプションの指定方法については コマンドリファレンス を参照してください 動的プログラム構造のロードモジュールを動的リンクして作成するためには 主プログラムのコンパイル リンク時に コンパイルオプション DLOAD を指定します 副プログラムは共用ライブラリにロードモジュールとして作成しておきます アプリケーションを動的リンクする場合に必要なオプションを以下に示します 表 5.7 アプリケーションを動的リンクする場合に必要なオプション コンパイル対象の性質指定するオプション備考 QL 文を含むコンパイル単位 例 1 主プログラム WC, "DLOAD" 動的プログラム構造の指定 M COBOLの場合に指定 副プログラム動的リンクオプション動的リンクの指定 動的プログラム構造の QL 文を使用する主プログラム (demo14main.scob) と QL 文を使用する 2 個の副プログラム (libsub9.scob libsub10.scob) を動的リンクします ロードモジュール名は 副プログラムを libsub9.so および libsub10.so 主プログラムを demo14main とします cd /home/rdb2/application/src setenv LD_LIBRARY_PAT /home/rdb2/application/lib$ld_library_pat sqlcobol libsub9.scob o../lib/libsub9.so sqlcobol libsub10.scob o../lib/libsub10.so sqlcobol demo14main.scob M o../bin/demo14main WC,"DLOAD" 例 2 64 ビットで実行するアプリケーションを動的リンクする場合の例を示します 動的プログラム構造の QL 文を使用する主プログラム (demo15main.scob) と QL 文を使用する 2 個の副プログラム (libsub13.scob libsub14.scob) を動的リンク 178

186 します ロードモジュール名は 副プログラムを libsub13.so および libsub14.so 主プログラムを demo15main とします cd /home/rdb2/application/src setenv LD_LIBRARY_PAT /home/rdb2/application/lib$ld_library_pat sqlcobol v9 libsub13.scob o../lib/libsub13.so sqlcobol v9 libsub14.scob o../lib/libsub14.so sqlcobol v9 demo15main.scob M o../bin/demo15main WC,"DLOAD" コンパイル時のコネクション先の指定 アプリケーションは 一般的にはアプリケーションでコネクションを操作して データベースをアクセスしますが 以下の方法により アプリケーションにコネクション操作を記述しなくても動作することが可能となります この場合 以下の注意が必要です アプリケーションからローカルのデータベースを利用します アプリケーション内に CONNECT 文は記述しません コンパイル時にデータベースを指定する アプリケーションをコンパイル (sqlcc sqlfcc または sqlcobol) するときに アプリケーションで利用するデータベース名を指定します このオプションを指定すると アプリケーションの実行時に自動的に指定したデータベースと結合されます このため アプリケーションからの CONNECT 文は実行できません 例 1 データベース名を DB01 とした場合の指定方法 (C プログラムの場合 ) sqlfcc を利用する場合は sqlcc を sqlfcc に置き換えたものになります cd /home/rdb2/application/src sqlcc d DB01 demo08.sc o../bin/demo08 データベース名を指定する 例 2 データベース名を DB01 とした場合の指定方法 (COBOL プログラムの場合 ) cd /home/rdb2/application/src sqlcobol d DB01 demo09main.scob M o../bin/demo09 demo09sub.o データベース名を指定する 5.2 Windows(R) を使用した場合のアプリケーションのコンパイル リンク Windows(R) を使用した場合のアプリケーションのコンパイル リンクについて説明します アプリケーションのコンパイル リンクの流れ アプリケーションのコーディングが完了すると これをコンパイルおよびリンクしてロードモジュールを作成します ここでは アプリケーションをコンパイルおよびリンクする作業について説明します アプリケーションのコンパイル リンクの概要を以下に示します クライアント (Windows(R)) でコンパイル リンクを行う場合は QL ランタイムライブラリを使用します また サーバ (Windows(R) 2000 Windows erver(r) 2003 および Windows erver(r) 2008) でコンパイル リンクを行う場合は RDB ライブラリを使用します 179

187 図 5.6 アプリケーションのコンパイル リンクの概要 QL 文を使用するアプリケーションでは コンパイル リンクによりアプリケーションのロードモジュールを作成します アプリケーションのロードモジュールは 通常のプログラムと同じ形式のロードモジュールです 以後 アプリケーションのロードモジュールを 単にロードモジュールと呼びます コンパイル リンクのための環境設定 アプリケーションをコンパイル リンクするためには 作業に先立って必要な環境を設定しておく必要があります 設定すべき環境には 以下のものがあります 環境変数の設定 作業用のディレクトリ構成 環境変数の設定 アプリケーションをコンパイルするときに必要に応じて設定する環境変数を以下に示します これらの環境変数を設定しておくことにより コンパイル時に sqlcc または sqlcobol でオプションを指定する必要がなくなります 表 5.8 アプリケーションをコンパイル リンクする場合に必要に応じて設定する環境変数 環境変数名 RDBDB 意味 アプリケーションで指定するデータベース名を指定します 環境変数 RDBDB の設定の例を以下に示します set RDBDB=DB1 コンパイル時の起動オプションを指定します 起動オプションには 以下のものがあります I インクルードファイルのディレクトリ QLPC (C プログラム時 ) d データベース名 RQL 文の予約語を QL88 でコンパイルする場合に指定 WQL 文の予約語の種別を指定 W95 プロシジャルーチン ( 条件宣言 ハンドラ宣言 IGNAL 文および REIGNAL 文は除く ) を利用する場合に指定 180

188 環境変数名 意味 W96 プロシジャルーチン ( 条件宣言 ハンドラ宣言 IGNAL 文および REIGNAL 文は除く ) トリガ 行識別子または並列指定を利用する場合に指定 W2000 プロシジャルーチン トリガ 行識別子 並列指定 ロールまたはファンクションルーチンを利用する場合に指定 C 固定長文字列型のホスト変数に対してアプリケーションの実行時に NULL 文字 ( 0) を意識した処理をする場合に指定 v964 ビットで実行する QL 埋込み C プログラムをコンパイルする場合に指定 T マルチスレッド環境で動作するまたはセションを操作する関数を利用する QL 埋込み C プログラムをコンパイルする場合に指定 環境変数 QLPC の設定の例を以下に示します set QLPC=I C UER DEFAULT INCLUDE コンパイル時の起動オプションを指定します 起動オプションには 以下のものがあります I インクルードファイルのディレクトリ d データベース名 RQL 文の予約語を QL88 でコンパイルする場合に指定 WQL 文の予約語の種別を指定 W95 プロシジャルーチン ( 条件宣言 ハンドラ宣言 IGNAL 文および REIGNAL 文は除く ) を利用する場合に指定 W96 プロシジャルーチン ( 条件宣言 ハンドラ宣言 IGNAL 文および REIGNAL 文は除く ) トリガ 行識別子または並列指定を利用する場合に指定 QLPCOB (COBOL プログラム時 ) W2000 プロシジャルーチン トリガ 行識別子 並列指定 ロールまたはファンクションルーチンを利用する場合に指定 ZCOBOL ソース単位がクラス定義 ( オブジェクト指向プログラミング機能 ) の場合に指定 AQL 埋込み COBOL プログラム中に単一の引用符を記述する場合に指定 fql 埋込み COBOL プログラムが固定形式の場合に指定 nql 埋込み COBOL プログラム中の英小文字を英大文字として扱わない場合に指定 GQL 埋込み COBOL プログラム中に集団項目を使用する場合に指定 E1QL 埋込み COBOL プログラム中に集団項目繰り返しを使用する場合に指定 g エラーメッセージに QL 埋込みプログラムの行番号を出力する場合に指定 un アプリケーションの文字コード系として UNICODE を使用する場合に指定 181

189 環境変数名 意味 T マルチスレッド環境で動作する QL 埋込み COBOL プログラムをコンパイルする場合に指定 v964 ビットで実行する QL 埋込み COBOL プログラムをコンパイルする場合に指定 環境変数 QLPCOB の設定の例を以下に示します set QLPCOB=I C UER DEFAULT INCLUDE インクルードファイルのディレクトリを指定します 環境変数 INCLUDE は アプリケーション中に INCLUDE 文を記述した場合に C プログラムの場合は環境変数 QLPC と COBOL プログラムの場合は 環境変数 QLPCOB と併用して設定できます INCLUDE 環境変数の指定がない場合は C プログラム時は環境変数 QLPC およびコンパイル時だけ有効となり COBOL プログラム時は環境変数 QLPCOB およびコンパイル時だけ有効となります 環境変数 INCLUDE の設定の例を以下に示します set INCLUDE=C UER DEFAULT INCLUDE;C UER DEFAULT INCLUDE2 ただし 環境変数 RDBDB を指定した場合 または QLPC および QLPCOB のコンパイル時の起動オプションに d を指定した場合 そのアプリケーションから CONNECT 文を実行することはできません アプリケーションを COBOL で作成する場合 COBOL プログラムのコンパイルのための環境変数の定義が必要となります 参照 COBOL プログラムのコンパイルのために必要な環境変数の定義については NetCOBOL 使用手引書 または COBOL97 使用手引書 を参照してください アプリケーションを C 言語で作成する場合 アプリケーションの対象プラットフォーム用の Visual C++ ツールセットが動作するように環境を設定してください Microsoft(R) Visual tudio 2005 での作成手順の例を以下に示します 1. [ スタート ] メニューから [ プログラム (P)] で [Microsoft Visual tudio 2005] の [Visual tudio Tools] を選択します 2. 表示されたメニューから 対象プラットフォームに対応した項目を選択します 例 Visual tudio 2005 コマンドプロンプト Visual tudio 2005 Itanium Cross Tools コマンドプロンプト Visual tudio 2005 x64 Cross Tools コマンドプロンプト Windows erver(r) 2003 for Itanium または Windows erver(r) 2008 for Itanium の場合 [Visual tudio 2005 Itanium Cross Tools コマンドプロンプト ] を選択します Itanium 向けのコンパイラやリンカを使うための環境が整ったコマンドプロンプトが開きます 182

190 参照 Visual C++ ツールセットの設定方法については Microsoft(R)Visual C++ のドキュメント を参照してください 注意 Windows(R) において ymfoware/rdb または Esql のインストールにより アプリケーションのコンパイル リンクに必要な環境変数 INCLUDE および LIB が 自動的にシステム環境変数に設定されます ユーザ環境変数に INCLUDE および LIB を設定する場合 それぞれのユーザ環境変数の最後に ;%INCLUDE % および ;%LIB% を設定しシステム環境変数が継承されるようにしてください 例 ユーザ環境変数 INCLUDE の場合 ~;%INCLUDE% ユーザ環境変数 LIB の場合 ~;%LIB% 作業用のディレクトリ構成 アプリケーションのコンパイル リンクで参照あるいは作成するファイルを格納するための 作業用のディレクトリ構成を決めます ディレクトリ構成は 開発および保守のしやすさを考慮して作成してください 本章でアプリケーションのコンパイル リンクの例を示す場合 作業用のディレクトリは以下の構成で作成されているものとします 図 5.7 作業用のディレクトリ構成の例 コンパイル リンクの方法 コンパイル リンクを行うには 以下の2つの方法があります コンパイル リンクを一括して実行する プレコンパイルとコンパイルを分けて実行する 183

191 コンパイル リンクを一括して実行する場合 コンパイル リンクを一括して実行する場合は sqlcc コマンドまたは sqlcobol コマンドを利用します C 言語を使用する場合 C 言語用のコマンドは sqlcc です sqlcc の入力ファイルは QL 埋込み C プログラムのソースファイルです このファイル名には拡張子として.C および.LT 以外を指定する必要があります 出力ファイルは実行可能プログラムです また sqlcc は作業用のファイルを作成します 作業用のファイルについては ファイル名が自動的に決定されカレントディレクトリに作成されます C 言語の場合は 文字コード系に依存しないロードモジュールが作成されます 文字コード系は実行時にクライアント用の動作環境ファイルまたは環境変数で指定します sqlcc の使用例を以下に示します 例 main をもつ QL 埋込み C プログラム (DEMO01.C) をコンパイル リンクします ロードモジュールは DEMO01.EXE とします cd C UER DEFAULT APPLICATION RC sqlcc I C UER DEFAULT APPLICATION INCLUDE DEMO01.C /Fe.. BIN DEMO01.EXE (1) (2) (3) (1) インクルードファイルを検索するディレクトリを指定するオプション (2) QL 埋込み C プログラムのファイル名 (3) cl コマンド用のオプション オプション sqlcc では 使用するインクルードファイルの配置ディレクトリなどのオプションが指定できます 64 ビットで実行する QL 埋込み C プログラムをコンパイル リンクする場合は v9 オプションを指定してください また マルチスレッド環境で動作するまたはセションを操作する関数を利用する QL 埋込み C プログラムをコンパイル リンクする場合は T オプションを指定してください 参照 オプションの詳細については コマンドリファレンス を参照してください 184

192 QL 埋込み C プログラムのファイル名 QL 埋込み C プログラムで記述されたアプリケーションの ソースファイルを指定します cl コマンド用のオプション sqlcc はロードモジュールを作成するために cl コマンドを実行します このとき cl コマンドに渡すオプションを指定します COBOL を使用する場合 COBOL 言語用のコマンドは sqlcobol です sqlcobol の入力ファイルは QL 埋込み COBOL プログラムのソースファイルです このファイル名には拡張子として.COB および.LT 以外を指定する必要があります 出力ファイルはロードモジュールです また sqlcobol は作業用のファイルを作成します 作業用のファイルについては ファイル名が自動的に決定されカレントディレクトリに作成されます COBOL 言語の場合は コンパイル時に文字コード系を指定します sqlcobol の使用例を以下に示します 例 主プログラムである QL 埋込み COBOL プログラム (DEMO02.COB) を コンパイル リンクします ロードモジュールは DEMO02.EXE とします cd C UER DEFAULT APPLICATION RC sqlcobol I C UER DEFAULT APPLICATION INCLUDE L"/OUT.. BIN DEMO02.EXE" DEMO02.COB M (1) (2) (3) (4) (1) インクルードファイルを検索するディレクトリを指定するオプション (2) リンカ用のオプション (3) QL 埋込み COBOL プログラムのファイル名 (4) cobol コマンドまたは cobol32 コマンド用のオプション オプション sqlcobol では 使用する登録集原文ファイルの配置ディレクトリなどのオプションが指定できます 文字コード系として UNICODE を使用する場合は un オプションを指定してください 64 ビットで実行する QL 埋込み COBOL プログラムをコンパイル リンクする場合は v9 オプションを指定してください また マルチスレッド環境で動作する QL 埋込み COBOL プログラムをコンパイル リンクする場合は T オプションを指定してください 参照 オプションの詳細については コマンドリファレンス を参照してください リンカ用のオプション sqlcobol はロードモジュールを作成するために リンカを実行します このとき リンカに渡すオプションを指定します QL 埋込み COBOL プログラムのファイル名 QL 埋込み COBOL プログラムで記述されたアプリケーションの ソースファイルを指定します cobol コマンドまたは cobol32 コマンド用のオプション sqlcobol はロードモジュールを作成するために cobol コマンドまたは cobol32 コマンドを実行します このとき cobol コマンドまたは cobol32 コマンドに渡すオプションを指定します 185

193 プレコンパイルとコンパイルを分けて実行する場合 アプリケーションをコンパイル リンクするために まず sqlpc コマンドまたは sqlpcob コマンドを利用してプレコンパイルします アプリケーションをプレコンパイルすることによって アプリケーション中の QL 文をコンパイルし 標準の C プログラムまたは COBOL プログラムに変換します その後 cl コマンド cobol コマンドまたは cobol32 コマンドを利用してロードモジュールを作成します 注意 プレコンパイルによって作成されたソースファイルは 中身を変更しないでください C 言語を使用する場合 C 言語用のプレコンパイルコマンドは sqlpc です sqlpc コマンドの入力ファイルは QL 埋込み C プログラムのソースファイルです このファイル名には拡張子として.C および.LT 以外を指定する必要があります 出力ファイルは C プログラムのソースファイルで ファイル名に拡張子として.C が付きます 参照 sqlpc コマンドの詳細については コマンドリファレンス を参照してください プレコンパイルが終了したら ロードモジュールを作成します ロードモジュールを作成するためには cl コマンドを実行します C 言語の場合は 文字コード系に依存しないロードモジュールが作成されます 文字コード系は実行時にクライアント用の動作環境ファイルまたは環境変数で指定します 186

194 C 言語を使用した コンパイル リンクの例を以下に示します 例 主プログラムである QL 埋込み C プログラム (DEMO03.C) を コンパイル リンクします ロードモジュールは DEMO03.EXE とします cd C UER DEFAULT APPLICATION RC sqlpc DEMO03.C (1) cl /Fe.. BIN DEMO03.EXE F3CWDRV.LIB DEMO03.C (2) (3) (1) QL 埋込み C プログラムのファイル名 (2) RDB ライブラリを指定するオプション (3) プレコンパイル後の QL 埋込み C プログラムのファイル名 COBOL を使用する場合 COBOL 用のプレコンパイルコマンドは sqlpcob です sqlpcob コマンドの入力ファイルは QL 埋込み COBOL プログラムのソースファイルです このファイル名には拡張子として.COB および.LT 以外を指定する必要があります 出力ファイルは COBOL プログラムのソースファイルで ファイル名に拡張子として.COB が付きます 参照 sqlpcob コマンドの詳細については コマンドリファレンス を参照してください プレコンパイルが終了したら ロードモジュールを作成します COBOL を使用した コンパイル リンクの例を以下に示します 32 ビットで実行するアプリケーション ロードモジュールを作成するためには cobol32 コマンドを実行します 例 主プログラムである QL 埋込み COBOL プログラム (DEMO04.COBOL) を コンパイル リンクします ロードモジュールは DEMO04.EXE とします cd C UER DEFAULT APPLICATION RC sqlpcob DEMO04.COBOL (1) cobol32 M DEMO04.COB (2) link /out.. BIN DEMO04.EXE F3CWDRV.LIB DEMO04.OBJ F3BICIMP.LIB LIBC.LIB KERNEL32.LIB UER32.LIB (3) (1) QL 埋込み COBOL プログラムのファイル名 (2) プレコンパイル後の QL 埋込み COBOL プログラムのファイル名 (3) RDB ライブラリを指定するオプション 64 ビットで実行するアプリケーション ロードモジュールを作成するためには cobol コマンドを実行します 例 Windows erver(r) 2003 for Itanium または Windows erver(r) 2008 for Itanium において 64 ビットで実行する場合の例を以下に示します 主プログラムである QL 埋込み COBOL プログラム (DEMO05.COBOL) を コンパイル リンクします ロードモジュールは DEMO05.EXE とします 187

195 cd C UER DEFAULT APPLICATION RC sqlpcob v9 DEMO05.COBOL (1) cobol M DEMO05.COB (2) link /out.. BIN DEMO05.EXE F3CWDRV_IA64.LIB DEMO05.OBJ F6AGCIMP.LIB LIBCMT.LIB BUFFEROVERFLOWU.LIB KERNEL32.LIB UER32.LIB (3) (1) QL 埋込み COBOL プログラムのファイル名 (2) プレコンパイル後の QL 埋込み COBOL プログラムのファイル名 (3) RDB ライブラリを指定するオプション コンパイル リンクする場合に必要なオプション cl コマンド cobol コマンドおよび cobol32 コマンドの実行時には 必要に応じてオプションを指定します アプリケーションをコンパイル リンクする場合に必要なオプションを以下に示します 表 5.9 アプリケーションをコンパイル リンクする場合に必要なオプション 指定するオプション オプションの役割 M COBOL の場合に指定 F3CWDRV.LIB F3CWDRVM.LIB F3CWDRV_IA64.LIB F3CWDRVM_IA64.LIB MT F3CWDRV_x64.LIB F3CWDRVM_x64.LIB RDB ライブラリの指定 (32 ビットのシングルスレッドで動作するアプリケーションをコンパイル リンクする場合に使用 ) RDB ライブラリの指定 (32 ビットのマルチスレッドで動作するアプリケーションをコンパイル リンクする場合に使用 ) RDB ライブラリの指定 (Windows erver(r) 2003 for Itanium または Windows erver(r) 2008 for Itanium において 64 ビットのシングルスレッドで動作するアプリケーションをコンパイル リンクする場合に使用 ) RDB ライブラリの指定 (Windows erver(r) 2003 for Itanium または Windows erver(r) 2008 for Itanium において 64 ビットのマルチスレッドで動作するアプリケーションをコンパイル リンクする場合に使用 ) マルチスレッドで動作するアプリケーションをコンパイル リンクする場合に指定 RDB ライブラリの指定 (Windows(R) XP for x64 Windows erver(r) 2003 x64 Editions または Windows erver(r) 2008 for x64 において 64 ビットのシングルスレッドで動作するアプリケーションをコンパイル リンクする場合に使用 ) RDB ライブラリの指定 (Windows(R) XP for x64 Windows erver(r) 2003 x64 Editions または Windows erver(r) 2008 for x64 において 64 ビットのマルチスレッドで動作するアプリケーションをコンパイル リンクする場合に使用 ) 188

196 5.2.4 複数のコンパイル単位から構成されるアプリケーションのコンパイル リンクの方法 前項では QL 文を使用するアプリケーションが 1 つのコンパイル単位である場合の コンパイル リンクの方法について説明しました 一方 大規模なアプリケーションの開発においては 複数のコンパイル単位から構成されるアプリケーションを作成し これらをコンパイル リンクするような開発方法が必要となります 本項では このようなアプリケーションが QL 文を使用する場合の コンパイル リンクの方法について説明します 複数のコンパイル単位から構成されるアプリケーションでは ロードモジュールはアプリケーションの開発や保守の形態 および実行環境を考慮して それぞれのコンパイル単位を静的リンクするか または動的リンクするかを選択します COBOL 言語を使用した場合 コンパイル単位にコード系を指定できますが 1 つのロードモジュール内では コード系を統一しなければなりません 静的リンクする場合のコンパイル リンク 複数のコンパイル単位を静的リンクする場合のコンパイル リンクの方法を以下に示します 図 5.8 複数のコンパイル単位を静的リンクする場合のコンパイル リンクの方法 QL 文を使用するコンパイル単位は sqlcc または sqlcobol を使用してコンパイル リンクを行います 参照 sqlcc および sqlcobol のオプションの指定方法については コマンドリファレンス を参照してください アプリケーションによっては QL 文を使用しないコンパイル単位が存在する場合があります QL 文を使用しないコンパイル単位は cl コマンド cobol コマンドまたは cobol32 コマンドを使用してコンパイル リンクを行います また ロードモジュールを静的リンクして作成するには 副プログラムのオブジェクトファイルを作成し 主プログラムに静的にリンクする必要があります アプリケーションを静的リンクする場合に必要なオプションを以下に示します 189

197 表 5.10 アプリケーションを静的リンクする場合に必要なオプション コンパイル対象の性質指定するオプション備考 QL 文を含むコンパイル単位 QL 文を含まないコンパイル単位 主プログラム 副プログラムのオブジェクトファイル名 リンクする副プログラム M COBOL の場合に指定 副プログラム /c オブジェクトファイルの作成 主プログラム 副プログラムのオブジェクトファイル名 リンクする副プログラム M COBOL の場合に指定 F3CWDRV.LIB F3CWDRVM.LIB F3CWDRV_IA64.LIB F3CWDRVM_IA64.LI B F3CWDRV_x64.LIB F3CWDRVM_x64.LIB RDB ライブラリの指定 (32 ビットのシングルスレッドで動作するアプリケーションを静的リンクする場合に使用 ) RDB ライブラリの指定 (32 ビットのマルチスレッドで動作するアプリケーションを静的リンクする場合に使用 ) RDB ライブラリの指定 (Windows erver(r) 2003 for Itanium または Windows erver(r) 2008 for Itanium において 64 ビットのシングルスレッドで動作するアプリケーションを静的リンクする場合に使用 ) RDB ライブラリの指定 (Windows erver(r) 2003 for Itanium または Windows erver(r) 2008 for Itanium において 64 ビットのマルチスレッドで動作するアプリケーションを静的リンクする場合に使用 ) RDB ライブラリの指定 (Windows(R) XP for x64 Windows erver(r) 2003 x64 Editions または Windows erver(r) 2008 for x64 において 64 ビットのシングルスレッドで動作するアプリケーションを静的リンクする場合に使用 ) RDB ライブラリの指定 (Windows(R) XP for x64 Windows erver(r) 2003 x64 Editions または Windows erver(r) 2008 for x64 において 64 ビットのマルチスレッドで動作するアプリケーションを静的リンクする場合に使用 ) 副プログラム /c オブジェクトファイルの作成 190

198 C 言語使用時の例 例 1 QL 文を使用する主プログラム (DEMO04MAIN.C) と QL 文を使用する 2 個の副プログラム (DEMO04UB1.C DEMO04UB2.C) を静的リンクします ロードモジュール名は DEMO04.EXE とします cd C UER DEFAULT APPLICATION RC sqlcc DEMO04UB1.C /c sqlcc DEMO04UB2.C /c sqlcc L"/out.. BIN DEMO04.EXE DEMO04UB1.OBJ DEMO04UB2.OBJ" DEMO04MAIN.C 例 2 QL 文を使用しない主プログラム (DEMO05MAIN.C) と QL 文を使用する副プログラム (DEMO05UB1.C) および QL 文を使用しない副プログラム (DEMO05UB2.C) を静的リンクします ロードモジュール名は DEMO05.EXE とします cd C UER DEFAULT APPLICATION RC sqlcc DEMO05UB1.C /c cl /c DEMO05UB2.C cl DEMO05MAIN.C /Fe.. BIN DEMO05.EXE DEMO05UB1.OBJ DEMO05UB2.OBJ F3CWDRV.LIB 例 3 Windows erver(r) 2003 for Itanium または Windows erver(r) 2008 for Itanium において 64 ビットで実行するアプリケーションを静的リンクする場合の例を示します QL 文を使用しない主プログラム (DEMO08MAIN.C) と QL 文を使用する副プログラム (DEMO08UB1.C) および QL 文を使用しない副プログラム (DEMO08UB2.C) を静的リンクします ロードモジュール名は DEMO08.EXE とします cd C UER DEFAULT APPLICATION RC sqlcc v9 DEMO08UB1.C /c cl /c DEMO08UB2.C cl DEMO08MAIN.C /Fe.. BIN DEMO08.EXE DEMO08UB1.OBJ DEMO08UB2.OBJ F3CWDRV_IA64.LIB 例 4 Windows(R) XP for x64 Windows erver(r) 2003 x64 Editions または Windows erver(r) 2008 for x64 において 64 ビットで実行するアプリケーションを静的リンクする場合の例を示します QL 文を使用しない主プログラム (DEMO08MAIN.C) と QL 文を使用する副プログラム (DEMO08UB1.C) および QL 文を使用しない副プログラム (DEMO08UB2.C) を静的リンクします ロードモジュール名は DEMO08.EXE とします cd C UER DEFAULT APPLICATION RC sqlcc v9 DEMO08UB1.C /c cl /c DEMO08UB2.C cl DEMO08MAIN.C /Fe.. BIN DEMO08.EXE DEMO08UB1.OBJ DEMO08UB2.OBJ F3CWDRV_x64.LIB COBOL 使用時の例 例 1 QL 文を使用する主プログラム (DEMO06MAIN.COB) と QL 文を使用する 2 個の副プログラム (DEMO06UB1.COB DEMO06UB2.COB) を静的リンクします ロードモジュール名は DEMO06.EXE とします cd C UER DEFAULT APPLICATION RC sqlcobol DEMO06UB1.COB sqlcobol DEMO06UB2.COB sqlcobol L"/out.. BIN DEMO06.EXE DEMO06UB1.OBJ DEMO06UB2.OBJ" DEMO06MAIN.COB M 191

199 例 2 QL 文を使用しない主プログラム (DEMO07MAIN.COBOL) と QL 文を使用する副プログラム (DEMO07UB1.COB) および QL 文を使用しない副プログラム (DEMO07UB2.COBOL) を静的リンクします ロードモジュール名は DEMO07.EXE とします cd C UER DEFAULT APPLICATION RC sqlcobol DEMO07UB1.COB cobol32 DEMO07UB2.COBOL cobol32 M DEMO07MAIN.COBOL link /out.. BIN DEMO07.EXE F3CWDRV.LIB DEMO07MAIN.OBJ DEMO07UB1.OBJ DEMO07UB2.OBJ F3BICIMP.LIB LIBC.LIB KERNEL32.LIB UER32.LIB 例 3 Windows erver(r) 2003 for Itanium または Windows erver(r) 2008 for Itanium において 64 ビットで実行するアプリケーションを静的リンクする場合の例を示します QL 文を使用しない主プログラム (DEMO09MAIN.COBOL) と QL 文を使用する副プログラム (DEMO09UB1.COB) および QL 文を使用しない副プログラム (DEMO09UB2.COBOL) を静的リンクします ロードモジュール名は DEMO09.EXE とします cd C UER DEFAULT APPLICATION RC sqlcobol v9 DEMO09UB1.COB cobol DEMO09UB2.COBOL cobol M DEMO09MAIN.COBOL link /out.. BIN DEMO09.EXE F3CWDRV_IA64.LIB DEMO09MAIN.OBJ DEMO09UB1.OBJ DEMO09UB2.OBJ F6AGCIMP.LIB LIBCMT.LIB BUFFEROVERFLOWU.LIB KERNEL32.LIB UER32.LIB 動的リンクする場合のコンパイル リンク 複数のコンパイル単位を動的リンクする場合のコンパイル リンクの方法を以下に示します 図 5.9 複数のコンパイル単位を動的リンクする場合のコンパイル リンクの方法 QL 文を使用するコンパイル単位は sqlcc または sqlcobol を使用してコンパイル リンクを行ます 192

200 参照 sqlcc および sqlcobol のオプションの指定方法については コマンドリファレンス を参照してください アプリケーションによっては QL 文を使用しないコンパイル単位が存在する場合があります QL 文を使用しないコンパイル単位は cl コマンド cobol コマンドまたは cobol32 コマンドを使用してコンパイル リンクを行います また ロードモジュールを動的リンクして作成するためには 副プログラムは共用ライブラリにロードモジュールとして作成し 主プログラムのコンパイル リンク時にリンクする副プログラムのロードモジュール名を指定する必要があります アプリケーションを動的リンクする場合に必要なオプションを以下に示します 表 5.11 アプリケーションを動的リンクする場合に必要なオプション コンパイル対象の性質指定するオプション備考 QL 文を含むコンパイル単位 QL 文を含まないコンパイル単位 主プログラム 副プログラムの DLL 名 リンクする副プログラム M COBOL の場合に指定 副プログラム動的リンクオプション動的リンクの指定 主プログラム 副プログラムの DLL 名 リンクする副プログラム M COBOL の場合に指定 副プログラム動的リンクオプション動的リンクの指定 C 言語使用時の例 例 1 QL 文を使用する主プログラム (DEMO10MAIN.C) と QL 文を使用する 2 個の副プログラム (UB1.C UB2.C) を動的リンクします DLL 名は 副プログラムを UB1.LIB および UB2.LIB とします 主プログラムのロードモジュール名は DEMO10MAIN.EXE とします cd C UER DEFAULT APPLICATION RC sqlcc L"/DLL /EXPORTUB1" UB1.C sqlcc L"/DLL /EXPORTUB2" UB2.C sqlcc L"/out.. BIN DEMO10MAIN.EXE UB1.LIB UB2.LIB" DEMO10MAIN.C 例 2 64 ビットで実行するアプリケーションを動的リンクする場合の例を示します QL 文を使用する主プログラム (DEMO15MAIN.C) と QL 文を使用する 2 個の副プログラム (UB11.C UB12.C) を動的リンクします DLL 名は 副プログラムを UB11.LIB および UB12.LIB とします 主プログラムのロードモジュール名は DEMO15MAIN.EXE とします cd C UER DEFAULT APPLICATION RC sqlcc v9 L"/DLL /EXPORTUB11" UB11.C sqlcc v9 L"/DLL /EXPORTUB12" UB12.C sqlcc v9 L"/out.. BIN DEMO15MAIN.EXE UB11.LIB UB12.LIB" DEMO15MAIN.C 例 3 QL 文を使用しない主プログラム (DEMO11MAIN.C) と QL 文を使用する副プログラム (UB3.C) および QL 文を使用しない副プログラム (UB4.C) を動的リンクします 副プログラムのライブラリ名は UB3.LIB および UB4.LIB 主プログラムのロードモジュール名を DEMO11MAIN.EXE とします cd C UER DEFAULT APPLICATION RC sqlcc L"/DLL /EXPORTUB3" UB3.C cl /c UB4.C 193

201 link /DLL /EXPORTUB4 UB4.OBJ cl /Fe.. BIN DEMO11MAIN.EXE DEMO11MAIN.C UB3.LIB UB4.LIB COBOL 使用時の例 例 1 QL 文を使用する主プログラム (DEMO12MAIN.COB) と QL 文を使用する 2 個の副プログラム (UB5.COB UB6.COB) を動的リンクします DLL 名は 副プログラムを UB5.LIB および UB6.LIB とします 主プログラムのロードモジュール名は DEMO12MAIN.EXE とします cd C UER DEFAULT APPLICATION RC sqlcobol L"/DLL /EXPORTUB5" UB5.COB sqlcobol L"/DLL /EXPORTUB6" UB6.COB sqlcobol L"/out.. BIN DEMO12MAIN.EXE UB5.LIB UB6.LIB" DEMO12MAIN.COB M 例 2 64 ビットで実行するアプリケーションを動的リンクする場合の例を示します QL 文を使用する主プログラム (DEMO16MAIN.COB) と QL 文を使用する 2 個の副プログラム (UB13.COB UB14.COB) を動的リンクします DLL 名は 副プログラムを UB13.LIB および UB14.LIB とします 主プログラムのロードモジュール名は DEMO16MAIN.EXE とします cd C UER DEFAULT APPLICATION RC sqlcobol v9 L"/DLL /EXPORTUB13" UB13.COB sqlcobol v9 L"/DLL /EXPORTUB14" UB14.COB sqlcobol v9 L"/out.. BIN DEMO16MAIN.EXE UB13.LIB UB14.LIB" DEMO16MAIN.COB M 例 3 QL 文を使用しない主プログラム (DEMO13MAIN.COBOL) と QL 文を使用する副プログラム (UB7.COB) および QL 文を使用しない副プログラム (UB8.COBOL) を動的リンクします 副プログラムの DLL 名は UB7.LIB および UB8.LIB 主プログラムのロードモジュール名を DEMO13MAIN.EXE とします cd C UER DEFAULT APPLICATION RC sqlcobol L"/DLL /EXPORTUB7" UB7.COB cobol32 UB8.COBOL link /DLL /EXPORTUB8 UB8.OBJ F3BICIMP.LIB LIBC.LIB KERNEL32.LIB UER32.LIB cobol32 M DEMO13MAIN.COBOL link /out.. BIN DEMO13MAIN.EXE DEMO13MAIN.OBJ UB7.LIB UB8.LIB F3BICIMP.LIB LIBC.LIB KERNEL32.LIB UER32.LIB 例 4 64 ビットで実行するアプリケーションを動的リンクする場合の例を示します QL 文を使用しない主プログラム (DEMO17MAIN.COBOL) と QL 文を使用する副プログラム (UB15.COB) および QL 文を使用しない副プログラム (UB16.COBOL) を動的リンクします 副プログラムの DLL 名は UB15.LIB および UB16.LIB 主プログラムのロードモジュール名を DEMO17MAIN.EXE とします cd C UER DEFAULT APPLICATION RC sqlcobol v9 L"/DLL /EXPORTUB15" UB15.COB cobol UB16.COBOL link /DLL /EXPORTUB16 UB16.OBJ F6AGCIMP.LIB LIBCMT.LIB BUFFEROVERFLOW.LIB KERNEL32.LIB UER32.LIB cobol M DEMO17MAIN.COBOL link /out.. BIN DEMO17MAIN.EXE DEMO17MAIN.OBJ UB15.LIB UB16.LIB F6AGCIMP.LIB LIBCMT.LIB BUFFEROVERFLOW.LIB KERNEL32.LIB UER32.LIB 194

202 動的プログラム構造のコンパイル リンク 動的プログラム構造のアプリケーションは 以下に示す方法でコンパイル リンクします 動的プログラム構造は COBOL のアプリケーションだけ利用できます 図 5.10 動的プログラム構造の場合のコンパイル リンクの方法 QL 文を使用するコンパイル単位は sqlcobol を使用してコンパイル リンクを行います 参照 sqlcobol のオプションの指定方法については コマンドリファレンス を参照してください 動的プログラム構造のロードモジュールを動的リンクして作成するためには 主プログラムのコンパイル リンク時に コンパイルオプション DLOAD を指定します 副プログラムは共用ライブラリにロードモジュールとして作成しておきます アプリケーションを動的リンクする場合に必要なオプションを以下に示します 表 5.12 アプリケーションを動的リンクする場合に必要なオプション コンパイル対象の性質指定するオプション備考 QL 文を含むコンパイル単位 例 1 WC, "DLOAD" 動的プログラム構造の指定 主プログラム M COBOLの場合に指定 副プログラム動的リンクオプション動的リンクの指定 動的プログラム構造の QL 文を使用する主プログラム (DEMO14MAIN.COB) と QL 文を使用する 2 個の副プログラム (UB9.COB UB10.COB) を動的リンクします DLL 名は 副プログラムを UB9.LIB および UB10.LIB 主プログラムのロードモジュール名は DEMO14MAIN.EXE とします cd C UER DEFAULT APPLICATION RC sqlcobol L"/DLL /EXPORTUB9" UB9.COB sqlcobol L"/DLL /EXPORTUB10" UB10.COB sqlcobol L"/out.. BIN DEMO14MAIN.EXE UB9.LIB UB10.LIB" DEMO14MAIN.COB M WC,"DLOAD" 195

203 例 2 64 ビットで実行するアプリケーションを動的リンクする場合の例を示します 動的プログラム構造の QL 文を使用する主プログラム (DEMO18MAIN.COB) と QL 文を使用する 2 個の副プログラム (UB17.COB UB18.COB) を動的リンクします DLL 名は 副プログラムを UB17.LIB および UB18.LIB 主プログラムのロードモジュール名は DEMO18MAIN.EXE とします cd C UER DEFAULT APPLICATION RC sqlcobol v9 L"/DLL /EXPORTUB17" UB17.COB sqlcobol v9 L"/DLL /EXPORTUB18" UB18.COB sqlcobol v9 L"/out.. BIN DEMO18MAIN.EXE UB17.LIB UB18.LIB" DEMO18MAIN.COB M WC,"DLOAD" コンパイル時のコネクション先の指定 アプリケーションは 一般的にはアプリケーションでコネクションを操作して データベースをアクセスしますが 以下の方法により アプリケーションにコネクション操作を記述しなくても動作することが可能となります この場合 以下の注意が必要です アプリケーションからローカルのデータベースを利用します アプリケーション内に CONNECT 文は記述しません コンパイル時にデータベースを指定する アプリケーションをコンパイル (sqlcc または sqlcobol) するときに アプリケーションで利用するデータベース名を指定します このオプションを指定すると アプリケーションの実行時に自動的に指定したデータベースと結合されます このため アプリケーションからの CONNECT 文は実行できません 例 1 データベース名を DB01 とした場合の指定方法 (C プログラムの場合 ) cd C UER DEFAULT APPLICATION RC sqlcc d DB01 L/out.. BIN DEMO08.EXE DEMO08.C データベース名を指定する 例 2 データベース名を DB01 とした場合の指定方法 (COBOL プログラムの場合 ) cd C UER DEFAULT APPLICATION RC sqlcobol d DB01 L"/out.. BIN DEMO09.EXE DEMO09UB.OBJ" データベース名を指定する DEMO09MAIN.COB M 196

204 第 6 章 アプリケーションの実行 アプリケーションのコンパイル リンクが完了すると 実際に実行してデバッグを行い 意図した動作が行われることを確認します また アプリケーションの実行によって ymfoware/rdb がどのようにデータベースにアクセスしているかを知るため アクセスプランを取得し 解析します アクセスプランを解析することによって データベースを適切にチューニングすることができます アクセスプランの取得および解析の詳細については QLTOOL ユーザーズガイド を参照してください 本章では アプリケーションを実行するために必要な作業と アプリケーションのデバッグ方法について説明します 6.1 アプリケーションの実行 アプリケーションの実行作業の流れを以下に示します 図 6.1 アプリケーションの起動操作の流れ 注 ) ネットワーク構成の設定は Windows(R) の場合に必要です 197

205 6.1.1 ERVER_PEC の指定 リモートのデータベースにアクセスする場合 アプリケーションを起動するには クライアント用の動作環境ファイルに ERVER_PEC を指定します ERVER_PEC は サーバと通信するために必要な情報を設定するパラメタです リモートのデータベースにアクセスしない場合 ERVER_PEC は指定しません [ クライアント用の動作環境ファイル ] ERVER_PEC = (RDB2_TCP,V1,DB1,OT1,2050) クライアント用の動作環境ファイルには そのほかにも動作環境をチューニングするためのパラメタがあります しかし ymfoware/rdb では システムの標準的な実行環境を用意しているので ERVER_PEC 以外のパラメタを設定しなくても アプリケーションを実行できるようになっています 動作環境のチューニングについては 6.4 アプリケーションのチューニング を参照してください アプリケーションの起動 (UNIX 系の場合 ) ここでは UNIX 系を使用している場合に アプリケーションを実行するうえで必要な作業を説明します ymfoware/rdb の起動操作 アプリケーションの起動操作 ymfoware/rdb の起動操作 リモートのデータベースにアクセスする場合 サーバ側には ポート番号やシステム用の動作環境ファイルの設定が必要です 参照 ymfoware/rdb を起動する方法については 利用するサーバに対応した セットアップガイド を参照してください アプリケーションの起動操作 アプリケーションを起動するためには 以下の作業を順番に行います 1. 環境変数を設定する 2. 使用する動作環境ファイルを指定する 3. アプリケーションを起動する 1) 環境変数を設定する アプリケーションを実行する前に 以下の環境変数を設定します 環境変数 LD_LIBRARY_PAT_64 の設定 アプリケーションのコンパイル リンク時に 64 ビット用のオプションでコンパイル リンクした場合 環境変数 LD_LIBRARY_PAT_64 に RDB ライブラリの格納ディレクトリを設定します RDB ライブラリの格納ディレクトリ 例 1 /opt/funrdb2b/lib C 言語を使用する場合で 環境変数 LD_LIBRARY_PAT_64 の設定を C シェルの setenv コマンドで行う場合の例を示します setenv LD_LIBRARY_PAT_64 /opt/funrdb2b/lib$ld_library_pat_64 198

206 例 2 C 言語を使用する場合で 環境変数 LD_LIBRARY_PAT_64 の設定を bash B シェル K シェルで行う場合の例を示します LD_LIBRARY_PAT_64=/opt/FUNrdb2b/lib$LD_LIBRARY_PAT_64; export LD_LIBRARY_PAT_64 環境変数 LD_LIBRARY_PAT の設定 環境変数 LD_LIBRARY_PAT に RDB ライブラリの格納ディレクトリを設定します RDB ライブラリの格納ディレクトリ 例 1 /opt/funrdb2b/lib C 言語を使用する場合で 環境変数 LD_LIBRARY_PAT の設定を C シェルの setenv コマンドで行う場合の例を示します setenv LD_LIBRARY_PAT /opt/funrdb2b/lib$ld_library_pat 例 2 C 言語を使用する場合で 環境変数 LD_LIBRARY_PAT の設定を bash B シェル K シェルで行う場合の例を示します LD_LIBRARY_PAT=/opt/FUNrdb2b/lib $LD_LIBRARY_PAT; export LD_LIBRARY_PAT 環境変数 LD_LIBRARY_PAT の設定 環境変数 LD_LIBRARY_PAT に RDB ライブラリの格納ディレクトリを設定します また アプリケーションのコンパイル リンク時に 64 ビット用のオプションでコンパイル リンクした場合 環境変数 LD_LIBRARY_PAT に 64 ビット RDB ライブラリの格納ディレクトリを設定します RDB ライブラリの格納ディレクトリ /opt/fjvrdb2b/lib 64 ビット RDB ライブラリの格納ディレクトリ 例 1 /opt/fjvrdb2b/lib/lib64 C 言語を使用する場合で 環境変数 LD_LIBRARY_PAT の設定を C シェルの setenv コマンドで行う場合の例を示します setenv LD_LIBRARY_PAT /opt/fjvrdb2b/lib$ld_library_pat 例 2 C 言語を使用する場合で 環境変数 LD_LIBRARY_PAT の設定を bash B シェル K シェルで行う場合の例を示します LD_LIBRARY_PAT=/opt/FJVrdb2b/lib$LD_LIBRARY_PAT; export LD_LIBRARY_PAT 199

207 動的プログラム構造のアプリケーション実行時の注意事項 動的プログラム構造のアプリケーションを実行する場合は 環境変数 LD_LIBRARY_PAT に 以下の格納ディレクトリを設定します RDB ライブラリ 64 ビット RDB ライブラリ 利用者が作成したロードモジュール 環境変数 RDBNAME の設定 ( マルチ RDB 運用の場合 ) マルチ RDB 運用を行う場合は アプリケーションで処理を行う対象となる ymfoware/rdb 環境のシステム名を 環境変数 RDBNAME に設定します この環境変数は ローカルアクセスの場合のみ有効となります 参照 マルチ RDB 運用についての詳細は 利用するサーバに対応した セットアップガイド を参照してください 例 1 C 言語を使用する場合で 環境変数 RDBNAME の設定を C シェルの setenv コマンドで行う場合の例を示します (RDB システム名を rdbsys1 とした場合 ) setenv RDBNAME rdbsys1 例 2 C 言語を使用する場合で 環境変数 RDBNAME の設定を bash B シェル K シェルで行う場合の例を示します (RDB システム名を rdbsys1 とした場合 ) RDBNAME=rdbsys1; export RDBNAME 2) 使用する動作環境ファイルを指定する アプリケーションの動作環境のチューニングを行う場合 使用するクライアント用の動作環境ファイルを作成します 通常 ymfoware/rdb は アプリケーション実行時のカレントディレクトリにある動作環境ファイルのひな型と同名の以下の動作環境ファイルを使用します fssqlenvc 他のファイル名または格納ディレクトリの動作環境ファイルを使用する場合は 環境変数 QLRTENV に動作環境ファイルのパス名を指定してください 例 1 C 言語を使用する場合で 環境変数 QLRTENV の設定を C シェルの setenv コマンドで行う場合の例を示します ( 動作環境ファイルのパス名を /home/user1/sqlenv1 とした場合 ) setenv QLRTENV /home/user1/sqlenv1 例 2 C 言語を使用する場合で 環境変数 QLRTENV の設定を bash B シェル K シェルで行う場合の例を示します ( 動作環境ファイルのパス名を /home/user1/sqlenv1 とした場合 ) QLRTENV=/home/user1/sqlenv1; export QLRTENV 3) アプリケーションを起動する 以上の操作がすべて完了したら アプリケーションの起動を行います 200

208 例 アプリケーション sample を起動するコマンド入力例を以下に示します ample アプリケーションの起動 (Windows(R) の場合 ) ここでは Windows(R) を使用している場合に アプリケーションを実行するうえで必要な作業を説明します ymfoware/rdbの起動操作 アプリケーションの起動操作 アプリケーションを起動するときの注意事項 ymfoware/rdb の起動操作 リモートのデータベースにアクセスする場合 サーバ側には ポート番号やシステム用の動作環境ファイルの設定が必要です 参照 ymfoware/rdb を起動する方法については セットアップガイド を参照してください アプリケーションの起動操作 アプリケーションを起動するためには 以下の作業を順番に行います 1. ネットワーク構成を設定する 2. 環境変数を設定する 3. 使用する動作環境ファイルを指定する 4. アプリケーションを起動する 1) ネットワーク構成を設定する リモートのデータベースにアクセスする場合 ymfoware/rdb は TCP/IP プロトコルを利用して アプリケーションとサーバとの通信を行います このため アプリケーションが動作するコンピュータのネットワーク構成 (hosts ファイル ) に TCP/IP プロトコルの情報を設定しておく必要があります TCP/IP プロトコルの設定では アプリケーションがコネクションを接続するサーバの IP アドレスとホスト名を設定します ホスト名は 動作環境ファイルの ERVER_PEC のホスト名と同じ名前を指定してください 2) 環境変数を設定する アプリケーションを実行する前に 以下の環境変数を設定します 環境変数 PAT の設定 ymfoware/rdb または Esql のインストールにより アプリケーションの実行に必要な環境変数 PAT が自動的に設定されます 環境変数 PAT には RDB ライブラリ ( サーバ (Windows(R) 2000 Windows erver(r) 2003 および Windows erver(r) 2008) でアプリケーションを実行する場合 ) または QL ランタイムライブラリ ( クライアント (Windows(R)) でアプリケーションを実行する場合 ) の DLL が格納されているディレクトリ名が設定されます PAT は システムに対して必要な環境変数です したがって PAT の変更が必要な場合は 以下の方法で行ってください 1. 以下の方法で [ 環境変数 ] ダイアログボックスを表示します Windows(R) 2000 の場合 1.[ コントロールパネル ] で [ システム ] アイコンをダブルクリックします 2.[ 詳細 ] タブの [ 環境変数 ] ボタンをクリックします Windows(R) XP の場合 201

209 1.[ コントロールパネル ] で [ パフォーマンスとメンテナンス ] をクリックします 2.[ システム ] をクリックし [ 詳細設定 ] タブの [ 環境変数 ] ボタンをクリックします Windows erver(r) 2003の場合 1.[ コントロールパネル ] で [ システム ] をクリックします 2.[ 詳細設定 ] タブの [ 環境変数 ] ボタンをクリックします Windows Vista(R) の場合 1.[ コントロールパネル ] で [ システムとメンテナンス ] をクリックします 2.[ システム ] をクリックし [ 設定と変更 ] をクリックします 3.[ 詳細設定 ] タブの [ 環境変数 ] をクリックします Windows erver(r) 2008の場合 1.[ コントロールパネル ] で [ システムとメンテナンス ] をクリックします 2.[ システム ] をクリックし [ システムの詳細設定 ] をクリックします 3.[ 詳細設定 ] タブの [ 環境変数 ] ボタンをクリックします 1. システム環境変数の PAT を選択して [ 編集 ] ボタンをクリックします 2. [ システム変数の編集 ] ダイアログボックスでディレクトリ名を設定します 環境変数 PAT の設定の例 (ymfoware erver のインストール先ディレクトリが C FWV の場合 ) を示します 202

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String 目次 1.SqlCtl クラスリファレンス 2 (1)Connect() メソッド 2 (2)DisConnect() メソッド 3 (3)Commit() メソッド 3 (4)Rollback() メソッド 4 2.SqlStm クラスリファレンス 5 (1)Prepare() メソッド 5 (2)Execute() メソッド 6 (3)Release() メソッド 6 (4)Immediate()

More information

マニュアル訂正連絡票

マニュアル訂正連絡票 < マニュアル訂正連絡票 > ASP レプリケーションサービス説明書 V25 [J2K 0-1056-01] 2015 年 12 月 22 日発行 4.7. 2ASP と PC 間のレプリケーション ~( 中略 )~ (3) オフライン同期 (CSVLink の利用 ) ASP の CNVDF コマンドでレプリケーション対象ファイルのデータを移出した CSV ファイルを PC に転送し 各 DBMS

More information

プレポスト【問題】

プレポスト【問題】 1/5 ページ プレポスト データベース基礎 受講日程受講番号氏名 1 データベースの特徴で間違っているものを選びなさい 1. データの一元管理が可能 2. データの重複が少ない 3. プログラムとの関係が1 対 1 4. データの整合性の確保 2 ANSI/SPARC による 3 層スキーマについて正しいものを選びなさい 1. 外部スキーマ : プログラムに必要な部分のデータ構造を定義概念スキーマ

More information

ユーティリティ 管理番号 内容 対象バージョン 157 管理情報バッチ登録コマンド (utliupdt) のメッセージ出力に対し リダイレクトまたはパイプを使用すると メッセージが途中までしか出 力されないことがある 267 転送集計コマンド (utllogcnt) でファイル ID とホスト名の組

ユーティリティ 管理番号 内容 対象バージョン 157 管理情報バッチ登録コマンド (utliupdt) のメッセージ出力に対し リダイレクトまたはパイプを使用すると メッセージが途中までしか出 力されないことがある 267 転送集計コマンド (utllogcnt) でファイル ID とホスト名の組 レベルアップ詳細情報 < 製品一覧 > 製品名 バージョン HULFT BB クライアント for Windows Type BB1 6.3.0 HULFT BB クライアント for Windows Type BB2 6.3.0 < 対応 OS> Windows2000, WindowsXP, WindowsServer2003 < 追加機能一覧 > HULFT BB クライアント 管理番号 内容

More information

今さら聞けない!? Oracle入門 ~前編~

今さら聞けない!? Oracle入門 ~前編~ Oracle Direct Seminar 今さら聞けない!? Oracle 入門 ~ 前編 ~ 日本オラクル株式会社 Agenda 1. Oracle の基本動作 2. Oracle のファイル群 3. Oracle のプロセス群と専用メモリ領域 4. データベース内部動作 今さら聞けない!? オラクル入門 ~ 後編 ~ 4. データベース内部動作

More information

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt 開発編第 5 章補足 DB2 組み込み SQL 本書に含まれている情報は 正式な IBM のテストを受けていません また 明記にしろ 暗黙的にしろ なんらの保証もなしに配布されるものです この情報の使用またはこれらの技術の実施は いずれも 使用先の責任において行われるべきものであり それらを評価し 実際に使用する環境に統合する使用先の判断に依存しています それぞれの項目は

More information

Linkexpress トラブル初期調査資料 採取コマンド使用手引書

Linkexpress トラブル初期調査資料 採取コマンド使用手引書 FUJITSU Software Linkexpress Standard Edition V5.0L15 Linkexpress Enterprise Edition V5.0L15 Linkexpress トラブル初期調査資料採取コマンド使用手引書 Windows/Windows(64) J2X1-2740-14Z0(00) 2014 年 12 月 まえがき 本書の目的 本書は 下記製品でエラーが発生した場合の初期調査資料の採取方法を説明します

More information

標準化 補足資料

標準化 補足資料 高度専門データベース技術 SQL99 補足資料 ( 株 ) アイテック情報技術教育研究部 2012 年 2 月 14 日 ( はじめに ) この補足資料は,SQL99(ISO/IEC9075-2,JIS X3005-2) の必須機能 (Core SQL) のうち, SQL92に対し機能拡張が行われた部分で, 高度専門データベース技術 ( 以下, DB 技術 という ) に記載のないものについて記述する

More information

マニュアル訂正連絡票

マニュアル訂正連絡票 < マニュアル訂正連絡票 > ASP PC ファイルサーバ説明書 V28 [J2K0-5740-01C2] 2017 年 12 月 26 日発行 修正箇所 ( 章節項 )5.3.2.3 サーバ環境の設定 作成時のアクセス権 PC ファイルサーバ上に,Windows がファイルまたはディレクトリを作成する際のアクセス権を設定する. 所有者, グループ, その他に対してそれぞれ, 読み込み, 書き込み,

More information

今さら聞けない!? Oracle入門 ~後編~

今さら聞けない!? Oracle入門 ~後編~ Oracle Direct Seminar 今さら聞けない!? Oracle 入門 ~ 後編 ~ 日本オラクル株式会社 Agenda 1. Oracle の基本動作 2. Oracle のファイル群 3. Oracle のプロセス群と専用メモリ領域. データベース内部動作 今さら聞けない!? オラクル入門 ~ 後編 ~. データベース内部動作 検索時の動作更新時の動作バックアップについて

More information

マニュアル訂正連絡票

マニュアル訂正連絡票 < マニュアル訂正連絡票 > FUJITSU Software ASP システムコマンド集 V29 [J2K0592001A] 2018 年 12 月 25 日発行 修正箇所 ( 章節項 ): STRRDAT コマンドの CAPCNV のオペランド説明 CAPCNV( 整数型 ): 英小文字変換モードを指定する. @YES: 英小文字を英大文字に変換する. @NO: 英小文字をエラーにする. CAPCNV(

More information

SP-H6-KC Saison Information Systems CO.,LTD

SP-H6-KC Saison Information Systems CO.,LTD SP-H6-KC-01-03 - 1 - Saison Information Systems CO.,LTD HULFT for K Ver.2.1 移行説明書 1. 概要当説明書では 既にご使用になっている HULFT for K を旧製品からVer.2.1 に移行 ( バージョンアップ レベルアップ リビジョンアップ ) するための手順 注意事項を説明しています また バージョンアップ レベルアップ時は

More information

NEC COBOL SQL アクセス Server Runtime V1.0 COBOL SQL アクセス Server Runtime V1.0 (1 年間保守付 ) COBOL SQL アクセス Server Runtime V1.0 (1 年間時間延長保守付 ) セットアップカード SL438

NEC COBOL SQL アクセス Server Runtime V1.0 COBOL SQL アクセス Server Runtime V1.0 (1 年間保守付 ) COBOL SQL アクセス Server Runtime V1.0 (1 年間時間延長保守付 ) セットアップカード SL438 NEC COBOL SQL アクセス Server Runtime V1.0 COBOL SQL アクセス Server Runtime V1.0 (1 年間保守付 ) COBOL SQL アクセス Server Runtime V1.0 (1 年間時間延長保守付 ) セットアップカード SL438730U01-1 ごあいさつ このたびは COBOL SQL アクセス Server Runtime

More information

PostgreSQL Plus 管理者ガイド

PostgreSQL Plus 管理者ガイド 2.4 旧バージョンからの移行 ここでは PostgreSQL Plus V1.0 および V1.1 から PostgreSQL Plus V2.0 にインスタンスの資産 を移行する手順について説明します PostgreSQL Plus V1.0 および V1.1 は PostgreSQL 7.3 をベースとしています また PostgreSQL Plus V2.0 は PostgreSQL 7.4

More information

COBOL Standard Edition COBOL SQL アクセスのご紹介 2017 年 3 本電気株式会社 次 COBOL SQLアクセスとは P.4 COBOL85 SQLEXTENSIONからの移 P.10 製品情報 P.13 COBOL SQL アクセスとは 製品概要 COBOL ソース中の埋め込み SQL によるデータベースアクセスが可能に 業界標準 ODBC(Open DataBase

More information

DumpCollection IT Exam Training online / Bootcamp PDF and Testing Engine, study and practice

DumpCollection IT Exam Training online / Bootcamp   PDF and Testing Engine, study and practice DumpCollection IT Exam Training online / Bootcamp http://www.dumpcollection.com PDF and Testing Engine, study and practice Exam : 1z0-144 日本語 (JPN) Title : Oracle Database 11g: Program with PL/SQL Vendor

More information

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ 第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイルの作成方法 コンパイル方法について説明します IDL ファイルの作成にあたっては INTERSTAGE

More information

データベースアクセス

データベースアクセス データベースアクセスコンポーネント 1. 概要 データベースアクセスコンポーネントとは SQL データベースにアクセスして SQL 文を実行することによりデータベース検索を行う機能を提供するコンポーネントです また データベースアクセスコンポーネントでは データベースの構成情報 接続情報 エラー情報等を取得することも可能です データベースアクセスコンポーネントは アプリケーションビルダーのメニューから以下のように選びます

More information

レベルアップ詳細情報 < 製品一覧 > 製品名 バージョン < 追加機能一覧 > 管理番号 内容 説明書参照章 カナ文字拡張対応 < 改善一覧 > 管理番号 内容 対象バージョン 説明書参照章 文字列のコピー ペースト改善 ~ 子画面の表示方式 ~ 履歴の詳細情報 ~ タブの ボタン ~ 接続時の管

レベルアップ詳細情報 < 製品一覧 > 製品名 バージョン < 追加機能一覧 > 管理番号 内容 説明書参照章 カナ文字拡張対応 < 改善一覧 > 管理番号 内容 対象バージョン 説明書参照章 文字列のコピー ペースト改善 ~ 子画面の表示方式 ~ 履歴の詳細情報 ~ タブの ボタン ~ 接続時の管 レベルアップ詳細情報 < 製品一覧 > 製品名 バージョン < 追加機能一覧 > 管理番号 内容 説明書参照章 カナ文字拡張対応 < 改善一覧 > 管理番号 内容 対象バージョン 説明書参照章 文字列のコピー ペースト改善 ~ 子画面の表示方式 ~ 履歴の詳細情報 ~ タブの ボタン ~ 接続時の管理情報の英小文字対応 ~ 管理ホスト情報の表示 グループ情報と詳細情報の表示 ~ 検索条件設定時の一覧画面の操作

More information

※ ポイント ※

※ ポイント ※ 4S-RO ロボティクス実験 参考資料 ファイル入出力 : ファイルの読み込み 1 周目に計測した生体情報データを読み込み プログラムにより信号処理を行うが その際にファイルの 入出力が必要となる 実験前半ですでに学習しているが必要に応じて本資料を参考にすること 以下のようにすると指定したファイルを読み込むことができる ( 詳細は後から記述 ) int i; double --------; char

More information

プレポスト【問題】

プレポスト【問題】 コース名 : サーブレット /JSP/JDBC プログラミング ~Eclipse による開発 ~ 受講日 氏名 1 JDBC の説明として 間違っているものを 1 つ選びなさい 1. JDBC を使用してデータベースへアクセスするときには JDBC API が必要である 2. JDBC API は java.lang パッケージとして提供されている 3. JDBC には JDBC API JDBC

More information

ESMPRO/JMSS Ver6.0

ESMPRO/JMSS Ver6.0 NEC Express5800 シリーズ ESMPRO /JMSS EventManager セットアップカード ごあいさつ このたびは ESMPRO/JMSS EventManager をお買い上げ頂き まことにありがとうございま す 本書は セットアップ方法について説明しています 製品をお使いになる前に必ずお読みくだ さい また ESMPRO/JMSS EventManager の説明書として次のものがあります

More information

セットアップカード

セットアップカード NEC COBOL SQL アクセス Client Runtime Ver1.0 COBOL SQL アクセス Client Runtime Ver1.0 (1 年間保守付 ) COBOL SQL アクセス Client Runtime Ver1.0 (1 年間時間延長保守付 ) セットアップカード ごあいさつ このたびは COBOL SQL アクセス Client Runtime Ver1.0 (

More information

TFTP serverの実装

TFTP serverの実装 TFTP サーバーの実装 デジタルビジョンソリューション 佐藤史明 1 1 プレゼンのテーマ組み込みソフトのファイル転送を容易に 2 3 4 5 基礎知識 TFTP とは 実践 1 実際に作ってみよう 実践 2 組み込みソフトでの実装案 最後におさらい 2 プレゼンのテーマ 組み込みソフトのファイル転送を容易に テーマ選択の理由 現在従事しているプロジェクトで お客様からファームウェアなどのファイル転送を独自方式からTFTPに変更したいと要望があった

More information

Microsoft Word - Android_SQLite講座_画面800×1280

Microsoft Word - Android_SQLite講座_画面800×1280 Page 24 11 SQLite の概要 Android にはリレーショナルデータベースである SQLite が標準で掲載されています リレーショナルデータベースは データを表の形で扱うことができるデータベースです リレーショナルデータベースには SQL と呼ばれる言語によって簡単にデータの操作や問い合わせができようになっています SQLite は クライアントサーバ形式ではなく端末の中で処理が完結します

More information

障害管理テンプレート仕様書

障害管理テンプレート仕様書 目次 1. テンプレート利用の前提... 2 1.1 対象... 2 1.2 役割... 2 1.3 受付区分内容と運用への影響... 2 1.4 プロセス... 2 1.5 ステータス... 3 2. テンプレートの項目... 5 2.1 入力項目... 5 2.2 入力方法および属性... 6 2.3 他の属性... 7 3. トラッキングユニットの設定... 8 3.1 メール送信一覧...

More information

スクールCOBOL2002

スクールCOBOL2002 (h) 登録集原文の指定方法 . 登録集原文の指定方法 複数の COBOL プログラムに共通の記述を別のソースファイルとしておき COPY 文で取り込むことができます 登録集原文の概念図を下欄に示します このようにすると コーディング量を削減でき 記述ミスもなくなるため 開発効率を高めることができます ここでは 第 章で実習した reidai.cbl というソースファイルの DATA0 と YYMMDD

More information

データベース 【1:データベースシステムとは】

データベース 【1:データベースシステムとは】 データベース 1: データベースシステムとは 石川佳治 データベースシステムとは データベースシステム (database system) 各種アプリケーションが扱うデータ資源を統合して蓄積管理 効率的な共有, 高度な利用 アプリケーションシステムの例 ウェブサイト : ショッピングサイトなど 人事管理, 成績管理システム データベース (database, DB) 複数の応用目的での共有を意図して組織的かつ永続的に格納されたデータ群

More information

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版   Copyright 2012 NTT DATA INTRAMART CORPORATION 1 Top 目次 1. 改訂情報 2. IM- 共通マスタの拡張について 2.1. 前提となる知識 2.1.1. Plugin Manager 2.2. 表記について 3. 汎用検索画面の拡張 3.1. 動作の概要 3.1.1. 汎用検索画面タブの動作概要 3.2. 実装の詳細 3.2.1. 汎用検索画面タブの実装

More information

9 WEB監視

9  WEB監視 2018/10/31 02:15 1/8 9 WEB 監視 9 WEB 監視 9.1 目標 Zabbix ウェブ監視は以下を目標に開発されています : ウェブアプリケーションのパフォーマンスの監視 ウェブアプリケーションの可用性の監視 HTTPとHTTPSのサポート 複数ステップで構成される複雑なシナリオ (HTTP 要求 ) のサポート 2010/08/08 08:16 Kumi 9.2 概要 Zabbix

More information

目 次 1. はじめに アルコールチェッカー管理ソフトのインストール アルコールチェッカー管理ソフトのアンインストール アルコールチェッカー管理ソフトの操作方法 ソフトの起動 NG 判定値の設定

目 次 1. はじめに アルコールチェッカー管理ソフトのインストール アルコールチェッカー管理ソフトのアンインストール アルコールチェッカー管理ソフトの操作方法 ソフトの起動 NG 判定値の設定 アルコールチェッカー管理ソフト 取扱説明書 Ver.1.1.0 1 目 次 1. はじめに... 3 2. アルコールチェッカー管理ソフトのインストール... 4 3. アルコールチェッカー管理ソフトのアンインストール... 9 4. アルコールチェッカー管理ソフトの操作方法... 10 4.1. ソフトの起動... 10 4.2. NG 判定値の設定... 12 4.3. 運転者名登録... 13

More information

模擬試験問題(第1章~第3章)

模擬試験問題(第1章~第3章) 基本情報技術者試験の練習問題 - 第 8 回 この問題は平成 19 年度秋期の問題から抜粋しています 問 1 次のプログラムの説明及びプログラムを読んで, 設問 1,2 に答えよ プログラムの説明 スタックを使って, 実数値を 10 進数字列 ( 文字列 ) に変換する副プログラム FloatFormat である (1) FloatFormat は, 実数 Float の値を 10 進数字列に変換し,

More information

リリース情報

リリース情報 NetCOBOL JEF オプション V7.0L30 リリース情報 Windows B1WD-1131-02Z0(00) 2012 年 12 月 まえがき 本書は NetCOBOL JEF オプションのリリース情報について説明します NetCOBOL シリーズについて NetCOBOL シリーズの最新情報については 富士通のサイトをご覧ください http://software.fujitsu.com/jp/cobol/

More information

AquesTalk プログラミングガイド

AquesTalk プログラミングガイド AquesTalk プログラミングガイド ( 株 ) アクエスト 1. 概要 本文書は 規則音声合成ライブラリ AquesTalk をアプリケーションに組み込んで使用するためのプログラミングに関して 方法および注意点を示したものです AquesTalk には 2 種類のライブラリがあります 音声データをメモリ上に生成するものと サウンドデバイスに出力する 2 種類があります 使用するアプリケーションに応じて選択してください

More information

改版履歴 版数 日付 内容 担当 V /5/26 初版発行 STS V /7/28 動作条件の変更 STS メール通知文の修正 V /2/7 Windows8 の追加 STS V /2/2 Windows8. の追加 STS V

改版履歴 版数 日付 内容 担当 V /5/26 初版発行 STS V /7/28 動作条件の変更 STS メール通知文の修正 V /2/7 Windows8 の追加 STS V /2/2 Windows8. の追加 STS V 証明書インポートツール 操作マニュアル 207 年 月 2 日 セコムトラストシステムズ株式会社 i 改版履歴 版数 日付 内容 担当 V..00 2008/5/26 初版発行 STS V..0 200/7/28 動作条件の変更 STS メール通知文の修正 V..20 203/2/7 Windows8 の追加 STS V..30 204/2/2 Windows8. の追加 STS V..40 204/06/06

More information

リレーショナルデータベース入門 SRA OSS, Inc. 日本支社 Copyright 2008 SRA OSS, Inc. Japan All rights reserved. 1

リレーショナルデータベース入門 SRA OSS, Inc. 日本支社 Copyright 2008 SRA OSS, Inc. Japan All rights reserved. 1 リレーショナルデータベース入門 SRA OSS, Inc. 日本支社 Copyright 2008 SRA OSS, Inc. Japan All rights reserved. 1 データベース とは? データ (Data) の基地 (Base) 実世界のデータを管理するいれもの 例えば 電話帳辞書メーラー検索エンジン もデータベースである Copyright 2008 SRA OSS, Inc.

More information

スケジューリングおよび通知フォーム のカスタマイズ

スケジューリングおよび通知フォーム のカスタマイズ CHAPTER 6 この章では Outlook 予定表から会議をスケジュールまたは会議に参加するために [MeetingPlace] タブをクリックしたときに表示される項目の最も簡単なカスタマイズ方法について説明します 次の項を参照してください スケジューリングフォームと会議通知 (P.6-1) スケジューリングフォームおよび会議通知のカスタマイズ (P.6-2) MeetingPlace タブのフォームのデフォルト情報とオプション

More information

SQL Server データベース接続設定 マニュアル

SQL Server データベース接続設定 マニュアル 2018/07 SQL Server データベース接続設定 ユーザーガイド 本ユーザーガイドについて このユーザーガイドは SQL Server データベースへの接続設定などについて説明するものです 設定作業を始める前に Windows やネットワーク環境などが正しく動作することを あらかじめ確認しておいてください 本ユーザーガイドの画面ダンプはあくまで一例です 実際の画面とは異なる場合があります

More information

Microsoft PowerPoint - 09.pptx

Microsoft PowerPoint - 09.pptx 情報処理 Ⅱ 第 9 回 2014 年 12 月 22 日 ( 月 ) 関数とは なぜ関数 関数の分類 自作関数 : 自分で定義する. ユーザ関数 ユーザ定義関数 などともいう. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする 機能分割 ( モジュール化, 再利用 ) 責任 ( あるいは不具合の発生源

More information

Oracle 入門 ~ 研修受講後のスキルアップサポート ~ 対応バージョン :Oracle 10gR1 ~ 12cR1 本資料は アシスト Oracle 研修をご受講いただいたお客様からのご質問や 研修ではご案内できなかった情報などを FAQ にまとめたものです 研修受講後のスキルアップの一助とし

Oracle 入門 ~ 研修受講後のスキルアップサポート ~ 対応バージョン :Oracle 10gR1 ~ 12cR1 本資料は アシスト Oracle 研修をご受講いただいたお客様からのご質問や 研修ではご案内できなかった情報などを FAQ にまとめたものです 研修受講後のスキルアップの一助とし Oracle 入門 ~ 研修受講後のスキルアップサポート ~ 対応バージョン :Oracle 10gR1 ~ 12cR1 本資料は アシスト Oracle 研修をご受講いただいたお客様からのご質問や 研修ではご案内できなかった情報などを FAQ にまとめたものです 研修受講後のスキルアップの一助として 是非お役立てください ご利用上の注意事項は最後のページにまとめられております ご確認のうえ ご利用ください

More information

V-CUBE One

V-CUBE One V-CUBE One Office 365 連携マニュアル ブイキューブ 2017/06/02 この文書は V-CUBE One の Office 365 連携用ご利用マニュアルです 更新履歴 更新日 内容 2016/02/09 新規作成 2016/03/11 Office 365 ID を既存の One 利用者と紐付ける機能に関する記述の追加 2016/04/01 V-CUBE ミーティング Outlook

More information

PowerRW+からPowerRDBconnectorへの移行手引書

PowerRW+からPowerRDBconnectorへの移行手引書 PowerRW+ から PowerRDBconnector への 移行手引書 初版 :2008 年 8 月 富士通株式会社 All Rights Reserved, Copyright 富士通株式会社 2008 はじめに 本書は Windows(R) の PowerRW+ for NetCOBOL から PowerRDBconnector for NetCOBOL へ移行するための手引書 です 本書は

More information

PC にソフトをインストールすることによって OpenVPN でセキュア SAMBA へ接続することができます 注意 OpenVPN 接続は仮想 IP を使用します ローカル環境にて IP 設定が被らない事をご確認下さい 万が一仮想 IP とローカル環境 IP が被るとローカル環境内接続が行えなくな

PC にソフトをインストールすることによって OpenVPN でセキュア SAMBA へ接続することができます 注意 OpenVPN 接続は仮想 IP を使用します ローカル環境にて IP 設定が被らない事をご確認下さい 万が一仮想 IP とローカル環境 IP が被るとローカル環境内接続が行えなくな 操作ガイド Ver.2.3 目次 1. インストール... - 2-2. SAMBA Remote 利用... - 9-2.1. 接続確認... - 9-2.2. 自動接続... - 11-2.3. 編集... - 13-2.4. インポート... - 16-2.5. 削除... - 18-2.6. 参考資料 ( 接続状況が不安定な場合の対処方法について )... - 19-2.6.1. サービスの再起動...

More information

3/7 マイグレーション開発方針 顧客名 0 作成者 根岸正 < プログラム移行方針 > システム名称 A-VX システムマイグレーション作成日 2015/09/01 < COBOL 資産のプログラム移行 > COBOLソース ( メインとCOPYLIB) を入力としてSCC 言語変換ツールにてVB

3/7 マイグレーション開発方針 顧客名 0 作成者 根岸正 < プログラム移行方針 > システム名称 A-VX システムマイグレーション作成日 2015/09/01 < COBOL 資産のプログラム移行 > COBOLソース ( メインとCOPYLIB) を入力としてSCC 言語変換ツールにてVB 3/7 マイグレーション開発方針 顧客名 0 作成者 根岸正 < プログラム移行方針 > システム名称 A-VX システムマイグレーション作成日 2015/09/01 < COBOL 資産のプログラム移行 > COBOLソース ( メインとCOPYLIB) を入力としてSCC 言語変換ツールにてVB.netソリューションを作成します言語変換後にSDK( ソフトウェア開発キット ) にてデバッグおよびビルドにて実行可能アプリケーションを作成します

More information

ServerView Resource Orchestrator V3.0 ネットワーク構成情報ファイルツール(Excel形式)の利用方法

ServerView Resource Orchestrator V3.0 ネットワーク構成情報ファイルツール(Excel形式)の利用方法 ServerView Resource Orchestrator V3.0 ネットワーク構成情報ファイル作成ツール mknetdevconf-tool-0300-1 本ファイルでは ServerView Resource Orchestrator V3.0 で使用する ネットワーク構成情報ファイル作成ツール の動作条件 使用方法 およびその他の重要な情報について説明しています 本ツールを使用する前に必ず最後まで目を通すようお願いします

More information

講義の進め方 第 1 回イントロダクション ( 第 1 章 ) 第 2 ~ 7 回第 2 章 ~ 第 5 章 第 8 回中間ミニテスト (11 月 15 日 ) 第 9 回第 6 章 ~ 第 回ローム記念館 2Fの実習室で UML によるロボット制御実習 定期試験 2

講義の進め方 第 1 回イントロダクション ( 第 1 章 ) 第 2 ~ 7 回第 2 章 ~ 第 5 章 第 8 回中間ミニテスト (11 月 15 日 ) 第 9 回第 6 章 ~ 第 回ローム記念館 2Fの実習室で UML によるロボット制御実習 定期試験 2 ソフトウェア工学 第 7 回 木曜 5 限 F205 神原弘之 京都高度技術研究所 (ASTEM RI) http://www.metsa.astem.or.jp/se/ 1 講義の進め方 第 1 回イントロダクション ( 第 1 章 ) 第 2 ~ 7 回第 2 章 ~ 第 5 章 第 8 回中間ミニテスト (11 月 15 日 ) 第 9 回第 6 章 ~ 第 12 14 回ローム記念館 2Fの実習室で

More information

2006年10月5日(木)実施

2006年10月5日(木)実施 2010 年 7 月 2 日 ( 金 ) 実施 ファイル処理ファイルとはファイル (file) は日常用語では紙などを綴じたものを表すが, コンピュータ用語ではデータの集合体を指す言葉である ファイルは例えば, 文書ファイルやプログラムファイルのように, 用途によって分類されることもあれば, また, テキストファイルやバイナリファイルのように, ファイルの作り方によって分類されることもある なお,

More information

インストーラー 管理番号 内容 対象バージョン 230 HULFT がすでにインストールされているパスに対してサイレントインストールを実行すると インストールされていた HULFT の動作環境が不正な状態になる 7.3.0~7.3.1 ユーティリティ 管理番号 内容 対象バージョン 231 管理情報

インストーラー 管理番号 内容 対象バージョン 230 HULFT がすでにインストールされているパスに対してサイレントインストールを実行すると インストールされていた HULFT の動作環境が不正な状態になる 7.3.0~7.3.1 ユーティリティ 管理番号 内容 対象バージョン 231 管理情報 リビジョンアップ詳細情報 < 製品一覧 > 製品名 バージョン HULFT7 for Windows-EX 7.3.2 HULFT7 for Windows-ENT 7.3.2 HULFT7 for Windows-M 7.3.2 HULFT7 for Windows-L 7.3.2 < 改善一覧 > HULFT 管理番号 内容 対象バージョン説明書参照章 79 履歴削除処理に関する改善 7.0.0~7.3.1-148

More information

改訂履歴 項番版数作成日 / 改訂日変更箇所変更内容. 平成 28 年 5 月 3 日新規章構成の変更, 分冊化に伴い新規作成 (i)

改訂履歴 項番版数作成日 / 改訂日変更箇所変更内容. 平成 28 年 5 月 3 日新規章構成の変更, 分冊化に伴い新規作成 (i) 特許庁アーキテクチャ標準仕様書 ( 参考 ) 処理シーケンスサンプル集 第. 版 平成 28 年 6 月 特許庁 改訂履歴 項番版数作成日 / 改訂日変更箇所変更内容. 平成 28 年 5 月 3 日新規章構成の変更, 分冊化に伴い新規作成 (i) はじめに () 本書の位置づけ 本書は, 特許庁アーキテクチャ標準仕様書 に基づきシステムの動的な振る舞いを処理シーケンスとして定める際に参考とするサンプル集である

More information

ESMPRO/JMSS Ver6.0

ESMPRO/JMSS Ver6.0 NEC Express5800 シリーズ ESMPRO /JMSS Ver7.2 EventManager UL1044-30D UL1044-H30D UL1044-J30D セットアップカード ごあいさつ このたびは ESMPRO/JMSS EventManager をお買い上げ頂き まことにありがとうございま す 本書は セットアップ方法について説明しています 製品をお使いになる前に必ずお読みくだ

More information

AIR-EDGE: Windows2000 ダイヤルアップ接続の設定方法

AIR-EDGE: Windows2000 ダイヤルアップ接続の設定方法 Windows 2000 XP Vista 標準のコマンドプロンプトを使用した Telnet でのメールの削除方法をご案内します 1.Telnet ご利用にあたって Telnet では メールサーバに直接アクセスし コマンド入力することで操作をおこないます 特定のメールが原因となってメールが受信できないトラブルの場合 リモートメール機能のあるメールソフトや プレミアムプランで提供しておりま す WEBMAIL

More information

目次 1. 概要 動作環境

目次 1. 概要 動作環境 Asaka Data Entry for RS-232C (ADE-RS) Personal Edition ユーザーズガイド (Ver 1.1) 株式会社アサカ理研 目次 1. 概要 -------------------------------------------------------------------- 2 2. 動作環境 ------------------------------------------------------------------

More information

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid("text_box02_id"); if ("001" == statee

前ページからの続き // テキストボックス02 id 属性で取得 // id 属性で取得する場合は一意に決まるので 何番目かの指定は不要 var textbox02elem = document.getelementbyid(text_box02_id); if (001 == statee 全体のヒント 1. テキストボックスの制御 1.1. 日付入力日付の入力ボックスは フォーカスが入った時にスラッショを消し フォーカスが他の項目等に移るとスラッシュが加わるようにする オンフォーカス 20100101 オフフォーカス 2010/01/01 1.1.1 オンフォーカス時にスラッシュを消す入力項目のスラッシュを消すには include/function.js ファイル内の var delslash

More information

今月の呼びかけ 添付資料 ファイル名に細工を施されたウイルスに注意! ~ 見た目でパソコン利用者をだます手口 ~ 2011 年 9 月 IPA に RLTrap というウイルスの大量の検出報告 ( 約 5 万件 ) が寄せられました このウイルスには パソコン利用者がファイルの見た目 ( 主に拡張子

今月の呼びかけ 添付資料 ファイル名に細工を施されたウイルスに注意! ~ 見た目でパソコン利用者をだます手口 ~ 2011 年 9 月 IPA に RLTrap というウイルスの大量の検出報告 ( 約 5 万件 ) が寄せられました このウイルスには パソコン利用者がファイルの見た目 ( 主に拡張子 今月の呼びかけ 添付資料 ファイル名に細工を施されたウイルスに注意! ~ 見た目でパソコン利用者をだます手口 ~ 2011 年 9 月 IPA に RLTrap というウイルスの大量の検出報告 ( 約 5 万件 ) が寄せられました このウイルスには パソコン利用者がファイルの見た目 ( 主に拡張子 ) を誤認し実行してしまうように ファイル名に細工が施されています このような手法は決して新しいものではなく

More information

SAMBA Stunnel(Windows) 編 1. インストール 1 セキュア SAMBA の URL にアクセスし ログインを行います xxx 部分は会社様によって異なります xxxxx 2 Windows 版ダウンロード ボ

SAMBA Stunnel(Windows) 編 1. インストール 1 セキュア SAMBA の URL にアクセスし ログインを行います   xxx 部分は会社様によって異なります xxxxx 2 Windows 版ダウンロード ボ 操作ガイド Ver.2.3 目次 1. インストール... - 2-2. SAMBA Stunnel 利用... - 8-2.1. 接続確認... - 8-2.2. 編集... - 11-2.3. インポート... - 14-2.4. 削除... - 15-2.5 フォルダショートカットの作成... - 16-3. 動作環境... - 18-4. 参考資料 ( 接続状況が不安定な場合の対処方法について

More information

変更履歴 版数変更日変更内容 /9/1 初版設定

変更履歴 版数変更日変更内容 /9/1 初版設定 EXcel データ出力ガイドブック 第 1.0 版平成 30 年 9 月 1 日制定 株式会社中電シーティーアイ 変更履歴 版数変更日変更内容 1.0 2018/9/1 初版設定 目次 1 はじめに... 1 1.1 本書の位置付... 1 2 Excel テンプレートの作成... 2 2.1 キーファイルの準備... 2 2.2 テンプレートエリアの宣言... 3 2.3 テンプレートに記述する内容...

More information

Excel データ出力ガイドブック 第 1.0 版平成 30 年 9 月 1 日制定 株式会社中電シーティーアイ

Excel データ出力ガイドブック 第 1.0 版平成 30 年 9 月 1 日制定 株式会社中電シーティーアイ Excel データ出力ガイドブック 第 1.0 版平成 30 年 9 月 1 日制定 株式会社中電シーティーアイ 変更履歴 版数変更日変更内容 1.0 2018/9/1 初版設定 目次 1 はじめに... 1 1.1 本書の位置付... 1 2 Excel テンプレートの作成... 2 2.1 キーファイルの準備... 2 2.2 テンプレートエリアの宣言... 3 2.3 テンプレートに記述する内容...

More information

Rational Roseモデルの移行 マニュアル

Rational Roseモデルの移行 マニュアル Model conversion from Rational Rose by SparxSystems Japan Rational Rose モデルの移行マニュアル (2012/1/12 最終更新 ) 1. はじめに このガイドでは 既に Rational( 現 IBM) Rose ( 以下 Rose と表記します ) で作成された UML モデルを Enterprise Architect で利用するための作業ガイドです

More information

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部 はじめに コース概要と目的 Oracle 独自の手続き型言語である PL/SQL について説明します PL/SQL の基本構文 ストアド サブプログラム トリガーの作成方法 またストアド サブプログラムの管理について習得することを目的としています 受講対象者 これから PL/SQL を使用してアプリケーション開発をされる方 前提条件 SQL トレーニング コースを受講された方 もしくは 同等の知識をお持ちの方

More information

HDC-EDI Manager Ver レベルアップ詳細情報 < 製品一覧 > 製品名バージョン HDC-EDI Manager < 対応 JavaVM> Java 2 Software Development Kit, Standard Edition 1.4 Java 2

HDC-EDI Manager Ver レベルアップ詳細情報 < 製品一覧 > 製品名バージョン HDC-EDI Manager < 対応 JavaVM> Java 2 Software Development Kit, Standard Edition 1.4 Java 2 レベルアップ詳細情報 < 製品一覧 > 製品名バージョン HDC-EDI Manager 2.2.0 < 対応 JavaVM> Java 2 Software Development Kit, Standard Edition 1.4 Java 2 Platform Standard Edition Development Kit 5.0 Java SE Development Kit 6 < 追加機能一覧

More information

HULFT8 for Windows/UNIX/Linux/zLinux の機能で発生する不具合について

HULFT8 for Windows/UNIX/Linux/zLinux の機能で発生する不具合について 2019 年 05 月 24 日 ( 改訂日 :2019 年 7 月 11 日 ) お客様各位 株式会社セゾン情報システムズ HULFT 事業部 HULFT8 for Windows/UNIX/Linux/zLinux の ファイルトリガ機能で発生する不具合について HULFT8 for Windows/UNIX/Linux/zLinux Ver.8.4.0 において 下記の不具合が発見されましたので

More information

intra-mart Accel Platform

intra-mart Accel Platform intra-mart Accel Platform IM- 共通マスタスマートフォン拡張プログラミングガイド 2012/10/01 初版 変更年月日 2012/10/01 初版 > 変更内容 目次 > 1 IM- 共通マスタの拡張について...2 1.1 前提となる知識...2 1.1.1 Plugin Manager...2 1.2 表記について...2 2 汎用検索画面の拡張...3

More information

1. 主な機能追加項目 以下の検索項目をサポートしました 書誌 全文検索コマンド検索 国内 査定日 最新の査定日 ( 登録査定日または拒絶査定日 ) を検索します 査定種別 最新の登録 拒絶査定 または査定なしを検索します 審査最終処分日 最新の審査最終処分日を検索します 審査最終処分種別 最新の審

1. 主な機能追加項目 以下の検索項目をサポートしました 書誌 全文検索コマンド検索 国内 査定日 最新の査定日 ( 登録査定日または拒絶査定日 ) を検索します 査定種別 最新の登録 拒絶査定 または査定なしを検索します 審査最終処分日 最新の審査最終処分日を検索します 審査最終処分種別 最新の審 日立特許情報提供サービス Sharerese arch 01-76Ver. 機能のご紹介 2011,HitachiInformationSystems,LtdAllRigh tsrese rved 1. 主な機能追加項目 以下の検索項目をサポートしました 書誌 全文検索コマンド検索 国内 査定日 最新の査定日 ( 登録査定日または拒絶査定日 ) を検索します 査定種別 最新の登録 拒絶査定 または査定なしを検索します

More information

ファクス送信用変換ソフト 操作説明書_UA

ファクス送信用変換ソフト 操作説明書_UA ファクス送信用変換ソフト操作説明書 ファクス送信用変換ソフトのインストールから操作までを説明します 本書では ファクス送信用変換ソフトを 本ソフト と表記している場合があります ファクス送信用変換ソフトについて...2 ファクス送信用変換ソフトをインストールする...3 ファクス送信用変換ソフトを再インストールする...5 ファクス送信用変換ソフトをアンインストールする...5 Windows 10

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション ネットワークプログラミング 演習 第 12 回 Web サーバ上で動作するプログラム 2 今日のお題 PHPのプログラム例 おみくじ アクセスカウンタ ファイルの扱い lock ファイルの所有者 許可と権限 PHP の文法 ( の一部 ) if, for, while の制御の構文は C 言語と似ている 型はあるが 明示的な宣言はしなくてよい 変数には型がない 変数の宣言はしなくてよい 変数名には

More information

POSIXスレッド

POSIXスレッド POSIX スレッド (3) システムプログラミング 2011 年 11 月 7 日 建部修見 同期の戦略 単一大域ロック スレッドセーフ関数 構造的コードロッキング 構造的データロッキング ロックとモジュラリティ デッドロック 単一大域ロック (single global lock) 単一のアプリケーションワイドの mutex スレッドが実行するときに獲得, ブロックする前にリリース どのタイミングでも一つのスレッドが共有データをアクセスする

More information

演算増幅器

演算増幅器 ファイルこれまでにデータの入力方法として キーボードからの入力を用いてきた 構造体を習った際に実感してもらえたと思うが 入力データ量が多いときにはその作業は大変なものとなり 入力するデータを間違えた場合には最初からやり直しになる そこで今回はこれらの問題を解決するため あらかじめ入力データをテキストエディタなどで編集し ファイルとして保存したものを入力データとして用いる方法を習っていく さらにプログラムで作成したデータをファイルに出力する方法も併せて習っていく

More information

地図 SD カードを取り外す 最初に ナビゲーション本体から地図 SD カードを取り外します 本操作は地図 SD カードを初めて ROAD EXPLORER Updater に登録するときや パソコンにダウンロードしたデータを地図 SD カードに保存するときに実行してください 1 ナビゲーション本体

地図 SD カードを取り外す 最初に ナビゲーション本体から地図 SD カードを取り外します 本操作は地図 SD カードを初めて ROAD EXPLORER Updater に登録するときや パソコンにダウンロードしたデータを地図 SD カードに保存するときに実行してください 1 ナビゲーション本体 ROAD EXPLORER Updater 取扱説明書 205-0001-06 Version:1.4.0.0 ROAD EXPLORER Updater を使用する前に必ずお読みください ROAD EXPLORER Updater の操作手順は Microsoft Windows XP の画面を例に説明しています 画面例は実際と異なる場合があります 目次 ROAD EXPLORER Updater

More information

8. Windows の補足情報 コマンドの使用についての説明です Windows からのファイル直接印刷 Windows でコマンドを使用したファイル直接印刷の方法についての説明です この機能はネットワーク接続をしているときに使用できます この方法で印刷できるファイルは 本機が搭載しているエミュレ

8. Windows の補足情報 コマンドの使用についての説明です Windows からのファイル直接印刷 Windows でコマンドを使用したファイル直接印刷の方法についての説明です この機能はネットワーク接続をしているときに使用できます この方法で印刷できるファイルは 本機が搭載しているエミュレ コマンドの使用についての説明です Windows からのファイル直接印刷 Windows でコマンドを使用したファイル直接印刷の方法についての説明です この機能はネットワーク接続をしているときに使用できます この方法で印刷できるファイルは 本機が搭載しているエミュレーション用に作られたファイルです エミュレーション用に作られたファイルとは たとえば PostScript 3 用のポストスクリプトファイルなどです

More information

BricRobo V1.5 インストールマニュアル

BricRobo V1.5 インストールマニュアル 株式会社富士通コンピュータテクノロジーズ 目次 1 はじめに... 1 1.1 本書の目的... 1 1.2 関連文書... 1 1.2.1 上位文書... 1 1.2.2 参考文書... 1 1.3 問い合わせ先... 1 2 インストールファイル... 2 3 準備... 3 3.1 動作環境... 3 3.2 Enterprise Architect の入手... 3 4 インストール...

More information

Microsoft Word - SSL-VPN接続サービスの使い方

Microsoft Word - SSL-VPN接続サービスの使い方 作成 : 平成 29 年 06 月 29 日 更新 : 平成 30 年 07 月 28 日 SSL-VPN 接続サービスの使い方 内容 SSL-VPN 接続サービスの使い方... 1 1. SSL-VPN 接続サービスについて... 1 2. SSL-VPN 接続サービスの留意点... 1 3. SSL-VPN 接続サービスの利用に必要となるもの... 2 4. SSL-VPN 接続サービスを利用する手順...

More information

Ver.30 改版履歴 版数 日付 内容 担当 V //3 初版発行 STS V..0 05//6 パスワード再発行後のパスワード変更機能追加 STS V..0 05//5 サポート環境変更 STS V //9 サポート環境の追加 STS ii

Ver.30 改版履歴 版数 日付 内容 担当 V //3 初版発行 STS V..0 05//6 パスワード再発行後のパスワード変更機能追加 STS V..0 05//5 サポート環境変更 STS V //9 サポート環境の追加 STS ii Ver.30 セコムあんしんログインサービス利用者マニュアル ID パスワード認証 + ワンタイムパスワード認証 (Windows OS) 05 年 月 9 日 セコムトラストシステムズ株式会社 i Ver.30 改版履歴 版数 日付 内容 担当 V..00 04//3 初版発行 STS V..0 05//6 パスワード再発行後のパスワード変更機能追加 STS V..0 05//5 サポート環境変更

More information

7-1- 基 RDB に関する基礎知識 1 独立行政法人情報処理推進機構

7-1- 基 RDB に関する基礎知識 1 独立行政法人情報処理推進機構 7-1- 基 RDB に関する基礎知識 1 7-1.RDB に関する知識 OSS のデータストアとしてのデータベースの機能と役割に関して 実際の開発 運用の際に必要な管理知識 手法の種類と特徴 内容を Ⅰ. 概要理解し SQL やトランザクションなどデータベースを設計 活用するために必要なノウハウを学ぶ Ⅱ. 対象専門分野職種共通本カリキュラムの基本的なデータベース コンピュータシステム基礎 Ⅲ.

More information

< 障害一覧 > HULFT 配信機能 管理番号 内容 対象バージョン 39 コード変換の必要がない集信処理および配信処理を実行したにも関わ 7.0.0~7.3.1 らず コード変換処理でエラーとなる場合がある 44 システム動作環境設定再設定コマンド (hulclusterxxx -set) を使

< 障害一覧 > HULFT 配信機能 管理番号 内容 対象バージョン 39 コード変換の必要がない集信処理および配信処理を実行したにも関わ 7.0.0~7.3.1 らず コード変換処理でエラーとなる場合がある 44 システム動作環境設定再設定コマンド (hulclusterxxx -set) を使 リビジョンアップ詳細情報 < 製品一覧 > 製品名 バージョン HULFT8 for UNIX-Enterprise 8.0.1 HULFT8 for UNIX-Standard 8.0.1 HULFT8 for Linux-Enterprise 8.0.1 HULFT8 for Linux-Standard 8.0.1 HULFT8 for zlinux-enterprise 8.0.1 HULFT8

More information

<4D F736F F D C F815B834E B838B90E096BE8F9191E C52E646F63>

<4D F736F F D C F815B834E B838B90E096BE8F9191E C52E646F63> SATO BARCODE PRINTER ネットワークユーティリティ説明書 2007 年 11 月 3 日第 13 版 目 次 はじめに 1 1. ネットワークユーティリティとは 2 2. ネットワークユーティリティ 2 3. root パスワード設定 6 4. 環境の詳細設定 8 5. 無線 LAN 設定 12 5.1 Infrastructure モード 13 5.2 802.11 Ad hoc

More information

ネットキーの操作手順について

ネットキーの操作手順について ネットキーでの操作手順書 FCENA 目次 -------------------------------------------------------------------------------------- 1. パッケージをご利用いただくまでの手順 1 (1) ユーザ専用ページから 該当パッケージをダウンロードする 手順 2 (2) 該当パッケージをインストールする 手順 5 (3) パッケージを起動する

More information

無線LAN JRL-710/720シリーズ ファームウェアバージョンアップマニュアル 第2.1版

無線LAN JRL-710/720シリーズ ファームウェアバージョンアップマニュアル 第2.1版 無線 LAN JRL-710/720 シリーズ < 第 2.1 版 > G lobal Communications http://www.jrc.co.jp 目次 1. バージョンアップを行う前に...1 1.1. 用意するもの...1 1.2. 接続の確認...1 2. バージョンアップ手順...4 2.1. 手順 1...6 2.2. 手順 2...8 2.3. 手順 3... 11 本書は,

More information

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft

内容 Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作... 1 サーバーエクスプローラ... 4 データ接続... 4 データベース操作のサブメニューコンテキスト... 5 データベースのプロパティ... 6 SQL Server... 6 Microsoft Visual Studio サーバーエクスプローラで学ぶ SQL とデータベース操作 Access 2007 と SQL Server Express を使用 SQL 文は SQL Server 主体で解説 Access 版ノースウィンドウデータベースを使用 DBMS プログラム サーバーエクスプローラ SQL 文 実行結果 データベース エンジン データベース SQL 文とは 1 度のコマンドで必要なデータを効率よく取得するための技術といえます

More information

改版履歴 版数 日付 内容 担当 V /3/9 初版発行 STS V /5/4 エラー画面の削除 STS V //3 サポート環境の追加 サポート環境の説明文章の STS 修正 画面修正 V /2/25 サポート環境変更 STS V

改版履歴 版数 日付 内容 担当 V /3/9 初版発行 STS V /5/4 エラー画面の削除 STS V //3 サポート環境の追加 サポート環境の説明文章の STS 修正 画面修正 V /2/25 サポート環境変更 STS V セコムあんしんログインサービス 利用者マニュアル _ ワンタイムパスワード認証 (Windows OS) 205 年 月 9 日 セコムトラストシステムズ株式会社 i 改版履歴 版数 日付 内容 担当 V..00 203/3/9 初版発行 STS V..0 203/5/4 エラー画面の削除 STS V..20 204//3 サポート環境の追加 サポート環境の説明文章の STS 修正 画面修正 V..30

More information

iStorage ソフトウェア VMware vCenter Plug-in インストールガイド

iStorage ソフトウェア VMware vCenter Plug-in インストールガイド istorage ソフトウェア VMware vcenter Plug-in インストールガイド はじめに このインストールガイドでは WebSAM Storage VMware vcenter Plug-in のインストールに関して説明しています 本製品は VMware vcenter Server と連携する製品のため VMware vcenter Server が稼働するサーバへインストー ルします

More information

Microsoft Word - Cプログラミング演習(9)

Microsoft Word - Cプログラミング演習(9) 第 9 回 (6/18) 3. ファイルとその応用 外部記憶装置に記録されたプログラムやデータを, ファイルと呼ぶ シーケンシャルファイルやランダムファイルへのデータの記録や読み出し, 更新の手順について学習する (1) ファイルとレコードファイル複数の関連したデータを一つに集めたり プログラムを外部記憶装置に保存したものレコードファイルを構成する一塊のデータ ex. 個人カードフィールドレコードを構成する個別の要素

More information

親指シフトキーボード(FMV-KB611)、JISキーボード(FMV-KB621)、FMV-LIFEBOOK(親指シフトキーボードモデル)をお使いになる方へ

親指シフトキーボード(FMV-KB611)、JISキーボード(FMV-KB621)、FMV-LIFEBOOK(親指シフトキーボードモデル)をお使いになる方へ B5FJ-5921-01 目次 はじめに................................................... 2 商標および著作権について..................................... 2 Windows セットアップ時の文字入力について..................... 3 1 親指シフトキーボードをお使いになるための準備.............

More information

Oracle Business Intelligence Standard Edition One のインストール

Oracle Business Intelligence Standard Edition One のインストール Oracle Business Intelligence Standard Edition One のインストール 第 1 版 作成日 :2007 年 7 月 31 日 更新日 :2007 年 7 月 31 日 目次 はじめに... 3 Ⅰ. インストール作業... 4 Ⅱ. 起動状況の確認... 8 Ⅱ-1. Oracle BI Administration Tool の起動... 8 Ⅱ-2.

More information

プログラミング基礎

プログラミング基礎 C プログラミング Ⅰ 授業ガイダンス C 言語の概要プログラム作成 実行方法 授業内容について 授業目的 C 言語によるプログラミングの基礎を学ぶこと 学習内容 C 言語の基礎的な文法 入出力, 変数, 演算, 条件分岐, 繰り返し, 配列,( 関数 ) C 言語による簡単な計算処理プログラムの開発 到達目標 C 言語の基礎的な文法を理解する 簡単な計算処理プログラムを作成できるようにする 授業ガイダンス

More information

WebOTX V6 JDBCアプリケーションのトラブルシューティング(JDBCデータソース)

WebOTX V6 JDBCアプリケーションのトラブルシューティング(JDBCデータソース) WebOTX V6 JDBC アプリケーションのトラブルシューティング (JDBC データソース ) 2006 年 12 月初版 改版履歴 i 目次 1 はじめに...1 2 障害の切り分け方法...1 3 障害発生時の対処...2 3.1 Oracleデータベースリンク利用時のトランザクション障害への対応...2 3.2 Oracleデータベースリンクの再接続障害への対応...4 3.3 JDBCデータソースの設定変更が効かない現象への対応...6

More information

やさしくPDFへ文字入力 v.2.0

やさしくPDFへ文字入力 v.2.0 操作マニュアル やさしく PDF へ文字入力 v.2.0 基本操作 目次 1. はじめに 2. やさしく PDF へ文字入力の起動 3. スキャナの設定 4. 原稿の取り込み 4-1. スキャナから 4-2. ファイルから 5. プリンタの設定 6. フィールドの作成 6-1. フィールドの自動作成 6-2. フィールドの手動作成 7. フィールドの設定 8. 文字の入力 9. 印刷 便利な使い方付録

More information

Ver.60 改版履歴 版数 日付 内容 担当 V /7/8 初版発行 STS V..0 04// Windows 8. の追加 STS V..0 05//5 Windows XP の削除 STS V.30 05/8/3 体裁の調整 STS V.40 05//9 Windows0 の追加

Ver.60 改版履歴 版数 日付 内容 担当 V /7/8 初版発行 STS V..0 04// Windows 8. の追加 STS V..0 05//5 Windows XP の削除 STS V.30 05/8/3 体裁の調整 STS V.40 05//9 Windows0 の追加 Ver.60 証明書発行サイト 操作マニュアル (PKCS ファイルダウンロード ) 07 年 月 日 セコムトラストシステムズ株式会社 i Ver.60 改版履歴 版数 日付 内容 担当 V..00 03/7/8 初版発行 STS V..0 04// Windows 8. の追加 STS V..0 05//5 Windows XP の削除 STS V.30 05/8/3 体裁の調整 STS V.40

More information

Yaskawa Siemens CNC API HMI NCSI-SP02-15

Yaskawa Siemens CNC API HMI NCSI-SP02-15 Yaskawa Siemens CNC API HMI NCSI-SP02-15 安川シーメンス NC 株式会社はシーメンス株式会社に統合の後,2010 年 8 月より シーメンス ジャパン株式会社へ社名を変更いたしました 本書に記載の 安川シーメンス NC 株式会社 などの社名に類する名称は シーメンス ジャパン株式会社 へ読み替えをお願いします 本マニュアルは Yaskawa Siemens 840DI,Yaskawa

More information

Microsoft Word 基_シラバス.doc

Microsoft Word 基_シラバス.doc 4-5- 基 Web アプリケーション開発に関する知識 1 4-5- 基 Web アプリケーション開発に関する知識 スクリプト言語や Java 言語を利用して Ruby on Rails やその他 Web フレームワークを活用して HTML(4, 5) XHTML JavaScript DOM CSS といったマークアップ言語およびスクリプト言語を活用しながら Ⅰ. 概要ダイナミックなWebサービスを提供するアプリケーションを開発する際に

More information

BOM for Windows Ver

BOM for Windows Ver BOM for Windows Ver.5.0 SR2 リリースノート Copyright 2007-2009 SAY Technologies, Inc. All rights reserved. このドキュメントには BOM Ver5.0 SR2 に関する最新情報が記載されています 対応 OS の追加 対応 SP と OS が増えました 機能追加 改良 1.Windows Server 2008

More information

eYACHO 管理者ガイド

eYACHO 管理者ガイド eyacho 管理者ガイド 第 1 版 - ios は Cisco の米国およびその他の国における商標または登録商標であり ライセンスに基づき使用されています - Apple ipad は Apple Inc. の商標です - Microsoft, Excel および Internet Explorer は 米国 Microsoft Corporation の 米国およびその他の国における登録商標または商標です

More information

Microsoft PowerPoint - ソフトウェア更新手順書_DAN-W62_mac_ _1.ppt

Microsoft PowerPoint - ソフトウェア更新手順書_DAN-W62_mac_ _1.ppt スマホナビ対応ディスプレイ (DAN-W62) のソフトウェア更新手順書 (Mac 版 ) 2013/5 1. ソフトウェア更新手順の流れ ダウンロードツールをトヨタホームページから入手するバージョンアップデータを取得するためにはダウンロードツールが必要です スマホナビ対応ディスプレイの製品情報を取得する製品情報には 型番やソフトバージョン等の情報が入っています 正しくバージョンアップデータを取得するために必要な情報です

More information

プレポスト【解説】

プレポスト【解説】 コース名 : シェルの機能とプログラミング ~UNIX/Linux の効率的使用を目指して ~ 1 UNIX および Linux の主な構成要素は シェル コマンド カーネルです プロセスとは コマンドやプログラムを実行する単位のことなので プロセスに関する記述は誤りです UNIX および Linux のユーザーインターフェースは シェル です コマンドを解釈するという機能から コマンドインタープリタであるともいえます

More information

譲渡人複数証明データコンバータ操作説明書 平成 26 年 6 月

譲渡人複数証明データコンバータ操作説明書 平成 26 年 6 月 譲渡人複数証明データコンバータ操作説明書 平成 26 年 6 月 < 略称 > 本書では, 次のような略称を使用しています Windows 7 :Microsoft Windows 7 Professional Operating System( 日本語版 ) Windows 8 :Microsoft Windows 8 Pro Operating System( 日本語版 ) Windows 8.1

More information

memo

memo 数理情報工学演習第一 C プログラミング演習 ( 第 5 回 ) 2015/05/11 DEPARTMENT OF MATHEMATICAL INFORMATICS 1 今日の内容 : プロトタイプ宣言 ヘッダーファイル, プログラムの分割 課題 : 疎行列 2 プロトタイプ宣言 3 C 言語では, 関数や変数は使用する前 ( ソースの上のほう ) に定義されている必要がある. double sub(int

More information

インストールマニュアル

インストールマニュアル Install manual by SparxSystems Japan Enterprise Architect 日本語版インストールマニュアル 1 1. はじめに このインストールマニュアルは Enterprise Architect 日本語版バージョン 14.1 をインストールするための マニュアルです インストールには管理者権限が必要です 管理者権限を持つユーザー (Administrator

More information

管理番号 内容仮想テーブル設定画面およびマッチング条件設定画面においてコメントを設定した場合 変換エラーが発生する マッピング情報設定画面の出力情報に固定値を選択し区分に 動的バイナリ値 を指定した場合 関数を設定す

管理番号 内容仮想テーブル設定画面およびマッチング条件設定画面においてコメントを設定した場合 変換エラーが発生する マッピング情報設定画面の出力情報に固定値を選択し区分に 動的バイナリ値 を指定した場合 関数を設定す お客様各位 2011 年 9 月 28 日 株式会社セゾン情報システムズ HULFT 事業部 HULFT-DataMagic Ver.2 既知の障害に関するご報告 拝啓貴社ますますご清祥のこととお慶び申し上げます 平素は格別のご高配を賜り 厚く御礼申し上げます HULFT-DataMagic Ver.2.0.0 における既知の障害に関してご報告いたします 障害内容をご確認いただくとともに 10 月にリリースいたします

More information

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション 5 月 Java 基礎 1 タイトル Java 基礎 2 日間 概要 目的 サーバサイドのプログラミング言語で最もシェアの高い Java SE の基本を習得します 当研修ではひとつの技術ごとに実用的なアプリケーションを作成するため 効果的な学習ができます Java SE の多くの API の中で 仕事でよく利用するものを中心に効率よく学びます 実際の業務で最も利用される開発環境である Eclipse

More information

スライド 1

スライド 1 ver. 2018/4/13 プログラミング 計算機利用上の Tips 補足資料 分類 項目 ページ 計算機利用 ホスト計算機への接続方法 Unix (Linux) の基本的なコマンド容量制限についてターミナルで文字を大きくする方法 xtermで文字を大きくする方法 Fortran プログラミングについて最近あった事例 : コンパイル 実行時のエラーコンパイルオプションプログラムは正しそうなのに エラーが出る場合データファイルは正しそうなのに

More information

Prog1_12th

Prog1_12th 2013 年 7 月 4 日 ( 木 ) 実施 ファイル処理ファイルとはファイル (file) は日常用語では紙などを綴じたものを表すが, コンピュータ用語ではデータの集合体を指す言葉である ファイルは例えば, 文書ファイルやプログラムファイルのように, 用途によって分類されることもあれば, また, テキストファイルやバイナリファイルのように, ファイルの作り方によって分類されることもある なお,

More information