Symfoware Server - Fujitsusoftware.fujitsu.com/jp/manual/manualfiles/M080270/J2X...SQL...

421
J2X0-2268-09Z0(01) 2008 11 Windows/Solaris/Linux Symfoware Server アプリケーション開発ガイド (埋込み SQL )

Transcript of Symfoware Server - Fujitsusoftware.fujitsu.com/jp/manual/manualfiles/M080270/J2X...SQL...

  • J2X0-2268-09Z0(01)2008 年 11 月

    Windows/Solaris/Linux

    Symfoware Server

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

  • まえがき

    本書の目的

    本書は、埋込み SQL を利用したデータ操作のためのプログラムの開発方法について説明します。

    本書の読者

    本書は、Symfoware/RDB のデータベースを利用する方および Symfoware/RDB のデータベースを処理するアプリケーションを開発する方に読んでいただくように書かれています。本書を読むには、以下に示す技術および知識が必要で

    す。

    ・ Symfoware/RDB の機能およびデータベースの概要を理解している

    ・ Symfoware/RDB を適用する業務について知識をもっている

    ・ C 言語または COBOL 言語でアプリケーションを開発することができる

    ・ Solaris(TM) オペレーティングシステムを使用できる

    ・ Linux システムを使用できる

    ・ Windows(R)システムを使用できる

    参照

    グローバルサーバ上のデータベースを利用する場合には、“アプリケーション開発ガイド(埋込み SQL 編)グローバルサーバ連携”を参照してください。

    本書の構成

    本書の構成と内容は以下のとおりです。

    第 1 章 アプリケーション開発の概要

    埋込み SQL を利用したアプリケーション開発の概要を説明します。クライアント・サーバモデルの概要およびアプリケーション開発作業の流れを説明します。

    第 2 章 アプリケーションの設計

    埋込み SQL を利用したアプリケーションの設計時に考慮すべき点について説明します。コネクション、文字コード系およびトランザクションと排他制御について説明します。

    第 3 章 アプリケーションの作成

    埋込み SQL を利用したアプリケーションの作成方法を、言語別に説明します。C 言語および COBOL 言語のプログラムに SQL 文をコーディングする場合の規則、コーディング位置および SQL 文の実行結果の確認の方法について説明します。

    第 4 章 ルーチンを利用するアプリケーションの作成

    プロシジャルーチンおよびファンクションルーチンを利用するアプリケーションの作成方法について説明します。

    第 5 章 アプリケーションのコンパイル・リンク

    埋込み SQL を利用した C 言語または COBOL 言語のアプリケーションを、コンパイルおよびリンクし、実行可能ファイルを作成する方法について説明します。

    第 6 章 アプリケーションの実行

    埋込み SQL を利用した C 言語または COBOL 言語のアプリケーションの実行方法および動作環境のチューニング方法について説明します。

    付録 A C 言語のサンプルプログラム

    埋込み SQL を利用した C 言語のサンプルプログラムを記載します。

    - i -

  • 付録 B COBOL 言語のサンプルプログラム

    埋込み SQL を利用した COBOL 言語のサンプルプログラムを記載します。

    付録 C SQLSTATE 値

    SQL 文の実行結果としてアプリケーションに通知される SQLSTATE について説明します。

    付録 D 定量制限

    Symfoware/RDB の定量制限の一覧を示します。

    付録 E システム表

    Symfoware/RDB のシステム表で出力される情報の一覧と、その意味について説明します。

    付録 F 動作環境ファイルのパラメタ一覧

    アプリケーションの動作環境をチューニングするために、動作環境ファイルに指定できるパラメタの一覧を示します。

    付録 G 環境変数

    アプリケーションの動作環境をチューニングするための環境変数について説明します。

    付録 H 資源の見積り

    ソート作業域およびメモリの見積りについて説明します。

    付録 I アプリケーションおよび RDB コマンド間の排他

    アプリケーションおよび Symfoware/RDB のコマンドが同時に動作した場合の排他制御について説明します。

    付録 J SQL 文の使用範囲

    Symfoware/RDB がコンパイル・実行時にサポートする SQL 文の使用範囲について説明します。

    付録 K ファンクションルーチンのパラメタのデータ型と対応するデータ形式

    ファンクションルーチンのパラメタに指定されたデータベースのデータ型に対応するデータ形式について説明しま

    す。

    本書の読み方

    本書に記載するアプリケーションおよび SQL 文の記述の例は、特にことわらない限り C 言語での記述を使用します。COBOL の記述と特に異なる点については、“第 3 章 アプリケーションの作成”で説明します。

    関連マニュアル

    本書に関連するマニュアルは以下のとおりです。

    ・ Sun 日本語 COBOL 使用手引書

    ・ COBOL97 使用手引書

    ・ NetCOBOL 使用手引書

    ・ COBOL 文法書

    平成 19 年 5 月 初版平成 19 年 6 月 第 2 版平成 19 年 8 月 第 3 版平成 19 年 11 月 第 4 版平成 19 年 12 月 第 5 版平成 20 年 1 月 第 6 版平成 20 年 4 月 第 7 版平成 20 年 5 月 第 8 版平成 20 年 9 月 第 9 版平成 20 年 11 月 第 10 版

    - ii -

  • 目 次

    第 1 章 アプリケーション開発の概要...........................................................................................................................................11.1 埋込み SQL の概要............................................................................................................................................................................11.2 クライアント・サーバモデルの概要......................................................................................................................................................11.3 アプリケーション開発作業の流れ.......................................................................................................................................................3

    第 2 章 アプリケーションの設計..................................................................................................................................................62.1 アプリケーションの設計に必要な概念...............................................................................................................................................62.2 セション................................................................................................................................................................................................72.3 トランザクションと排他制御.................................................................................................................................................................9

    2.3.1 トランザクション制御の概要.......................................................................................................................................................102.3.2 トランザクション制御の方法.......................................................................................................................................................11

    2.3.2.1 トランザクションの終了方法................................................................................................................................................112.3.2.2 トランザクションモードの変更..............................................................................................................................................132.3.2.3 トランザクションとカーソル操作...........................................................................................................................................18

    2.3.3 SQL 文の処理結果異常とトランザクション................................................................................................................................202.3.4 アプリケーションの異常終了とトランザクション..........................................................................................................................212.3.5 排他制御....................................................................................................................................................................................21

    2.3.5.1 排他の属性と選択方法.......................................................................................................................................................212.3.6 資源の競合が起きた場合の制御..............................................................................................................................................312.3.7 行単位の排他を使用する場合の注意事項..............................................................................................................................332.3.8 デッドロックの対処方法..............................................................................................................................................................352.3.9 トランザクション実行時間の設定...............................................................................................................................................38

    2.4 コネクション........................................................................................................................................................................................382.4.1 コネクションの接続方法.............................................................................................................................................................392.4.2 複数コネクション.........................................................................................................................................................................41

    2.4.2.1 複数コネクションの接続......................................................................................................................................................412.4.2.2 現コネクションと SQL 文の実行..........................................................................................................................................422.4.2.3 現コネクションの変更..........................................................................................................................................................432.4.2.4 複数コネクションの切断......................................................................................................................................................452.4.2.5 複数コネクションで SQL 文を実行する場合の注意事項..................................................................................................46

    2.4.3 コネクションを意識しないデータ操作の方法............................................................................................................................482.4.3.1 接続先の指定方法..............................................................................................................................................................48

    2.4.4 マルチ RDB 運用のコネクション................................................................................................................................................492.5 文字コード系の考慮..........................................................................................................................................................................51

    2.5.1 文字コード系の決定...................................................................................................................................................................512.5.2 コード変換の考慮.......................................................................................................................................................................532.5.3 ホスト言語を混在する場合の注意事項.....................................................................................................................................58

    2.6 リモートアクセスする場合の注意事項..............................................................................................................................................582.6.1 概数を使用するときの注意事項................................................................................................................................................582.6.2 RDB2_TCP 接続時の注意事項................................................................................................................................................582.6.3 アプリケーションを UNICODE 環境で起動した時の注意事項................................................................................................61

    2.7 マルチスレッド環境におけるデータ操作..........................................................................................................................................622.8 名前の一意性と有効範囲.................................................................................................................................................................67

    2.8.1 埋込み C プログラムの場合.......................................................................................................................................................682.8.2 埋込み COBOL プログラムの場合............................................................................................................................................70

    2.9 システムコールを使用する場合の注意事項....................................................................................................................................732.10 SQL 文のデータ操作文に関する注意事項...................................................................................................................................752.11 コールバック機能の利用方法.........................................................................................................................................................75

    第 3 章 アプリケーションの作成................................................................................................................................................813.1 SQL 埋込み C プログラムの作成方法.............................................................................................................................................81

    3.1.1 アプリケーションのコーディング規則.........................................................................................................................................813.1.2 SQL 文の指定位置および指定順序.........................................................................................................................................813.1.3 ホスト変数および標識変数の指定方法....................................................................................................................................843.1.4 SQL 文の処理結果の確認........................................................................................................................................................88

    - iii -

  • 3.1.5 日本語文字使用時の注意事項.................................................................................................................................................903.1.6 可変長文字列のデータ操作......................................................................................................................................................923.1.7 日本語可変長文字列のデータ操作..........................................................................................................................................923.1.8 ポインタ変数として宣言したホスト変数の使用方法..................................................................................................................923.1.9 構造体として宣言したホスト変数の使用方法...........................................................................................................................963.1.10 BLOB 型のコンパイル時の展開方法....................................................................................................................................1023.1.11 DECIMAL 型または NUMERIC 型として宣言したホスト変数のコンパイル時の展開方法...............................................1033.1.12 拡張 SQL 文識別子を使用した動的 SQL 文の実行方法...................................................................................................1053.1.13 拡張カーソル名を使用したカーソル操作.............................................................................................................................107

    3.2 SQL 埋込み COBOL プログラムの作成方法.................................................................................................................................1093.2.1 アプリケーションのコーディング規則.......................................................................................................................................1093.2.2 SQL 文の指定位置および指定順序.......................................................................................................................................1103.2.3 ホスト変数および標識変数の指定方法..................................................................................................................................1133.2.4 SQL 文の処理結果の確認......................................................................................................................................................1143.2.5 可変長文字列のデータ操作....................................................................................................................................................1163.2.6 BLOB 型のコンパイル時の展開方法......................................................................................................................................1173.2.7 集団項目ホスト変数の記述方法.............................................................................................................................................1173.2.8 COBOL プログラム作成時の注意事項...................................................................................................................................1203.2.9 クラス定義を使用する場合の注意事項...................................................................................................................................1203.2.10 UNICODE を使用する場合のエンディアンの選択..............................................................................................................1213.2.11 拡張 SQL 文識別子を使用した動的 SQL 文の実行方法...................................................................................................1233.2.12 拡張カーソル名を使用したカーソル操作.............................................................................................................................125

    3.3 行識別子の使用時の注意事項......................................................................................................................................................1263.4 ロール使用時の記述方法...............................................................................................................................................................1283.5 一時表の使用方法..........................................................................................................................................................................128

    第 4 章 ルーチンを利用するアプリケーションの作成................................................................................................................1304.1 プロシジャルーチンを利用する場合..............................................................................................................................................130

    4.1.1 プロシジャルーチンとは...........................................................................................................................................................1304.1.2 プロシジャルーチンを利用するアプリケーションの作成の流れ.............................................................................................1304.1.3 プロシジャルーチンの定義......................................................................................................................................................1314.1.4 プロシジャルーチンの実行......................................................................................................................................................1334.1.5 プロシジャルーチンの処理結果..............................................................................................................................................1364.1.6 プロシジャルーチン利用時のトランザクション.........................................................................................................................138

    4.2 ファンクションルーチンを利用する場合.........................................................................................................................................1394.2.1 ファンクションルーチンとは......................................................................................................................................................1394.2.2 ファンクションルーチンを利用するアプリケーションの作成の流れ........................................................................................1394.2.3 ファンクションルーチンの定義.................................................................................................................................................1404.2.4 ライブラリの作成.......................................................................................................................................................................141

    4.2.4.1 ライブラリとして登録する C プログラムの作成方法..........................................................................................................1414.2.4.2 ライブラリとして登録する C プログラムのコンパイル・リンク.............................................................................................1474.2.4.3 ライブラリを作成する場合の注意事項..............................................................................................................................149

    4.2.5 ファンクションルーチンの実行.................................................................................................................................................1494.2.6 ファンクションルーチンからの異常通知..................................................................................................................................1504.2.7 テストドライバの作成および単体テストの実施........................................................................................................................153

    第 5 章 アプリケーションのコンパイル・リンク...........................................................................................................................1615.1 UNIX 系を使用した場合のアプリケーションのコンパイル・リンク..................................................................................................161

    5.1.1 アプリケーションのコンパイル・リンクの流れ............................................................................................................................1615.1.2 コンパイル・リンクのための環境設定.......................................................................................................................................1615.1.3 コンパイル・リンクの方法..........................................................................................................................................................1655.1.4 複数のコンパイル単位から構成されるアプリケーションのコンパイル・リンクの方法.............................................................172

    5.1.4.1 静的リンクする場合のコンパイル・リンク...........................................................................................................................1725.1.4.2 動的リンクする場合のコンパイル・リンク...........................................................................................................................1755.1.4.3 動的プログラム構造のコンパイル・リンク..........................................................................................................................179

    5.1.5 コンパイル時のコネクション先の指定......................................................................................................................................1805.2 Windows(R)を使用した場合のアプリケーションのコンパイル・リンク............................................................................................180

    5.2.1 アプリケーションのコンパイル・リンクの流れ............................................................................................................................181

    - iv -

  • 5.2.2 コンパイル・リンクのための環境設定.......................................................................................................................................1815.2.3 コンパイル・リンクの方法..........................................................................................................................................................1845.2.4 複数のコンパイル単位から構成されるアプリケーションのコンパイル・リンクの方法.............................................................190

    5.2.4.1 静的リンクする場合のコンパイル・リンク...........................................................................................................................1905.2.4.2 動的リンクする場合のコンパイル・リンク...........................................................................................................................1935.2.4.3 動的プログラム構造のコンパイル・リンク..........................................................................................................................196

    5.2.5 コンパイル時のコネクション先の指定......................................................................................................................................197

    第 6 章 アプリケーションの実行..............................................................................................................................................1986.1 アプリケーションの実行...................................................................................................................................................................198

    6.1.1 SERVER_SPEC の指定...........................................................................................................................................................1996.1.2 アプリケーションの起動(UNIX 系の場合)..............................................................................................................................1996.1.3 アプリケーションの起動(Windows(R)の場合).........................................................................................................................202

    6.2 アプリケーションのデバッグ.............................................................................................................................................................2056.2.1 状態変数およびメッセージ変数の利用方法...........................................................................................................................2056.2.2 SQL_SNAP 機能の利用方法..................................................................................................................................................2066.2.3 ROUTINE_SNAP 機能の利用方法........................................................................................................................................209

    6.3 最適化情報の更新..........................................................................................................................................................................2126.4 アプリケーションのチューニング.....................................................................................................................................................219

    6.4.1 動作環境ファイルの作成.........................................................................................................................................................2196.4.2 システム用の動作環境ファイルの作成...................................................................................................................................2226.4.3 クライアント用の動作環境ファイルの作成...............................................................................................................................2266.4.4 サーバ用の動作環境ファイルの作成......................................................................................................................................2556.4.5 データ操作範囲の限定方法....................................................................................................................................................257

    付録 A C 言語のサンプルプログラム......................................................................................................................................259A.1 可変長文字列のデータ操作例......................................................................................................................................................259A.2 日本語可変長文字列のデータ操作例..........................................................................................................................................265A.3 ポインタ型ホスト変数(文字列型)の使用例....................................................................................................................................271A.4 ポインタ型ホスト変数(可変長文字列型)の使用例........................................................................................................................272A.5 ポインタ型ホスト変数(BLOB 型)の使用例....................................................................................................................................273A.6 構造体型ホスト変数の使用例........................................................................................................................................................274A.7 BLOB 型を含む構造体型ホスト変数の使用例.............................................................................................................................276A.8 構造体型標識変数の使用例.........................................................................................................................................................277A.9 配列型標識変数の使用例.............................................................................................................................................................278A.10 マルチスレッド環境で動作するアプリケーションの例.................................................................................................................280A.11 コールバック機能の利用例..........................................................................................................................................................284A.12 状態変数およびメッセージ変数の使用例...................................................................................................................................289A.13 拡張カーソルを使用したカーソル操作の使用例........................................................................................................................291

    付録 B COBOL 言語のサンプルプログラム............................................................................................................................294B.1 可変長文字列のデータ操作例......................................................................................................................................................294B.2 マルチスレッド環境で動作するアプリケーションの例...................................................................................................................296B.3 集団項目の使用例.........................................................................................................................................................................298B.4 状態変数およびメッセージ変数の使用例.....................................................................................................................................299B.5 拡張カーソルを使用したカーソル操作の使用例..........................................................................................................................301

    付録 C SQLSTATE 値...........................................................................................................................................................304

    付録 D 定量制限...................................................................................................................................................................310

    付録 E システム表.................................................................................................................................................................317E.1 システム表の概要...........................................................................................................................................................................317E.2 システム表の参照...........................................................................................................................................................................318E.3 システム表の詳細...........................................................................................................................................................................322

    E.3.1 データベース定義情報............................................................................................................................................................323E.3.2 スキーマ定義情報...................................................................................................................................................................323E.3.3 表定義情報..............................................................................................................................................................................324E.3.4 列定義情報..............................................................................................................................................................................326

    - v -

  • E.3.5 制約定義情報..........................................................................................................................................................................329E.3.6 文字列を表現する表情報.......................................................................................................................................................330E.3.7 一意性制約の定義情報..........................................................................................................................................................331E.3.8 列一覧情報..............................................................................................................................................................................331E.3.9 注釈情報..................................................................................................................................................................................333E.3.10 インデックス情報....................................................................................................................................................................334E.3.11 ルーチン定義情報.................................................................................................................................................................334E.3.12 ルーチンパラメタ情報............................................................................................................................................................336E.3.13 権限情報................................................................................................................................................................................339E.3.14 トリガ定義情報........................................................................................................................................................................342E.3.15 トリガ列一覧情報....................................................................................................................................................................345E.3.16 順序情報................................................................................................................................................................................346E.3.17 利用者情報............................................................................................................................................................................348E.3.18 ユーザパラメタ設定情報........................................................................................................................................................350E.3.19 ロール情報.............................................................................................................................................................................350E.3.20 ロールに付与された権限の情報...........................................................................................................................................351E.3.21 利用者に対するロールの付与情報......................................................................................................................................353E.3.22 SQL 文の簡易実行情報........................................................................................................................................................354

    付録 F 動作環境ファイルのパラメタ一覧.................................................................................................................................356

    付録 G 環境変数...................................................................................................................................................................362

    付録 H 資源の見積り.............................................................................................................................................................376H.1 ソート作業域の見積り.....................................................................................................................................................................376

    H.1.1 共用ソート作業域....................................................................................................................................................................376H.1.2 固有ソート作業域....................................................................................................................................................................376

    H.2 メモリの見積り式.............................................................................................................................................................................377H.2.1 アプリケーション実行時のメモリ見積り....................................................................................................................................377

    付録 I アプリケーションおよび RDB コマンド間の排他.............................................................................................................378

    付録 J SQL 文の使用範囲.....................................................................................................................................................396

    付録 K ファンクションルーチンのパラメタのデータ型と対応するデータ形式...............................................................................402

    索引......................................................................................................................................................................................408

    - vi -

  • 第 1 章 アプリケーション開発の概要Symfoware/RDB には、データベースを作成するための機能、データベースを管理するための機能、およびデータベースのデータを操作するための機能があります。データベースを作成するためには、まずデータベース構造を設計し、その

    設計に基づいてデータベースを定義します。そして、この定義に基づいてデータベースを創成します。データベースの

    管理は、データベースの利用状況を調べたり、データベースの破壊に対処したりするために必要です。データベース内

    のデータをアクセスするには、SQL 文を使用します。

    また、Symfoware/RDB は、システム間のネットワークを含めた柔軟なクライアント・サーバシステムを構築するための機能を提供します。

    本章では、以下の項目について説明します。

    1.1 埋込み SQL の概要Symfoware/RDB のデータベースの基本的な利用形態として、埋込み SQL を利用した C 言語または COBOL 言語のアプリケーションからの利用があります。

    業務処理を行うアプリケーションを、プロシジャを利用してサーバで実行させたり、パソコン上で Symfoware Server クライアント機能のデータベースアクセス機能(Esql)を利用して実行したりすることができます。

    この利用形態の概要を以下に示します。

    図 1.1 埋込み SQL を利用したアプリケーションによる Symfoware/RDB の利用形態

    1.2 クライアント・サーバモデルの概要ここでは、クライアント・サーバモデルの概要について、以下の順に説明します。

    ・ クライアントとは

    ・ サーバとは

    ・ 通信方法

    ・ トランザクション制御

    ・ クライアント・サーバモデルの利用パターン

    クライアントとは

    クライアントとは、データ処理を要求する動作単位のことです。データベースシステムをクライアント・サーバモデルで運用

    する場合には、データベースに対してアクセスを要求するアプリケーションは、クライアントとして位置づけられます。

    サーバとは

    サーバとは、データ処理を実行する動作単位のことです。データベースシステムをクライアント・サーバモデルで運用す

    る場合は、データベース本体が存在する側として位置づけられます。

    - 1 -

  • 通信方法

    クライアントとサーバとの間の通信方法は、クライアントのサーバに対するアクセス方法によって異なります。

    ローカルアクセス

    ローカルのサーバに接続し、データの操作などを行うことを、ローカルアクセスといいます。

    リモートアクセス

    リモートのサーバに接続し、データの操作などを行うことを、リモートアクセスといいます。

    通信方法の選択

    ローカルアクセスする場合は、自動的にサーバと接続されます。リモートアクセスする場合の通信方法には、以下の 2種類があります。

    - 性能を重視した RDB2_TCP 連携

    Symfoware/RDB 専用のプロトコルを使用すると、高速にデータベースにリモートアクセスすることができます。

    - OSI(Open Systems Interconnection)の汎用プロトコルを使用した RDA-SV 連携

    RDA プロトコルでアクセスするアプリケーションを作成する場合に使用します。

    リモートアクセスする場合の通信方法は、クライアント用の動作環境ファイルの SERVER_SPEC で指定します。通信方法と SERVER_SPEC の指定および接続できるサーバの種類と接続方法について以下に示します。

    表 1.1 通信方法と SERVER_SPEC の指定について

    通信方法SERVER_SPEC の

    指定

    リモートア

    クセス

    性能を重視した RDB2_TCP 連携 RDB2_TCP

    OSI の汎用プロトコルを使用したRDA-SV 連携

    RDA

    表 1.2 接続できるサーバの種類と接続方法についてSERVER

    _SPEC

    接続形態 Windows Solaris Linuxグローバル

    サーバ

    RDB2_TCP

    TCP/IP ○ ○ ○ ○

    RDA TCP/IP ○ ○ × ○

    ○ : 接続可能

    × : 接続不可能

    トランザクション制御

    データベースの定義、検索および更新に対してデータの整合性を保つためのトランザクション制御機能が、有効に働き

    ます。そのため、ローカルを含む複数のサーバとの連携時も安全にデータベースへアクセスすることができます。ただし、

    1 トランザクション内で複数サーバに対するデータベースの同時更新はできません。1 つのトランザクション内では 1 つのサーバの 1 つのデータベースに対してだけ更新できます。

    クライアント・サーバモデルの利用パターン

    Symfoware/RDB は、Solaris、Linux、Windows(R) 2000、Windows(R) XP 、Windows Server(R) 2003、WindowsVista(R)、Windows Server(R) 2008 および日本語 MS-DOS 上のアプリケーションをクライアントとし、Solaris、Linux、Windows(R) 2000、Windows Server(R) 2003、Windows Server(R) 2008 またはグローバルサーバをサーバとして使用することができます。ローカルのデータベースとリモートのデータベースを 1 つのアプリケーションから同時にアクセスすることができます。利用パターンを以下に示します。

    - 2 -

  • 図 1.2 クライアント・サーバモデルの利用パターン

    1.3 アプリケーション開発作業の流れデータベースの設計が完了したら、データベースへアクセスするアプリケーションを開発します。アプリケーションの開発

    作業の流れを以下に示します。なお、アプリケーションの実行処理を行うためには、Symfoware/RDB の起動が必要となります。

    - 3 -

  • 図 1.3 アプリケーション開発作業の流れ

    アプリケーションの設計

    データベースを処理するアプリケーションの設計作業は、一般のアプリケーションの開発作業と変わりません。データベー

    ス特有に考慮すべき点を以下に示します。

    アプリケーションの言語種の選択

    データベースを処理するための言語には、C 言語および COBOL 言語があります。アクセス対象の表の列の属性などを考慮して選択する必要があります。

    トランザクション

    データベースは、複数のアプリケーションから共用して利用します。このため、アプリケーション間の排他を考慮して

    プログラムを設計する必要があります。たとえば、2 つのアプリケーションが別の表を参照したあと、互いに他方のアプリケーションが参照している表を更新するようなプログラムを同時に実行すると、デッドロックが発生して処理ができな

    くなることがあります。

    データ操作の SQL 文の選択

    アプリケーションで実行する SQL 文が決定している場合は、通常のデータ操作の SQL 文(動的 SQL 文以外の SQL文)をアプリケーション中に埋め込んで利用します。アプリケーションの実行中に SQL 文を動的に実行する場合は、動的SQL 文をアプリケーション中に埋め込んで利用します。

    アプリケーションのコーディング

    アプリケーションは、ホスト言語のプログラム中に SQL 文を埋め込んで記述します。このようなプログラムを SQL 埋込みホストプログラムと呼びます。ホスト言語には、C 言語および COBOL 言語があります。アプリケーションのコーディング方法については、“3.1 SQL 埋込み C プログラムの作成方法”および“3.2 SQL 埋込み COBOL プログラムの作成方法”で説明します。

    コンパイルおよびリンク

    SQL 埋込みホストプログラムをコンパイルするためには、利用者依存のコンパイル環境を作成し、この上でコンパイル処理を行います。

    コンパイル環境と、コンパイルおよびリンクの方法については、“5.1 UNIX 系を使用した場合のアプリケーションのコンパイル・リンク”および“5.2 Windows(R)を使用した場合のアプリケーションのコンパイル・リンク”で説明します。

    アプリケーションの実行

    アプリケーションのコンパイルとリンクが完了すると、実際に実行してデバッグを行い、意図した動作が行われることを確

    認します。

    実行のためには、データ操作の SQL 文で指定されている表に対して、表の DSI の定義および DSI の初期化が完了している必要があります。

    - 4 -

  • 参照

    表の DSI の定義および DSI の初期化については、“RDB 運用ガイド(データベース定義編)”を参照してください。

    通常は、動作を確認するために必要なデータの創成を完了してから実行します。アプリケーションを実行するための実

    行方法については、“第 6 章 アプリケーションの実行”で説明します。また、アプリケーションのデバッグ方法については、“6.2 アプリケーションのデバッグ”で説明します。

    - 5 -

  • 第 2 章 アプリケーションの設計本章では、埋込み SQL を利用したアプリケーションの設計時に考慮すべき点を説明します。本章は、アプリケーションの設計をする場合にお読みください。

    2.1 アプリケーションの設計に必要な概念埋込み SQL アプリケーションを利用してデータベースアクセスの設計を行う場合、埋込み SQL に関係する基本的な概念を理解する必要があります。ここでは、埋込み SQL アプリケーションを利用してデータベースアクセスを行うアプリケーションの設計に必要な概念として、セション、トランザクションおよびコネクションについて説明します。

    セション

    Symfoware/RDB にアクセスする環境をセションと呼びます。

    1 つのプロセスで 1 つのセションを実行する場合は、最初の SQL 文の実行時に Symfoware/RDB が自動的にセション環境を作成しています。一般的には、利用者は特にセションを意識する必要はありません。

    以下の場合は、セションを意識し、複数作成する必要があります。

    ・ マルチスレッド環境で、データベースアクセスを行う場合

    ・ 複数のコネクションで独立してトランザクション操作をしたい場合

    ・ セション単位に、アプリケーションの動作を変更したい場合

    アプリケーション内で、セションを操作する関数を呼び出すことで、1 つのアプリケーションプロセスで複数のセションを同時に作成することができます。

    詳細については、“2.2 セション”を参照してください。

    トランザクション

    Symfoware/RDB では、データベースの更新は、データ操作の SQL 文の実行ごとに行われるのではなく、トランザクション制御の SQL 文に従って、データベースの更新が行われます。データベースの更新の単位をトランザクションと呼びます。

    詳細については、“2.3 トランザクションと排他制御”を参照してください。

    コネクション

    コネクションとは、クライアントのアプリケーションがサーバの Symfoware/RDB データベースにアクセスするために、クライアントとサーバの間を結んだ接続関係のことです。アプリケーションがデータベースシステムとコネクションをもつことによっ

    て、そのデータベースシステムの資源を操作することができます。

    詳細については、“2.4 コネクション”を参照してください。

    アプリケーションと、セション・トランザクション・コネクションの関係を以下に示します。

    - 6 -

  • 図 2.1 アプリケーションと、セション・トランザクション・コネクションの関係

    1 つのアプリケーションプロセスには、1 つまたは複数のセションを作成できます。

    1 つのセションでは、1 つまたは複数のトランザクションを実行することができます。ただし、1 つのセションで複数のトランザクションを同時に実行することはできません。

    1 つのセションから、1 つまた複数のコネクションを接続することができます。

    2.2 セションここでは、セションの作成および複数セションについて説明し、セション操作の例を示します。

    セションの作成

    アプリケーションプロセスには、1 つまたは複数のセションを作成することができます。

    セションを作成する方法には、以下の 2 つがあります。

    ・ Symfoware/RDB が自動的にセションを作成する

    ・ 利用者がセションを操作する関数を呼び出してセションを作成する

    Symfoware/RDB が自動的にセションを作成する

    アプリケーションで最初の SQL 文が実行されると、Symfoware/RDB が自動的にセションを作成します。

    1 つのアプリケーションプロセスで 1 つのセションを利用する場合は、最初の SQL 文の実行がセションの開始であり、アプリケーションの終了がセションの終了となります。

    利用者がセションを操作する関数を呼び出してセションを作成する

    アプリケーション中でセションを操作する関数を呼び出すことにより、セションを作成することができます。複数のセショ

    ンを作成する要件がある場合は、セションを操作する関数を利用します。

    セションを操作する関数を利用する場合は、SQLThrStartID 関数の実行がセションの開始であり、SQLThrEndID 関数の実行がセションの終了となります。

    複数セション

    複数セションを作成には、以下の 3 つがあります。

    ・ マルチスレッド環境で、データベースアクセスを行う場合

    - 7 -

  • ・ 複数のコネクションで独立してトランザクション操作をしたい場合

    ・ セション単位に、アプリケーションの動作を変更したい場合

    マルチスレッド環境で、データベースアクセスを行う場合

    スレッドごとにセションを割り当てることで、スレッド同士で影響を与えずにデータベースアクセスを実施できます。

    マルチスレッド環境で動作するアプリケーションを開発する方法については、“2.7 マルチスレッド環境におけるデータ操作”を参照してください。

    複数のコネクションで独立してトランザクション操作をしたい場合

    1 つのセションで複数のコネクションを利用する場合、1 つのトランザクションで、複数のコネクションに対してデータベースを更新する SQL 文は実行できません。複数のコネクションで、それぞれ更新を並行して実施する場合は、複数のセションを作成することで実現できます。

    セション単位に、アプリケーションの動作を変更したい場合

    ロール、省略時のスキーマ名、利用者、トランザクションモードなどの値は、セション単位に変更できます。1 つのアプリケーションで、これらの変更可能な値が異なる環境を複数利用したい場合は、セションを複数作成し、それぞれの

    値を変更することで、実現できます。

    複数セションを作成するには、セションを操作する関数を利用します。

    セションを操作する関数には、以下の 4 つがあります。

    ・ SQLThrAllocID 関数

    ・ SQLThrStartID 関数

    ・ SQLThrEndID 関数

    ・ SQLThrFreeID 関数

    参照

    各関数の詳細については、“SQL リファレンス”を参照してください。

    セションは、セションを操作する関数を使用して、以下の手順で作成します。

    (1) SQLThrAllocID 関数を発行して、セションを作成します。プロセス内でセションを識別するためのセション ID を受け取ります。

    (2) SQLThrStartID 関数を発行して、セションを開始します。これにより、セションと動作スレッドが関係付けられます。

    (3) データベースを検索および更新する SQL 文を実行します。

    - 8 -

  • (4) SQLThrEndID 関数を発行して、セションと動作スレッドの関係付けを終了します。

    (5) SQLThrFreeID 関数を発行して、セションを破棄します。

    セション操作の例

    以下に、シングルスレッドで複数セションを作成する場合の例を示します。

    マルチスレッドの場合の使用方法は、“2.7 マルチスレッド環境におけるデータ操作”を参照してください。

    SQLHDBS ses_id1;

    SQLHDBS ses_id2;

    int main( void ) {

    EXEC SQL BEGIN DECLARE SECTION;

    char SQLSTATE[6];

    char SQLMSG[256];

    EXEC SQL END DECLARE SECTION;

    SQLThrAllocID( &ses_id1 );

    SQLThrAllocID( &ses_id2 );

    sub01(ses_id1);

    sub02(ses_id2);

    sub03(ses_id1);

    sub03(ses_id2);

    SQLThrFreeID ( ses_id1 );

    SQLThrFreeID ( ses_id2 );

    return 0;

    }

    void sub01(SQLHDBS ses_id) {

    SQLThrStartID( ses_id );

    EXEC SQL CONNECT TO 'SV1';

    EXEC SQL INSERT INTO SCH.TBL ・・・ ;

    EXEC SQL COMMIT WORK;

    SQLThrEndID ( ses_id );

    return 0;

    }

    void sub02(SQLHDBS ses_id) {

    SQLThrStartID( ses_id );

    EXEC SQL CONNECT TO 'SV2';

    EXEC SQL INSERT INTO SCH.TBL ・・・ ;

    EXEC SQL COMMIT WORK;

    SQLThrEndID ( ses_id );

    return 0;

    }

    void sub03(SQLHDBS ses_id) {

    SQLThrStartID( ses_id );

    EXEC SQL DISCONNECT ALL;

    SQLThrEndID ( ses_id );

    return 0;

    }

    2.3 トランザクションと排他制御Symfoware/RDB では、トランザクション単位にデータベースの更新が行われます。複数のトランザクションが同時に同じデータベースを参照または更新すると、データの矛盾が発生してしまいます。このようなことを防ぐために、Symfoware/RDBは、排他制御を行います。ここでは、トランザクション処理と排他制御について説明します。

    - 9 -

  • 2.3.1 トランザクション制御の概要Symfoware/RDB では、データベースの更新は、データ操作の SQL 文の実行ごとに行われるのではなく、トランザクション制御の SQL 文に従って行われます。データベースの更新の単位をトランザクションと呼びます。

    本節では、SQL 文を使用してデータ操作を行った場合に、Symfoware/RDB が操作の内容をどのようにデータベースへ反映するかを説明します。

    トランザクションの開始

    トランザクションは、Symfoware/RDB により自動的に開始されます。アプリケーション中の SQL 文を実行する場合、トランザクションが開始された状態でなければ、SQL 文の処理に先立ってトランザクションが開始されます。トランザクションが開始されていない状態とは、アプリケーションが実行開始したあと、またはトランザクション制御用の SQL 文によってトランザクションが終了したあと、SQL 文が一度も実行されていない状態です。

    SQL 文には、トランザクションを開始しない SQL 文もあります。

    ・ トランザクションを開始する SQL 文

    - カーソル宣言以外のデータ操作文

    - 動的カーソル宣言以外の動的 SQL 文

    - CALL 文

    ・ トランザクションを開始しない SQL 文

    - トランザクション制御文

    - コネクション管理文

    - セション管理文

    - 埋込み例外宣言

    - カーソル宣言

    - 動的カーソル宣言

    - 資源操作文

    - SET USER PASSWORD 文

    - SET ROLE 文

    トランザクションの終了

    トランザクションは、以下の SQL 文を実行することによって、終了させることができます。また、アプリケーションが正常終了すると、自動的に終了します。

    表 2.1 トランザクションを制御する SQL 文SQL 文 機能

    COMMIT文

    現在のトランザクションを終了します。

    トランザクション内でのデータ操作(注)をすべてデータベースに反

    映します。

    オープン中のすべてのカーソルをクローズします。ただし、トランザ

    クションを超越するカーソルはクローズしません。

    トランザクション内で獲得したロックをすべて解放します。

    ROLLBACK 文

    現在のトランザクションを終了します。

    トランザクション内でのデータ操作(注)はすべて取り消します。

    オープン中のすべてのカーソルをクローズします。

    トランザクション内で獲得したロックをすべて解放します。

    注) データ操作には、挿入、更新および削除があります。

    - 10 -

  • トランザクションを制御する例

    トランザクションを制御する例を以下に示します。データ操作の SQL 文を実行すると、トランザクションごとに、そのトランザクション内で処理されたデータがデータベースに反映されます。

    図 2.2 データベースの更新処理

    2.3.2 トランザクション制御の方法アプリケーションでは、トランザクションを終了させたり、モードを変更させたりすることができます。ここでは、トランザクショ

    ンの終了方法と、トランザクションモードの変更方法について説明します。

    2.3.2.1 トランザクションの終了方法トランザクションの終了方法には、以下の 3 つの方法があります。

    ・ COMMIT 文によるトランザクションの終了

    ・ ROLLBACK 文によるトランザクションの終了

    ・ アプリケーションの終了によるトランザクションの終了

    COMMIT 文によるトランザクションの終了

    COMMIT 文は、トランザクションの区切りを指定する SQL 文です。COMMIT 文により行われる処理は、以下のとおりです。

    ・ 処理中のトランザクションを終了し、このトランザクションで行われたデータ操作をデータベースに反映します。

    ・ オープン中のすべてのカーソルをクローズします。ただし、トランザクションを超越するカーソルはクローズしません。

    ・ このトランザクションで獲得した、データベース資源のロックをすべて解放します。

    前に実行した COMMIT 文または ROLLBACK 文以後、当該 COMMIT 文までに行ったデータベースの処理をデータベースに反映します。次に、現在のトランザクションを終了します。一度も COMMIT 文または ROLLBACK 文を実行していない場合は、アプリケーションの実行開始から当該 COMMIT 文までのデータベースの処理をデータベースに反映します。

    COMMIT 文の形式を以下に示します。

    - 11 -

  • COMMIT WORK

    COMMIT 文によるデータベース更新の例を以下に示します。

    図 2.3 COMMIT 文によるデータベース更新の例

    ROLLBACK 文によるトランザクションの終了

    ROLLBACK 文は、トランザクション内で行ったデータベースの処理を取り消すための SQL 文です。ROLLBACK 文により行われる処理を以下に示します。

    ・ 処理中のトランザクションを終了し、このトランザクションで行われたすべての変更を取り消します。データベースは更新されません。

    ・ オープン中のすべてのカーソルをクローズします。

    ・ このトランザクションで獲得した、データベース資源のロックをすべて解放します。

    前に実行した COMMIT 文または ROLLBACK 文実行以後、当該 ROLLBACK 文までに行ったデータベースの処理を取り消します。そして、現在のトランザクションを終了します。一度も COMMIT 文または ROLLBACK 文を実行していない場合は、アプリケーションの実行開始から当該 ROLLBACK 文までのデータベースの処理を取り消します。

    ROLLBACK 文の形式を以下に示します。

    ROLLBACK WORK

    ROLLBACK 文によるトランザクション取消しの例を以下に示します。

    - 12 -

  • 図 2.4 ROLLBACK 文によるトランザクション取消しの例

    アプリケーションの終了によるトランザクションの終了

    アプリケーションがトランザクション開始状態のまま COMMIT 文も ROLLBACK 文も実行せずに終了する場合には、Symfoware/RDB がトランザクションをロールバックします。

    トランザクションが開始状態のままアプリケーションが終了する例を以下に示します。

    図 2.5 トランザクション開始状態でのアプリケーションの終了の例

    2.3.2.2 トランザクションモードの変更トランザクションモードの初期値は、動作環境ファイルの DEFAULT_ACCESS_MODE および DEFAULT_ISOLATIONで設定します。また、トランザクションモードの変更は、SET TRANSACTION 文で行います。トランザクションモードには、以下の 2 つの項目があります。

    ・ トランザクションアクセスモード

    ・ 独立性水準

    トランザクションアクセスモード

    トランザクションアクセスモードでは、実行できる SQL 文の種類を設定します。トランザクションアクセスモードには、以下の2 種類があります。

    - 13 -

  • READ ONLY:

    読込み専用モードです。トランザクション内で参照系の SQL 文のみ、実行することができます。

    READ WRITE:

    更新可能モードです。トランザクション内で参照系および更新系の SQL 文を実行することができます。

    トランザクションアクセスモードの初期値は、動作環境ファイルの DEFAULT_ACCESS_MODE の指定により決まります。

    独立性水準

    複数のトランザクションが同じ資源にアクセスする場合、なにも制御を行わないと、データの矛盾が発生してしまいます。

    独立性水準では、このようなことが起こらないように、あるトランザクションがアクセスしているデータに対し、他のトランザク

    ションによる参照または更新を制御します。また、他のトランザクションが更新中の資源に対し、自トランザクションが参照

    または更新できるかを制御します。

    独立性水準には以下の 4 種類があります。

    ・ SERIALIZABLE

    ・ REPEATABLE READ

    ・ READ COMMITTED

    ・ READ UNCOMMITTED

    独立性水準の初期値は、動作環境ファイルの DEFAULT_ISOLATION の指定により決まります。ただし、動作環境ファイルの R_LOCK が NO の場合、DEFAULT_ISOLATION に REPEATABLE_READ を指定しても、SERIALIZABLEになります。また、動作環境ファイルの R_LOCK が YES の場合は、DEFAULT_ISOLATION に SERIALIZABLE を指定しても、REPEATABLE READ になります。

    独立性水準は、SET TRANSACTION 文で変更可能です。

    ただし、動作環境ファイルの R_LOCK が NO の場合は、SET TRANSACTION 文に REPEATABLE READ を指定しても、SERIALIZABLE になります。また、動作環境ファイルの R_LOCK が YES の場合は、SET TRANSACTION 文にSERIALIZABLE を指定しても、REPEATABLE READ になります。

    また、動作環境ファイルで DSO_LOCK を指定した場合、SET TRANSACTION 文は指定できません。

    参照

    SET TRANSACTION 文の詳細は、“SQL リファレンス”を参照してください。

    あるトランザクションの実行中に現れる可能性のある現象を以下に示します。

    ・ 現象 1)

    トランザクション T1 が行を更新する。T1 がトランザクションを終了する前に、トランザクション T2 がその行を読み込む。T1 が ROLLBACK 文を実行した場合、T2 は存在しなかった行を読むことになる。

    ・ 現象 2)

    トランザクション T1 が行を読み込む。トランザクション T2 が、その行を更新または削除し、COMMIT 文を実行する。T1 がその行を再び読もうとした場合、更新した値を受け取るかまたはその行が削除されたことを知る。

    ・ 現象 3)

    トランザクション T1 が、ある探索条件を満たす行の集合を読み込む。トランザクション T2 が、その探索条件を満たす行を追加する。T1 が、同じ探索条件で再度行の集合を読み込んだ場合、最初とは異なった行の集合を得ることになる。

    独立性水準 現象 1) 現象 2) 現象 3)

    SERIALIZABLE 不可能 不可能 不可能

    REPEATABLEREAD

    不可能 不可能 可能

    - 14 -

  • 独立性水準 現象 1) 現象 2) 現象 3)

    READCOMMITTED

    不可能 可能 可能

    READUNCOMMITTED

    可能 可能 可能

    SERIALIZABLE

    あるトランザクションが参照または更新した資源は、そのトランザクションが終了するまで、他のトランザクションから更新さ

    れないことが保証されます。

    動作環境ファイルのパラメタ R_LOCK で行単位の排他が指定されていない場合に有効です。

    SERIALIZABLE の場合の排他処理を以下に示します。

    図 2.6 SERIALIZABLE の場合の排他

    (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 が指定された場合は、該当のトランザクションがアクセスしていない行は占有しないので、同一トランザクション内で、同一の SQL 文をくり返し実行しても、異なる集合が検索される場合があります。

    REPEATABLE READ の場合の排他処理を以下に示します。

    - 15 -

  • 図 2.7 REPEATABLE READ の場合の排他

    (1) 利用者 A は、COL1 が A の行を参照します。トランザクションが終了するまでこの行の集合を占有します。

    (2) 利用者 B は、利用者 A が参照した行に対しては更新することができませんが、INSERT 文で行を追加することはできます。

    (3) 利用者 A が、再び COL1 が A の行を参照します。このとき前回参照した行に加えて、利用者 B が追加した行も検索されます。

    READ COMMITTED

    あるトランザクションが更新した資源は、そのトランザクションが終了するまで、他のトランザクションから更新されないこと

    が保証されます。しかし、以下のいずれかの SQL 文で参照した資源に対しては、他のトランザクションから更新される可能性があります。

    ・ 単一行 SELECT 文

    ・ 更新可能性句に、FOR READ ONLY を指定したカーソルの OPEN 文

    ・ トランザクションアクセスモードが読込み専用モードのときの OPEN 文

    したがって、同一トランザクション内でも、テーブル参照ごとに内容が異なる場合があります。

    READ COMMITTED の場合の排他処理を以下に示します。

    - 16 -

  • 図 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 -

  • 図 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)します。

    2.3.2.3 トランザクションとカーソル操作カーソルは、一般に、トランザクション終了時にクローズされます。しかし、次の場合、カーソルはクローズされません。

    ・ トランザクションの独立性水準指定が READ COMMITTED で、カーソル指定の更新可能性句が FOR READ ONLYの場合

    ・ カーソル宣言に、カーソルモード指定がある場合

    以下に独立性水準指定に READ COMMITTED を指定し、更新可能性句に FOR READ ONLY を指定して実現する、トランザクションを超越するカーソル操作の SQL 文の例を示します。

    EXEC SQL DECLARE CSR1 CURSOR FOR ……(1)

    SELECT * FROM 取引先会社

    WHERE 電話番号 LIKE :hcomp_word

    FOR READ ONLY;

    - 18 -

  • EXEC SQL SET TRANSACTION READ ONLY, ……(2)

    ISOLATION LEVEL READ COMMITTED;

    EXEC SQL OPEN CSR1; ……(3)

    EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(4)

    EXEC SQL COMMIT WORK; ……(5)

    EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(6)

    (データの終了)

    EXEC SQL CLOSE CSR1; ……(7)

    (1) カーソル“CSR1”を宣言します。更新可能性句に“FOR READ ONLY”を設定します。

    (2) トランザクションアクセスモードに“READ ONLY”を設定します。独立性水準に“READ COMMITTED”を設定します。

    (3) カーソル“CSR1”をオープンします。

    (4) 探索条件が真となる行にカーソルを位置づけ、その行を読み込みます。

    (5) COMMIT によりトランザクションを終了します。

    (6) (5)でカーソルがクローズされないため、カーソルを位置づけることができます。

    (7) データ終了後、カーソル“CSR1”をクローズします。

    また、以下にカーソルモード指定によって実現する、トランザクションを超越するカーソル操作の SQL 文の例を示します。

    EXEC SQL DECLARE CSR1 CURSOR FOR ……(1)

    SELECT * FROM 取引先会社

    WHERE 電話番号 LIKE :hcomp_word

    WITH OPTION LOCK_MODE(FREE LOCK),CURSOR_MODE(HOLD);

    EXEC SQL OPEN CSR1; ……(2)

    EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(3)

    EXEC SQL COMMIT WORK; ……(4)

    EXEC SQL FETCH CSR1 INTO :hnumber,:hproduct,:hstock; ……(5)

    (データの終了)

    EXEC SQL CLOSE CSR1; ……(6)

    (1) カーソル“CSR1”を宣言します。カーソルモード指定に“HOLD”を設定します。

    (2) カーソル“CSR1”をオープンします。

    (3) 探索条件が真となる行にカーソルを位置づけ、その行を読み込みます。

    (4) COMMIT によりトランザクションを終了します。

    (5) (4)でカーソルがクローズされないため、カーソルを位置づけることができます。

    (6) データ終了後、カーソル“CSR1”をクローズします。

    - 19 -

  • トランザクションを超越するカーソルを使用する場合の注意事項

    トランザクションを超越するカーソルを使用する場合、カーソルのオープン中に、そのカーソルが参照する表の定義や格

    納構造定義が変更されると、次のトランザクションで FETCH 文の実行が、SQLSTATE 値が 24000(カーソル不当)のエラーとなります。このエラーが発生した場合は、カーソルをクローズして、再度オープンするようにしてください。

    2.3.3 SQL 文の処理結果異常とトランザクションデータ操作の SQL 文の処理中に異常が発生した場合には、アプリケーションにエラーで復帰します。エラーで復帰したときのトランザクションの状態は、エラーの原因がデッドロックによる場合と、そうでない場合によって異なります。エラーの

    原因を示すコードは、状態変数“SQLSTATE”に設定されます。

    状態変数“SQLSTATE”に設定される値は、以下のとおりです。

    エラー原因がデッドロックの場合の SQLSTATE:

    40xxx

    エラー原因がデッドロック以外の場合 SQLSTATE:

    40xxx 以外

    デッドロック以外のエラー発生時のトランザクション

    エラーが発生した SQL 文による更新は、その SQL 文を実行する直前の状態に戻されてアプリケーションへ復帰します。ただし、この SQL 文の実行までに獲得されたデータベース資源の占有とカーソルの位置はそのまま保持されます。このとき、トランザクションは継続されたままになっています。トランザクションをそのまま継続させるか終了させるかは、エラー

    の原因ごとに利用者がアプリケーションの論理に従って決定します。たとえば、INSERT 文で表にデータを繰り返し挿入するような処理では、あるデータが表の一意性制約に違反するエラーとなっても、そのデータを無視して引き続きデータ

    を挿入すればよい場合には、トランザクションは継続させて処理を続行します。また、互いに関連のある複数の表を更新

    するような処理では、ある表の更新時にエラーが発生した場合、表の間での整合を保つために、ROLLBACK 文を実行してトランザクションをロールバックします。

    なお、動作環境ファイルのパラメタ“TRAN_SPEC”の指定により、トランザクションの対処方法を変更することができます。動作環境ファイルについては、“6.4 アプリケーションのチューニング”を参照してください。

    データ操作の SQL 文の実行でエラーが発生した場合の例を以下に示します。

    図 2.10 データ操作の SQL 文の実行でエラーが発生した場合の例

    デッドロックによるエラー発生時のトランザクション

    エラーの原因がデッドロックによる場合は、トランザクションはロールバックされてアプリケーションへ復帰します。したがっ

    て、この SQL 文の実行までに獲得されたデータベース資源のロックは解放され、オープン中のカーソルは閉じられます。

    - 20 -

  • デッドロックが発生した場合のアプリケーションの対処方法については、“2.3.8 デッドロックの対処方法”で説明します。

    2.3.4 アプリケーションの異常終了とトランザクションアプリケーションは実行中に異�