sql アプリケーション開発ガイド -...

357
J2UL-1756-04Z0(00) 201410Windows/Solaris/Linux FUJITSU Software Symfoware Server V12.1.x アプリケーション開発ガイド (埋込みSQL)

Upload: others

Post on 12-May-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

J2UL-1756-04Z0(00)2014年10月

Windows/Solaris/Linux

FUJITSU SoftwareSymfoware Server V12.1.x

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

まえがき

本書の目的

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

本書の読者

本書は、Symfoware/RDBのデータベースを利用する方およびSymfoware/RDBのデータベースを処理するアプリケーショ

ンを開発する方に読んでいただくように書かれています。本書を読むには、以下に示す技術および知識が必要です。

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

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

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

・ Oracle Solarisを使用できる

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

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

参照

グローバルサーバ上のデータベースを利用する場合には、“アプリケーション開発ガイド(埋込みSQL編)グローバルサー

バ連携”を参照してください。

本書の構成

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

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

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

ション開発作業の流れを説明します。

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

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

よびトランザクションと排他制御について説明します。

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

埋込みSQLを利用したアプリケーションの作成方法を、言語別に説明します。C言語およびCOBOL言語のプログラ

ムにSQL文をコーディングする場合の規則、コーディング位置およびSQL文の実行結果の確認の方法について説明

します。

第4章 動的SQLを利用するアプリケーションの作成

アプリケーションの実行時に動的SQL文を実行する方法を説明しています。

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

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

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

埋込みSQLを利用したC言語またはCOBOL言語のアプリケーションを、コンパイルおよびリンクし、実行可能ファイル

を作成する方法について説明します。

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

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

法について説明します。

- i -

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

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

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

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

付録C 環境変数

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

付録D SQL文の使用範囲

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

付録E SQLのデータ型と対応するホスト変数のデータ型

SQLのデータ型と対応するホスト変数のデータ型について説明します。

本書の読み方

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

関連マニュアル

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

・ Sun日本語COBOL使用手引書

・ COBOL97使用手引書

・ NetCOBOL使用手引書

・ COBOL文法書

輸出管理規制について

本ドキュメントを輸出または第三者へ提供する場合は、お客様が居住する国および米国輸出管理関連法規等の規制を

ご確認のうえ、必要な手続きをおとりください。

出版年月および版数

平成26年 10月 第4版

平成26年 8月 第3版

平成25年 11月 第2版

平成25年 9月 初版

著作権

Copyright 2005-2014 FUJITSU LIMITED

- ii -

目 次

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

第2章 アプリケーションの設計.................................................................................................................................................... 62.1 セション................................................................................................................................................................................................ 62.2 コネクション.......................................................................................................................................................................................... 8

2.2.1 コネクションの接続方法............................................................................................................................................................... 82.2.2 複数コネクション......................................................................................................................................................................... 11

2.2.2.1 現コネクションとSQL文の実行............................................................................................................................................ 112.2.2.2 現コネクションの変更.......................................................................................................................................................... 12

2.2.3 コネクションを意識しないデータ操作の方法............................................................................................................................ 142.3 文字コード系の考慮..........................................................................................................................................................................15

2.3.1 文字コード系の決定...................................................................................................................................................................152.3.2 コード変換の考慮.......................................................................................................................................................................182.3.3 ホスト言語を混在する場合の注意事項.....................................................................................................................................24

2.4 リモートアクセスする場合の注意事項.............................................................................................................................................. 252.4.1 アプリケーションをUNICODE環境で起動した時の注意事項.................................................................................................. 25

2.5 通信データを暗号化する場合の設定..............................................................................................................................................252.6 マルチスレッド環境におけるデータ操作..........................................................................................................................................252.7 名前の一意性と有効範囲.................................................................................................................................................................30

2.7.1 埋込みCプログラムの場合......................................................................................................................................................... 312.7.2 埋込みCOBOLプログラムの場合.............................................................................................................................................. 33

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

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

3.1.1 アプリケーションのコーディング規則......................................................................................................................................... 443.1.2 SQL文の指定位置および指定順序.......................................................................................................................................... 443.1.3 ホスト変数および標識変数の指定方法.................................................................................................................................... 473.1.4 SQL文の処理結果の確認......................................................................................................................................................... 513.1.5 日本語文字使用時の注意事項.................................................................................................................................................533.1.6 可変長文字列のデータ操作......................................................................................................................................................553.1.7 日本語可変長文字列のデータ操作..........................................................................................................................................553.1.8 ポインタ変数として宣言したホスト変数の使用方法..................................................................................................................553.1.9 構造体として宣言したホスト変数の使用方法........................................................................................................................... 593.1.10 BLOB型のコンパイル時の展開方法.......................................................................................................................................653.1.11 DECIMAL型またはNUMERIC型として宣言したホスト変数のコンパイル時の展開方法.................................................... 663.1.12 拡張SQL文識別子を使用した動的SQL文の実行方法......................................................................................................... 683.1.13 拡張カーソル名を使用したカーソル操作............................................................................................................................... 70

3.2 SQL埋込みCOBOLプログラムの作成方法......................................................................................................................................723.2.1 アプリケーションのコーディング規則......................................................................................................................................... 723.2.2 SQL文の指定位置および指定順序.......................................................................................................................................... 733.2.3 ホスト変数および標識変数の指定方法.................................................................................................................................... 763.2.4 SQL文の処理結果の確認......................................................................................................................................................... 773.2.5 可変長文字列のデータ操作......................................................................................................................................................793.2.6 BLOB型のコンパイル時の展開方法.........................................................................................................................................803.2.7 集団項目ホスト変数の記述方法............................................................................................................................................... 803.2.8 COBOLプログラム作成時の注意事項...................................................................................................................................... 833.2.9 クラス定義を使用する場合の注意事項.....................................................................................................................................833.2.10 UNICODEを使用する場合のエンディアンの選択................................................................................................................. 843.2.11 UNICODEを使用する場合のコード系の選択........................................................................................................................ 86

- iii -

3.2.12 拡張SQL文識別子を使用した動的SQL文の実行方法......................................................................................................... 873.2.13 拡張カーソル名を使用したカーソル操作............................................................................................................................... 88

3.3 行識別子の使用時の注意事項........................................................................................................................................................903.4 ロール使用時の記述方法.................................................................................................................................................................913.5 一時表の使用方法............................................................................................................................................................................92

第4章 動的SQLを利用するアプリケーションの作成...................................................................................................................944.1 動的SQLの概念................................................................................................................................................................................ 944.2 SQL文を動的に変更して実行する...................................................................................................................................................97

4.2.1 SQL文の準備とSQLDA構造体の操作..................................................................................................................................... 974.2.1.1 動的SELECT文を準備して実行する(SQLDA構造体の場合)........................................................................................1034.2.1.2 動的単一行SELECT文を準備して実行する(SQLDA構造体の場合)............................................................................106

4.2.2 SQL文の準備とSQL記述子域の操作.....................................................................................................................................1074.2.2.1 動的SELECT文を準備して実行する(SQL記述子域の場合)......................................................................................... 1134.2.2.2 動的単一行SELECT文を準備して実行する(SQL記述子域の場合)............................................................................. 117

4.3 SQL文の条件を動的に変更して実行する..................................................................................................................................... 1184.3.1 SQLDA構造体の操作方法..................................................................................................................................................... 118

4.3.1.1 動的SELECT文を準備して実行する(SQLDA構造体の場合)........................................................................................1204.3.1.2 動的単一行SELECT文を準備して実行する(SQLDA構造体の場合)............................................................................125

4.3.2 SQL記述子域の操作方法....................................................................................................................................................... 1264.3.2.1 動的SELECT文を準備して実行する(SQL記述子域の場合)......................................................................................... 1294.3.2.2 動的単一行SELECT文を準備して実行する(SQL記述子域の場合)............................................................................. 135

4.3.3 その他の被準備文を実行する.................................................................................................................................................1364.3.4 変数の属性がわかっている被準備文を実行する...................................................................................................................138

4.4 SQL文を即時実行する................................................................................................................................................................... 1424.5 データベース名および省略したスキーマ名を変更する................................................................................................................ 142

4.5.1 データベース名の変更............................................................................................................................................................ 1434.5.2 スキーマ名の変更.................................................................................................................................................................... 143

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

5.1.1 プロシジャルーチンを利用するアプリケーションの作成の流れ............................................................................................. 1445.1.2 プロシジャルーチンの実行...................................................................................................................................................... 1445.1.3 プロシジャルーチンの処理結果.............................................................................................................................................. 1475.1.4 プロシジャルーチン利用時のトランザクション......................................................................................................................... 149

5.2 ファンクションルーチンを利用する場合......................................................................................................................................... 1505.2.1 ファンクションルーチンを利用するアプリケーションの作成の流れ........................................................................................ 1505.2.2 ライブラリの作成....................................................................................................................................................................... 150

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

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

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

6.1.1 アプリケーションのコンパイル・リンクの流れ............................................................................................................................1716.1.2 コンパイル・リンクのための環境設定....................................................................................................................................... 1716.1.3 コンパイル・リンクの方法.......................................................................................................................................................... 1776.1.4 複数のコンパイル単位から構成されるアプリケーションのコンパイル・リンクの方法............................................................. 184

6.1.4.1 静的リンクする場合のコンパイル・リンク........................................................................................................................... 1846.1.4.2 動的リンクする場合のコンパイル・リンク........................................................................................................................... 1876.1.4.3 動的プログラム構造のコンパイル・リンク.......................................................................................................................... 191

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

6.2.1 アプリケーションのコンパイル・リンクの流れ............................................................................................................................1926.2.2 コンパイル・リンクのための環境設定....................................................................................................................................... 193

- iv -

6.2.3 コンパイル・リンクの方法.......................................................................................................................................................... 1976.2.4 複数のコンパイル単位から構成されるアプリケーションのコンパイル・リンクの方法............................................................. 202

6.2.4.1 静的リンクする場合のコンパイル・リンク........................................................................................................................... 2026.2.4.2 動的リンクする場合のコンパイル・リンク........................................................................................................................... 2056.2.4.3 動的プログラム構造のコンパイル・リンク.......................................................................................................................... 207

6.2.5 コンパイル時のコネクション先の指定...................................................................................................................................... 209

第7章 アプリケーションの実行................................................................................................................................................ 2107.1 アプリケーションの実行...................................................................................................................................................................210

7.1.1 SERVER_SPECの指定............................................................................................................................................................2117.1.2 アプリケーションの起動(UNIX系の場合)............................................................................................................................... 2117.1.3 アプリケーションの起動(Windows(R)の場合).........................................................................................................................214

7.2 アプリケーションのデバッグ.............................................................................................................................................................2187.2.1 状態変数およびメッセージ変数の利用方法...........................................................................................................................2197.2.2 SQL_SNAP機能の利用方法...................................................................................................................................................2197.2.3 ROUTINE_SNAP機能の利用方法.........................................................................................................................................223

7.3 適化情報の更新..........................................................................................................................................................................2267.4 アプリケーションのチューニング..................................................................................................................................................... 232

7.4.1 クライアント用の動作環境ファイルによる定義.........................................................................................................................2327.4.2 データ操作範囲の限定方法....................................................................................................................................................273

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

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

付録C 環境変数.................................................................................................................................................................... 320

付録D SQL文の使用範囲......................................................................................................................................................337

付録E SQLのデータ型と対応するホスト変数のデータ型......................................................................................................... 343

索引...................................................................................................................................................................................... 347

- v -

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

本章では、埋込みSQLを利用したアプリケーション開発の概要について説明します。

1.1 埋込みSQLの概要

Symfoware/RDBのデータベースの基本的な利用形態として、埋込みSQLを利用したC言語またはCOBOL言語のアプリ

ケーションからの利用があります。

業務処理を行うアプリケーションを、プロシジャを利用してサーバで実行させたり、パソコン上でSymfoware Server クライ

アント機能のデータベースアクセス機能(Esql)を利用して実行したりすることができます。

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

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

1.2 クライアント・サーバモデルの概要

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

・ クライアントとは

・ サーバとは

・ 通信方法

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

クライアントとは

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

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

サーバとは

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

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

通信方法

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

ローカルアクセス

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

リモートアクセス

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

- 1 -

通信方法の選択

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

あります。

- 性能を重視したRDB2_TCP連携

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

- 通信データのセキュリティを重視したRDB2_TCPS連携

Symfoware/RDB SSL通信専用のプロトコルを使用します。通信データを暗号化する場合の通信方法です。

データベース簡単運用では、通信データの暗号化はできません。

リモートアクセスする場合の通信方法は、クライアント用の動作環境ファイルのSERVER_SPECで指定します。通信方

法とSERVER_SPECの指定および接続できるサーバの種類と接続方法について以下に示します。

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

通信方法SERVER_SPECの

指定

性能を重視したRDB2_TCP連携 RDB2_TCP

通信データのセキュリティを重視した

RDB2_TCPS連携RDB2_TCPS

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

SERVER_SPEC

接続形態Windows(

R)Solaris Linux

グローバル

サーバ

RDB2_TCP

TCP/IP ○ ○ ○ ○

RDB2_TCPS

TCP/IP(SSL)

○ ○ ○ ×

○ : 接続可能

× : 接続不可能

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

Symfoware/RDBは、Solaris、Linux、Windows(R)および日本語MS-DOS上のアプリケーションをクライアントとし、Solaris、Linux、Windows Server(R) 2003、Windows Server(R) 2008、Windows Server(R) 2008 R2、Windows Server(R) 2012、Windows Server(R) 2012 R2またはグローバルサーバをサーバとして使用することができます。ローカルのデータベース

とリモートのデータベースを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埋込みホストプログラムをコンパイルするためには、利用者依存のコンパイル環境を作成し、この上でコンパイル処

理を行います。

コンパイル環境と、コンパイルおよびリンクの方法については、“6.1 UNIX系を使用した場合のアプリケーションのコンパ

イル・リンク”および“6.2 Windows(R)を使用した場合のアプリケーションのコンパイル・リンク”で説明します。

アプリケーションの実行

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

認します。

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

る必要があります。

- 4 -

参照

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

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

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

“7.2 アプリケーションのデバッグ”で説明します。

- 5 -

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

本章では、埋込みSQLを利用したアプリケーションの設計時に考慮すべき点を説明します。本章は、アプリケーションの

設計をする場合にお読みください。

2.1 セション

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

セションの作成

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

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

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

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

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

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

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

プリケーションの終了がセションの終了となります。

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

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

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

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

の実行がセションの終了となります。

複数セション

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

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

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

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

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

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

マルチスレッド環境で動作するアプリケーションを開発する方法については、“2.6 マルチスレッド環境におけるデー

タ操作”を参照してください。

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

1つのセションで複数のコネクションを利用する場合、1つのトランザクションで、複数のコネクションに対してデータベー

スを更新するSQL文は実行できません。複数のコネクションで、それぞれ更新を並行して実施する場合は、複数のセ

ションを作成することで実現できます。

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

ロール、省略時のスキーマ名、利用者、トランザクションモードなどの値は、セション単位に変更できます。1つのアプ

リケーションで、これらの変更可能な値が異なる環境を複数利用したい場合は、セションを複数作成し、それぞれの

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

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

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

- 6 -

・ SQLThrAllocID関数

・ SQLThrStartID関数

・ SQLThrEndID関数

・ SQLThrFreeID関数

参照

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

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

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

ります。

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

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

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

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

セション操作の例

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

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

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);

- 7 -

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.2 コネクション

コネクションの接続方法、1つのセションで複数のコネクションを接続する場合の操作およびコネクションを意識しないデー

タ操作の方法について説明します。

2.2.1 コネクションの接続方法

CONNECT文でサーバとコネクションを接続する場合、以下のいずれかの方法で行います。

・ ローカルアクセスの場合

- “データベース名”を指定したCONNECT文を実行する

- “DEFAULT”を指定したCONNECT文を実行する

・ リモートアクセスの場合

- “SQLサーバ名”を指定したCONNECT文を実行する

- “DEFAULT”を指定したCONNECT文を実行する

リモートアクセスの場合は、アプリケーションとSymfoware/RDBはポート番号を定義することによって接続されます。従っ

て、サーバの情報を動作環境ファイルの“SERVER_SPEC”に定義しておく必要があります。また、接続先のサーバのOSファイル(UNIX系の場合は/etc/servicesファイル、Windows Server(R) 2003、Windows Server(R) 2008、Windows Server(R)2008 R2、Windows Server(R) 2012またはWindows Server(R) 2012 R2の場合は、C:\WINDOWS\system32\drivers\etc\servicesファイル)にサービス名とポート番号が定義されている必要があります。

参考

クライアントからリモートアクセスする場合は、システム用の動作環境ファイルの“MAX_CONNECT_TCP”に、1以上の値

を指定してください。データベース簡単運用の場合は、Symfoware Serverのインストール時に 適な値が設定されるの

で考慮は不要です。

- 8 -

サービス名とポート番号の指定について

サービス名とポート番号は、以下のように指定します。

指定形式

サービス名 ポート番号/プロトコル

サービス名

サービス名は、RDBシステム名を指定します。ただし、RDBシステム名を付けない運用の場合は、RDBIIを指定

します。

ポート番号

ポート番号は、以下の範囲で、未使用の値を指定してください。

- Windows Server(R) 2003の場合:5001~49151

- Windows Server(R) 2008、Windows Server(R) 2008 R2、Windows Server(R) 2012またはWindows Server(R)2012 R2の場合:1024~49151

- Solaris/Linuxの場合:1024~32767

プロトコル

プロトコルは、tcpを指定します。

定義例

Symfoware/RDBのシステムごとにポート番号を定義する例を、以下に示します。

rdbsys1 26551/tcp

rdbsys2 26552/tcp

ローカルアクセスの場合

“データベース名”を指定したCONNECT文を実行する

データベース名を指定してCONNECT文を実行すると、ローカルのサーバとコネクションが接続されます。

“DEFAULT”を指定したCONNECT文を実行する

DEFAULTを指定してCONNECT文を実行する場合は、以下の方法でサーバとコネクションを接続します。

1. 動作環境ファイルの“DEFAULT_CONNECTION”に、データベース名を指定します。

2. DEFAULTを指定してCONNECT文を実行すると、動作環境ファイルの“DEFAULT_CONNECTION”を参照

します。ここで指定した名前と同じSQLサーバ名をもつSERVER_SPEC情報がなければ、この指定をデータベー

ス名とみなして、ローカルのサーバとコネクションが接続されます。

デフォルトコネクションの情報を利用してコネクションを接続する方法を以下に示します。

図2.1 デフォルトコネクションの情報を利用してコネクションを接続する方法

- 9 -

(1) CONNECT文に“DEFAULT”を指定して、アプリケーションを実行します。

(2) CONNECT文の実行時は、動作環境ファイルのDEFAULT_CONNECTIONの情報を参照します。さらに、

DEFAULT_CONNECTIONで指定されたデータベース“DB01”が存在するサーバとコネクションを接続します。

リモートアクセスの場合

サーバの情報を定義する

CONNECT文でサーバとコネクションを接続するには、まず、サーバの情報を、動作環境ファイルの“SERVER_SPEC”に定義します。“SERVER_SPEC”は、必要なコネクションに対してすべて定義します。定義する情報は、SQLサーバ

名、およびデータ資源名などです。

定義する情報の詳細は、“7.4.1 クライアント用の動作環境ファイルによる定義”を参照してください。

参考

通信データを暗号化する場合は、“SERVER_SPEC”で定義する通信方法に、“RDB2_TCPS”を指定します。

“SQLサーバ名”を指定したCONNECT文を実行する

SQLサーバ名、ユーザIDおよびパスワードを指定してCONNECT文を実行すると、動作環境ファイルに定義した

SERVER_SPECのうち、CONNECT文と同じSQLサーバ名をもつサーバの情報で、サーバとコネクションが接続され

ます。CONNECT文にSQLサーバ名を指定してコネクションを接続する方法を以下に示します。

図2.2 CONNECT文にSQLサーバ名を指定してコネクションを接続する方法

(1) CONNECT文にSQLサーバ名を指定して、アプリケーションを実行します。

(2) CONNECT文の実行時は、動作環境ファイルのSERVER_SPEC で、SQLサーバ名が“SV1”のものの情報でサー

バとコネクションを接続します。

“DEFAULT”を指定したCONNECT文を実行する

DEFAULTを指定してCONNECT文を実行する場合は、以下の方法でサーバとコネクションを接続します。

1. デフォルトコネクションの情報を、動作環境ファイルのDEFAULT_CONNECTIONに定義します。定義情報は、

SQLサーバ名、ユーザID、パスワードです。

定義情報の詳細は、“7.4.1 クライアント用の動作環境ファイルによる定義”を参照してください。

2. DEFAULTを指定してCONNECT文を実行すると、動作環境ファイルの“DEFAULT_CONNECTION”を参照

します。ここで指定した名前と同じSQLサーバ名をもつSERVER_SPECの情報を参照して、サーバとコネクショ

ンが接続されます。

デフォルトコネクションの情報を利用してコネクションを接続する方法を以下に示します。

- 10 -

図2.3 デフォルトコネクションの情報を利用してコネクションを接続する方法

(1) CONNECT文に“DEFAULT”を指定して、アプリケーションを実行します。

(2) CONNECT文の実行時は、動作環境ファイルのDEFAULT_CONNECTIONの情報を参照します。

(3) さらに、DEFAULT_CONNECTIONのSQLサーバ名“SV1”から、SQLサーバ名が“SV1”のSERVER_SPEC情報

を参照して、サーバとコネクションを接続します。

注意

動作環境ファイルのDEFAULT_CONNECTIONパラメタを使用している場合、データベースサーバに接続するユーザの

パスワードが誰にでも参照できてしまいます。そのため、通信データを暗号化する場合は、DEFAULT_CONNECTIONパラメタを使用せず、SQLサーバ名を使用したCONNECT文による接続を推奨します。

2.2.2 複数コネクション

アプリケーションの1つのセションで、複数のCONNECT文を実行することによって、複数のコネクションを接続することが

できます。この場合、SQL文の実行対象となるコネクションを決めておく必要があります。SQL文の実行対象となるコネク

ションを現コネクションと呼びます。ここでは、現コネクションの操作について、以下の順に説明します。

・ 現コネクションとSQL文の実行

・ 現コネクションの変更

2.2.2.1 現コネクションとSQL文の実行

複数のCONNECT文を実行した場合、 後のCONNECT文で接続したコネクションが、現コネクションとなります。

複数コネクションのプログラミング概要を以下に示します。

[アプリケーション]

EXEC SQL CONNECT TO 'DB01' AS 'C1' ; … (1)

EXEC SQL CONNECT TO 'DB02' AS 'C2' ; … (2)

EXEC SQL SELECT 在庫数量,倉庫番号 INTO :H1, :H2 FROM S.T … (3)

WHERE 倉庫番号=2 ;

EXEC SQL CONNECT TO 'SV3' AS 'C3' USER 'U3/PASS3'; … (4)

- 11 -

EXEC SQL CONNECT TO 'SV4' AS 'C4' USER 'U4/PASS4'; … (5)

EXEC SQL SELECT 在庫数量,倉庫番号 INTO :H1, :H2 FROM S1.T1 … (6)

WHERE 倉庫番号=2 ;

(1)~(3)は、ローカルアクセスの場合です。(4)~(6)は、リモートアクセスの場合です。

(1) 1回目のCONNECT文により、“DB01”に対して“C1”のコネクションを接続します。

(2) 2回目のCONNECT文により、“DB02”に対して“C2”のコネクションを接続します。

(3) 現コネクションの“DB02”に対して単一行SELECT文を実行します。

(4) 3回目のCONNECT文により、サーバ“SV3”に対して“C3”のコネクションを接続します。

(5) 4回目のCONNECT文により、サーバ“SV4”に対して“C4”のコネクションを接続します。

(6) 現コネクションのサーバ“SV4”に対して単一行SELECT文を実行します。

2.2.2.2 現コネクションの変更

複数のコネクションを接続した場合、SET CONNECTION文で現コネクションを変更することができます。SETCONNECTION文を利用することにより、変更した現コネクションのサーバとデータ操作を行うことができます。

現コネクションを変更する際に、トランザクションを終了する必要はありません。しかし、同一のトランザクションで、複数の

コネクションに対してデータベースを更新するSQL文を実行することはできません。その際にはトランザクションを一度終

了してください。

現コネクションを変更するプログラミングの概要を以下に示します。

[アプリケーション]

EXEC SQL CONNECT TO 'DB01' AS 'C1' ; … (1)

EXEC SQL SELECT 在庫数量,倉庫番号 INTO :H1, :H2 FROM 在庫表 … (2)

WHERE 在庫数量=300 ;

EXEC SQL COMMIT WORK ; … (3)

EXEC SQL CONNECT TO 'DB02' AS 'C2' ; … (4)

EXEC SQL INSERT INTO 伝票( 在庫カラム, 倉庫カラム) VALUES(:H1,:H2) ; … (5)

EXEC SQL COMMIT WORK ; … (6)

EXEC SQL SET CONNECTION 'C1' ; … (7)

EXEC SQL SELECT 出荷量 INTO :H3 FROM 在庫表2 WHERE XX=100 ; … (8)

EXEC SQL COMMIT WORK ; … (9)

EXEC SQL CONNECT TO 'SV3' AS 'C3' USER 'U3/PASS3' ; … (10)

EXEC SQL SELECT 在庫数量,倉庫番号 INTO :H1, :H2 FROM 在庫表1 … (11)

WHERE 倉庫番号=2 ;

EXEC SQL COMMIT WORK ; … (12)

EXEC SQL CONNECT TO 'SV4' AS 'C4' USER 'U4/PASS4' ; … (13)

EXEC SQL INSERT INTO 伝票1(在庫カラム, 倉庫カラム) VALUES(:H1,:H2) ; … (14)

EXEC SQL COMMIT WORK ; … (15)

- 12 -

EXEC SQL SET CONNECTION 'C3' ; … (16)

EXEC SQL SELECT 出荷量 INTO :H3 FROM 在庫表3 WHERE XX=100 ; … (17)

(1)~(9)は、ローカルアクセスの場合です。(10)~(17)は、リモートアクセスの場合です。

(1) 1回目のCONNECT文により、“DB01”に対して“C1”のコネクションを接続します。

(2) “DB01”の在庫表から単一行SELECT文で在庫数量と倉庫番号を取り出します。

(3) (2)の操作に対して、トランザクションを終了します。

(4) 2回目のCONNECT文により、“DB02”に対して“C2”のコネクションを接続します。

(5) “DB02”の伝票の在庫カラムと倉庫カラムに、“DB01”から取り出した在庫数量と倉庫番号を追加します。

(6) (5)の操作に対して、トランザクションを終了します。

(7) SET CONNECTION文により、現コネクションを“C1”に変更します。

(8) “DB01”の在庫表2から単一行SELECT文で出荷量を取り出します。

(9) (8)の操作に対して、トランザクションを終了します。

(10) 3回目のCONNECT文により、サーバ“SV3”に対して“C3”のコネクションを接続します。

(11) サーバ“SV3”の在庫表1から、単一行SELECT文で在庫数量と倉庫番号を取り出します。

(12) (11)の操作に対して、トランザクションを終了します。

(13) 4回目のCONNECT文により、サーバ“SV4”に対して“C4”のコネクションを接続します。

(14) サーバ“SV4”の伝票1の在庫カラムと倉庫カラムに、サーバ“SV3”から取り出した在庫数量と倉庫番号を追加しま

す。

(15) (14)の操作に対して、トランザクションを終了します。

(16) SET CONNECTION文により、現コネクションを“C3”に変更します。

(17) サーバ“SV3”の在庫表3から単一行SELECT文で出荷量を取り出します。

トランザクションを終了させずに現コネクションを変更するプログラミングの概要を以下に示します。

[アプリケーション]

EXEC SQL DECLARE CUR1 CURSOR FOR SELECT 在庫数量,倉庫番号 FROM 在庫表 ;

EXEC SQL CONNECT TO 'DB01' AS 'C1' ;

EXEC SQL OPEN CUR1 ;

EXEC SQL FETCH CUR1 INTO :H1,:H2 ;

EXEC SQL CONNECT TO 'DB02' AS 'C2' ;

EXEC SQL INSERT INTO 伝票(在庫カラム, 倉庫カラム) VALUES(:H1,:H2) ;

EXEC SQL SET CONNECTION 'C1' ;

EXEC SQL FETCH CUR1 INTO :H1,:H2 ;

EXEC SQL SET CONNECTION 'C2' ;

EXEC SQL INSERT INTO 伝票(在庫カラム, 倉庫カラム) VALUES(:H1,:H2) ;

- 13 -

2.2.3 コネクションを意識しないデータ操作の方法

ローカルアクセスの場合、コネクション操作を意識しなくてもデータ操作を行うことができます。この場合、あらかじめ接続

先を指定しておくことによって、アプリケーションの実行時にサーバに接続し、アプリケーションの終了時にコネクションが

切断されます。

コネクションを意識しないデータ操作を行う場合の接続先の指定には、以下の方法があります。

・ コンパイル時に指定する

・ DEFAULT_CONNECTIONに指定する

コンパイル時に指定する

アプリケーションのコンパイル時に、データベース名を指定することによって、アプリケーション中にCONNECT文を記述

しなくてもデータ操作を行うことができます。以下に例を示します。

コンパイルコマンドの詳細については、“6.1.5 コンパイル時のコネクション先の指定”を参照してください。

コンパイルコマンドの詳細については、“6.2.5 コンパイル時のコネクション先の指定”を参照してください。

コンパイル時に接続するデータベース名を指定した例

(1) コンパイル時にデータベース名“DB01”を指定します。

(2) アプリケーション中に、CONNECT文は一切記述されていません。

(3) アプリケーション実行時に、コンパイル時に指定した“DB01”に接続されます。

DEFAULT_CONNECTIONに指定する

動作環境ファイルのDEFAULT_CONNECTIONにデータベース名を指定することによって、アプリケーション中に

CONNECT文を記述しなくてもデータ操作を行うことができます。以下に例を示します。

- 14 -

DEFAULT_CONNECTIONにデータベース名を指定した例

(1) コンパイル時にはデータベース名を指定しません。

(2) クライアント用の動作環境ファイルのDEFAULT_CONNECTIONに“DB01”を指定します。

(3) アプリケーション中に、CONNECT文は一切記述されていません。

(4) アプリケーション実行時に、クライアント用の動作環境ファイルで指定した“DB01”に接続されます。

2.3 文字コード系の考慮

アプリケーション開発を行う場合に、文字コード系に関して考慮しなければならない点を説明します。

2.3.1 文字コード系の決定

C言語およびCOBOL言語のアプリケーションで使用する文字コード系について説明します。

アプリケーションで使用可能な文字コード系

C言語およびCOBOL言語のアプリケーションでは、以下の文字コード系が使用できます。

・ EUCコード

・ シフトJISコード

・ UNICODE

使用する文字コード系はアプリケーションのロケールで指定します。アプリケーションのロケールは、以下のように指定し

ます。

表2.1 アプリケーションのロケールの指定

対象OS ロケールの指定

SolarisLinux

環境変数LANGでロケールを指定します。

Windows(R) OSのロケールに従います。

- 15 -

UNIX系システムでは環境変数LANGに、Cロケールを指定することも可能です。Symfoware/RDBは、ロケールの言語が

jaで始まる場合は日本語のメッセージを出力し、それ以外のロケール(Cロケールなど)の場合は英語でメッセージを出力

します。Cロケールの場合、アプリケーションが動作する環境によって、アプリケーションの文字コード系は以下のようにな

ります。

アプリケーションが動作する環境 アプリケーションの文字コード系

Symfoware/RDBと同一サーバのアプリ

ケーション

Symfoware/RDBインストール時に指定

するデータベースの文字コード系

Connection Managerを利用するアプリ

ケーション

Connection Managerインストール時に

指定するアプリケーションの文字コード

クライアント端末のアプリケーション Symfoware Server クライアント機能イン

ストール時に指定するアプリケーション

の文字コード系

SQL文の文字コード系

SQL文中に直接埋込んだ文字列は、アプリケーションのロケールで指定された文字コードで認識されます。アプリケー

ションのロケールとは異なる文字コードの文字列は、指定できません。

ホスト変数の文字コード系

アプリケーションで使用するホスト変数、動的パラメタ、およびSQLMSGの文字コード系について説明します。

C言語のアプリケーションで使用するホスト変数の文字コード系

アプリケーションで使用するホスト変数、動的パラメタ、およびSQLMSGの文字コード系は、環境変数LANGの値に

よって決定します。これを変更するには、クライアント用の動作環境ファイルのパラメタCHAR_SETおよびNCHAR_CODEで指定します。

文字列型ホスト変数の文字コード系は、パラメタCHAR_SETに指定します。指定する値を以下に示します。

表2.2 文字列型ホスト変数の文字コード系

文字コード系 CHAR_SETの指定値

EUCコー

S90コード EUC_S90

U90コー

EUC_U90またはEUC

シフトJISコード SJIS

UNICODE

UTF-8形式

UTF8

各国語文字列型ホスト変数の文字コード系は、パラメタNCHAR_CODEに指定します。指定する値を以下に示しま

す。

表2.3 各国語文字列型ホスト変数の文字コード系

文字コード系 NCHAR_CODEの指定値

EUCコード

S90コード EUC_S90

U90コード EUC_U90またはEUC

S90コード

(COBOL_EUC形式)COBOL_EUC_S90

U90コード

(COBOL_EUC形式)COBOL_EUC_U90または

COBOL_EUC

シフトJISコード SJIS

UNICODE UTF-8形式 UTF8

- 16 -

文字コード系 NCHAR_CODEの指定値

UCS-2形式(注) UCS2

バイトスワップした

UCS-2形式(注)UCS2B

注) UCS-2形式およびバイトスワップしたUCS-2形式では、補助文字(1~16面の4バイト文字)は2文字となります。

クライアント用の動作環境ファイルに文字コード系が指定されていない場合は、環境変数LANGの値によってデフォ

ルトの文字コード系が決まります。環境変数LANGと使用される文字コード系の関係を以下に示します。

表2.4 デフォルトの文字コード系

環境変数LANGの値 文字列型ホスト変数

の格納形式

各国語文字列型ホ

スト変数の格納形

jaEUCコード

ja_JP.eucJP

ja_JP.PCK シフトJISコード

ja_JP.UTF-8 UTF-8形式

COBOL言語のアプリケーションで使用するホスト変数の文字コード系

アプリケーションで使用するホスト変数、動的パラメタ、およびSQLMSGでは以下の文字コード系が使用できます。

文字列型ホスト変数および各国語文字列型のホスト変数の文字コード系は、環境変数LANGの値によって決まりま

す。環境変数LANGとコード系の関係を以下に示します。

表2.5 COBOL言語のアプリケーションの文字コード系

環境変数LANGの値 文字列型ホスト

変数の格納形

各国語文字列型ホスト変数の格納

形式

jaEUCコード COBOL_EUC形式

ja_JP.eucJP

ja_JP.PCK シフトJISコード

ja_JP.UTF-8 UTF-8形式

Solaris UCS-2形式(注1)

Linux バイトス

ワップした

UCS-2形式(注1)(注2)

注1) UCS-2形式およびバイトスワップしたUCS-2形式では、補助文字(1~16面の4バイト文字)は2文字となります。

注2) コンパイル時のオプションの指定により、ビッグエンディアンとリトルエンディアンのいずれかの形式を選択するこ

とができます。

アプリケーションで使用するホスト変数、動的パラメタ、およびSQLMSGでは、シフトJISコードまたはUNICODEが使

用できます。UNICODEを使用する場合、アプリケーションのコンパイル時にオプションで指定します。

文字コード系とホスト変数の格納形式の関係を以下に示します。

- 17 -

表2.6 COBOL言語のアプリケーションの文字コード系とホスト変数の格納形式

文字コード系 文字列型ホスト変数の

格納形式

各国語文字列型ホスト変数の

格納形式

シフトJISコード シフトJISコード

UNICODE UTF-8形式 バイトスワップしたUCS-2形式

(注1)(注2)

バイトスワップしたUTF-32形式(注2)

UTF-32形式(注2)

注1) バイトスワップしたUCS-2形式では、補助文字(1~16面の4バイト文字)は2文字となります。

注2) コンパイル時のオプションの指定により、UCS-2とUTF-32のいずれかの形式を選択することができます。

注意

COBOL言語のアプリケーションの場合は、クライアント用の動作環境ファイルに指定されたパラメタCHAR_SETおよび

NCHAR_CODEは無視されます。

2.3.2 コード変換の考慮

アプリケーションが使用する文字コード系と、データベースに格納されるデータの文字コード系が異なる場合、Symfoware/RDBは自動的にコード変換を行います。

コード変換について以下の順に説明します。

・ コード変換の発生条件

・ コード変換と文字列長

・ コード変換指定に従わないもの

コード変換の発生条件

アプリケーションが扱うデータとデータベースに格納されるデータの文字コード系が異なる場合、Symfoware/RDBは双方

向でコード変換を行って文字コード系を調整します。

データベースに格納されるデータを抽出する際、アプリケーションの文字コード系に存在しない文字コードは、アンダー

スコア“_”に変換されます。逆に、アプリケーションからデータベースに格納する際、データベースの文字コード系に存在

しない文字コードが含まれると、コード変換エラーとなります。

C言語の場合のコード変換

クライアント用の動作環境ファイルのパラメタCHAR_SETおよびNCHAR_CODEに指定された文字コード系と、デー

タベースの文字コード系の間のコード変換の有無を以下に示します。

表2.7 アプリケーションのコード変換(文字列型)

CHAR_SETの指定

データベースの文字コード系

EUCコー

ドのS90コード

EUCコー

ドのU90コード

シフトJISコード

UNICODE

EUC_S90 ◎ × ○(注1) ○(注2)

EUC_U90× ◎ ○(注1) ○(注2)

EUC

SJIS ○(注1) ○(注1) ◎ ○(注2)

UTF-8 ○(注2) ○(注2) ○(注2) ◎

- 18 -

◎:コード変換を行わず処理

○:コード変換を行って処理

×:エラー(文字コード系を指定することはできません)

注1) JIS X 0213:2004(通称JIS2004)の範囲でコード変換を行う

注2) JIS X 0208-1990の範囲でコード変換を行う

表2.8 アプリケーションのコード変換(各国語文字列型)

NCHAR_CODEの指定

データベースの文字コード系

EUCコー

ドのS90コード

EUCコー

ドのU90コード

シフトJISコード

UNICODE

EUC_S90

◎ × ○(注1) ○(注2)COBOL_EUC_S90

EUC_U90

× ◎ ○(注1) ○(注2)

EUC

COBOL_EUC_U90

COBOL_EUC

SJIS ○(注1) ○(注1) ◎ ○(注2)

UTF-8

○(注2) ○(注2) ○(注2)

○(注3)

UCS2 ◎

UCS2B ◎

◎:コード変換を行わず処理

○:コード変換を行って処理

×:エラー(文字コード系を指定することはできません)

注1) JIS X 0213:2004(通称JIS2004)の範囲でコード変換を行う

注2) JIS X 0208-1990の範囲でコード変換を行う

注3) UNICODE 4.1の範囲でコード変換を行う

COBOLの場合のコード変換

ホスト変数の文字コード系と、データベースの文字コード系の間のコード変換の有無を以下に示します。

表2.9 アプリケーションのコード変換(文字列型)

ホスト変数の文字コード

データベースの文字コード系

EUCコー

ドのS90コード

EUCコー

ドのU90コード

シフトJISコード

UNICODE

EUCコード ◎ × ○(注1) ○(注2)

シフトJISコード ○(注1) ○(注1) ◎ ○(注2)

UTF-8形式 ○(注2) ○(注2) ○(注2) ◎

- 19 -

表2.10 アプリケーションのコード変換(文字列型)

ホスト変数の文字

コード系

データベースの文字コード系

EUCコード シフトJISコード UNICODE

シフトJISコード ○(注1) ◎ ○(注2)

UTF-8形式 ○(注2) ○(注2) ◎

◎:コード変換を行わず処理

○:コード変換を行って処理

×:エラー(文字コード系を指定することはできません)

注1) JIS X 0213:2004(通称JIS2004)の範囲でコード変換を行う

注2) JIS X 0208-1990の範囲でコード変換を行う

表2.11 アプリケーションのコード変換(各国語文字列型)

ホスト変数の文字コード

データベースの文字コード系

EUCコードの

S90コー

EUCコード

のU90コー

シフトJISコード

UNICODE

EUCコード ◎ × ○(注1) ○(注2)

シフトJISコード ○(注1)

○(注1) ◎ ○(注2)

UCS-2形式○(注2)

○(注2) ○(注2) ◎バイトスワップした

UCS-2形式

表2.12 アプリケーションのコード変換(各国語文字列型)

ホスト変数の文字コード系

データベースの文字コード系

EUCコードシフトJISコード

UNICODE

シフトJISコード ○(注1) ◎ ○(注2)

UCS-2形式

○(注2) ○(注2)

バイトスワップしたUCS-2形式 ◎

UTF-32形式 ○(注3)

バイトスワップしたUTF-32形式 ○(注3)

◎:コード変換を行わず処理

○:コード変換を行って処理

×:エラー(文字コード系を指定することはできません)

注1) JIS X 0213:2004(通称JIS2004)の範囲でコード変換を行う

注2) JIS X 0208-1990の範囲でコード変換を行う

注3) UNICODE 4.1の範囲でコード変換を行う

- 20 -

コード変換と文字列長

データベースの文字コード系と、SQL埋込みホストプログラム内のホスト変数で使用する文字列の文字コード系が異なる

場合、データ操作でコード変換が発生します。それぞれの文字コード系によってはデータ長が増減することがあるため、

SQL埋込みホストプログラムを作成する場合に考慮が必要です。

ここでは、文字コード系と使用できる文字列長について説明します。

文字コード系における1文字のバイト数

SQL埋込みホストプログラム中のホスト変数内で使用できる文字列の文字コード系は、EUCコード、UTF-8形式または

シフトJISコードです。また、各国語文字列の文字コード系は、EUCコード、COBOL_EUC形式、UCS-2形式、バイトス

ワップしたUCS-2形式、UTF-32形式(Windows(R)のみ)、バイトスワップしたUTF-32形式(Windows(R)のみ)、UTF-8形式またはシフトJISコードです。

それぞれの文字コード系における、1文字のバイト数を以下に示します。

表2.13 1文字のバイト数

文字コード系 文字の種別 バイト数

EUCコード

英数字および制御文字 1バイト

拡張漢字および利用者定義文字 3バイト

その他の日本語文字 2バイト

UTF-8形式英数字および制御文字 1バイト

各国語文字 2~6バイト

シフトJISコード

英数字および制御文字 1バイト

半角カタカナ 1バイト

各国語文字 2バイト

また、それぞれのコード系における、各国語文字1文字のバイト数を以下に示します。

表2.14 1文字のバイト数(各国語文字の場合)

文字コード系 文字の種別 バイト数

EUCコード拡張漢字および利用者定義文字 3バイト

その他の日本語文字 2バイト

COBOL_EUC形式

日本語文字 2バイト

UCS-2形式 すべての文字2バイトまたは4バイト

(注)

バイトスワップした

UCS-2形式すべての文字

2バイトまたは4バイト

(注)

UTF-32形

式またはバイトス

ワップした

UTF-32形式

すべての文字 4バイト

UTF-8形式 日本語文字 2~6バイト

シフトJISコード 日本語文字 2バイト

注) UCS-2形式およびバイトスワップしたUCS-2形式では、補助文字(1~16面の4バイト文字)は2文字となります。

コード変換と文字列の拡大・縮小

データベースの文字コード系とSQL埋込みホストプログラム内で使用する文字列の文字コード系が異なる場合、デー

タに対してコード変換が発生します。このとき、同じ文字でも文字コード系によってバイト数が異なる場合があるため、

文字列が拡大・縮小することがあります。

- 21 -

文字コード系による文字列の拡大・縮小の割合を以下に示します。

表2.15 文字列の拡大・縮小

データベースの文

字コード系

アプリケーションの文

字コード系

入力データ 出力データ

最小値 最大値 最小値 最大値

EUCコード

EUCコード 1倍 1倍 1倍 1倍

シフトJISコード 1倍 2倍 1/2倍 1倍

UTF-8形式 1/3倍 3/2倍 2/3倍 3倍

UNICODE

EUCコード 2/3倍 3倍 1/3倍 3/2倍

シフトJISコード 1倍 3倍 1/3倍 1倍

UTF-8形式 1倍 1倍 1倍 1倍

シフトJISコード

EUCコード 1/2倍 1倍 1倍 2倍

シフトJISコード 1倍 1倍 1倍 1倍

UTF-8形式 1/3倍 1倍 1倍 3倍

また、文字コード系による各国語文字列の拡大・縮小の割合を以下に示します。

表2.16 各国語文字列の拡大・縮小

データベースの文

字コード系

アプリケーションの文

字コード系

入力データ 出力データ

最小値 最大値 最小値 最大値

EUCコード

EUCコード 2/3倍 1倍 1倍 3/2倍

シフトJISコード 1倍 1倍 1倍 1倍

UTF-8形式 1/3倍 1倍 1倍 3倍

COBOL_EUC形式 1倍 1倍 1倍 1倍

バイトスワップした

UCS-2形式1倍 1倍 1倍 1倍

UTF-32形式

またはバイトスワップ

したUTF-32形式

1/2倍 1倍 1倍 2倍

UNICODE

EUCコード 2/3倍 2倍 1/2倍 3/2倍

シフトJISコード 1倍 2倍 1/2倍 1倍

UTF-8形式 1/3倍 2倍 1/2倍 3倍

COBOL_EUC形式 1倍 1倍 1倍 1倍

バイトスワップした

UCS-2形式1倍 1倍 1倍 1倍

UTF-32形式

またはバイトスワップ

したUTF-32形式

1/2倍 1倍 1倍 2倍

シフトJISコード

EUCコード 2/3倍 1倍 1倍 3/2倍

シフトJISコード 1倍 1倍 1倍 1倍

UTF-8形式 1/3倍 1倍 1倍 3倍

COBOL_EUC形式 1倍 1倍 1倍 1倍

バイトスワップした

UCS-2形式1倍 1倍 1倍 1倍

- 22 -

データベースの文

字コード系

アプリケーションの文

字コード系

入力データ 出力データ

最小値 最大値 最小値 最大値

UTF-32形式

またはバイトスワップ

したUTF-32形式

1/2倍 1倍 1倍 2倍

文字コード系ごとの使用できる文字列長

コード変換によりデータ長が拡大・縮小した場合に、ホスト変数や列長の定量制限の32,000バイトを超えてしまう場合

があります。そこで、上記の拡大・縮小の割合を基に、コード変換に関係なく使用できる文字列のデータ長を以下に

示します。

表2.17 使用可能な文字列の最大長

データベースの文

字コード系

アプリケーションの文

字コード系使用可能なデータ長

EUCコード

EUCコード 32,000 バイト

シフトJISコード 16,000 バイト

UTF-8形式 10,666 バイト

シフトJISコード

EUCコード 16,000 バイト

シフトJISコード 32,000 バイト

UTF-8形式 10,666 バイト

UNICODE

EUCコード 10,666 バイト

シフトJISコード 10,666 バイト

UTF-8形式 32,000 バイト

また、コード変換に関係なく使用できる各国語文字列のデータ長を以下に示します。

表2.18 使用可能な各国語文字列の最大長

データベースの文

字コード系

アプリケーションの文

字コード系使用可能なデータ長

EUCコード

EUCコード 21,333 バイト

シフトJISコード 32,000 バイト

UTF-8形式 10,666 バイト

COBOL_EUC形式 32,000 バイト

バイトスワップした

UCS-2形式32,000 バイト

UTF-32形式ま

たはバイトスワップし

たUTF-32形式

16,000 バイト

シフトJISコード

EUCコード 21,333 バイト

シフトJISコード 32,000 バイト

UTF-8形式 10,666 バイト

COBOL_EUC形式 32,000 バイト

バイトスワップした

UCS-2形式32,000 バイト

- 23 -

データベースの文

字コード系

アプリケーションの文

字コード系使用可能なデータ長

UTF-32形式ま

たはバイトスワップし

たUTF-32形式

16,000 バイト

UNICODE

EUCコード 16,000 バイト

シフトJISコード 16,000 バイト

UTF-8形式 16,000 バイト

COBOL_EUC形式 32,000 バイト

UNICODE(バイトス

ワップしたUCS-2形式)

32,000 バイト

UTF-32形式ま

たはバイトスワップし

たUTF-32形式

16,000 バイト

注意

取り出すデータの有効な長さが32,000バイトを超える場合は、標識変数に0または32,000が格納されます。この場合

は、コード変換が発生しない環境で動作させてください。

コード変換指定に従わないもの

コード変換は、クライアント用の動作環境ファイルの実行パラメタ(CHARACTER_TRANSLATE)の指定により、クライア

ントまたはサーバのどちらかで行います。ただし、この変換指定に従わず、データベースの文字コード系に従って処理さ

れるものは、以下のとおりです。

・ ORDER BY句による整列順序

・ 述語の大小比較結果

・ 集合関数の 大または 小値

・ 補助文字の文字数

2.3.3 ホスト言語を混在する場合の注意事項

1つのアプリケーションプロセス内でSQL埋込みCプログラムとSQL埋込みCOBOLプログラムが混在する場合、プロセス

内で 初に実行されるSQL文がSQL埋込みCプログラムの場合は、文字列型ホスト変数の文字コード系と各国語文字列

型ホスト変数の文字コード系に注意が必要です。

SQL埋込みホストプログラムでは、アプリケーションプロセス内で 初にSQL文が実行される時にプロセスの文字コード系

が決定されます。また、各SQL文が実行されるたびに文字コード系のチェックを行っています。

プロセス内で 初にSQL文が実行されるのがSQL埋込みCプログラムの場合、“アプリケーションで使用可能な文字コー

ド系”の仕様にしたがって文字コード系が決定されます。その後SQL埋込みCOBOLプログラムが呼び出された場合、こ

の文字コード系がSQL埋込みCOBOLプログラムに設定される文字コード系と異なっていたら、SQL埋込みCOBOLプロ

グラムでSQL文を実行する際にエラーとなります。

文字コード系の指定

SQL埋込みCプログラムからSQL埋込みCOBOLプログラムを呼び出している場合は、クライアント用の動作環境ファイル

に文字コード系を指定し、SQL埋込みCOBOLプログラムのチェックでエラーが発生しないようにする必要があります。設

定する文字コード系は、“2.3.1 文字コード系の決定”を参照してください。

- 24 -

2.4 リモートアクセスする場合の注意事項

リモートのデータベースにアクセスする場合の注意事項について説明します。

2.4.1 アプリケーションをUNICODE環境で起動した時の注意事項

LinuxクライアントにおいてSQL埋込みホストプログラムを使用している場合で、かつアプリケーション起動時に環境変数

LANGにja_JP.UTF-8が指定されている環境では、以下の製品のデータベースに接続する場合、クライアントでのコード

変換を指定する必要があります。

クライアント用の動作環境ファイルに、パラメタCHARACTER_TRANSLATE=(CLIENT)を指定してください。

・ Symfoware Server Enterprise Extended Edition 6.0.1以前

・ Symfoware Server Enterprise Edition 6.0.1以前

・ Symfoware Server Standard Edition 6.0.1以前

・ Symfoware Server Standard Edition V5.0L10以前

・ Symfoware Server Enterprise Edition V6.0L10以前

・ Symfoware Server Standard Edition V6.0L10以前

・ Symfoware Server for Windows V6.0L10以前

2.5 通信データを暗号化する場合の設定

通信データの暗号化機能を使用してリモートアクセスを行う場合は、以下の設定を行ってください。

通信内容を暗号化してサーバに接続する設定

通信の暗号化は、システム用の動作環境ファイルのSSL_USEパラメタにONが指定されている場合にのみ使用でき

ます。クライアント側では、クライアント用の動作環境ファイルのSERVER_SPECパラメタにRDB2_TCPSを指定します。

サーバ認証を行う場合の設定

サーバのなりすましから守るために、サーバ認証を行う場合は、データベース管理者が配布するCA証明書ファイル

を格納し、格納先のパスをクライアント用の動作環境ファイルのSSL_CLI_CA_CERT_FILEパラメタに指定します。

また、クライアント用の動作環境ファイルのDEFAULT_CONNECTIONパラメタを使用している場合、データベースサー

バに接続するユーザのパスワードが誰にでも参照できてしまいます。そのため、サーバとの接続方法として、

DEFAULT_CONNECTIONパラメタを使用せず、SQLサーバ名を使用したCONNECT文による接続を推奨します。

注意

・ 通信内容を暗号化してサーバに接続する設定を行わずに、SSL_CLI_CA_CERT_FILEパラメタを指定した場合は、

エラーになります。

・ サーバとクライアントで暗号化の指定が矛盾している場合は、エラーになります。通信内容を暗号化してサーバに接

続する設定を行った場合は、システム用の動作環境ファイルのSSL_USEパラメタにONを指定してください。

・ データベース簡単運用では、通信データの暗号化はできません。

2.6 マルチスレッド環境におけるデータ操作

ここでは、マルチスレッド環境で動作するアプリケーションを開発する方法について説明します。

インターネット(アプリケーションサーバ)環境で動作するアプリケーションは、多くのクライアント端末からの依頼を受け、

繰り返し起動や多重動作できることが必要とされます。このような条件では、高速な起動や資源の節約が期待できるマル

チスレッド環境での動作が適しています。

- 25 -

マルチスレッド環境で動作するアプリケーションは共有のアドレス・スペースで複数のスレッドを使用します。スレッドは、

プロセス内で実行されるサブプロセスです。1つのスレッドに対して1つの業務を割り当てることができ、複数のスレッドを

使用して複数の業務を並列に実行できます。

初にSymfoware/RDBをアクセスした時から終了まで、すなわち 初のCONNECT文から 後のDISCONNECT文まで

をセションと呼びます。1つのプロセスで1つのセションを実行する場合は、 初のSQL文の実行時にSymfoware/RDBが自動的にセション環境を作成しています。しかし、マルチスレッド環境では、複数のセションを同時に実行するため、セ

ションを操作する関数を利用してセションの作成および破棄を行う必要があります。アプリケーション中で複数のセション

を操作するために、セションの識別情報としてセションIDを使用します。セションIDは、プロセス内で一意な情報です。

Symfoware/RDBでは、スレッドとセションを対応付け、SQL文の実行環境を複数作成することによって、マルチスレッド環

境下でアプリケーションを動作できます。

また、セションとスレッドの対応を一度切り離すことによって、無駄なスレッドを減らし、資源を有効に利用できます。

- 26 -

セションとスレッドの使用方法

マルチスレッド環境で動作するアプリケーションにおけるセションとスレッドの使用方法には、以下の3種類があります。省

資源化およびレスポンスの向上を図るためには、スレッド数がセション数より少ない環境でアプリケーションを実行するこ

とを推奨します。なお、作成するスレッドの数に制限はありません。

・ 単一セションに対して複数のスレッドが対応する場合

・ スレッド数がセション数以上の場合(スレッド数≧セション数)

・ スレッド数がセション数より少ない場合(スレッド数<セション数)

セションを操作する関数については、“2.1 セション”を参照してください。

単一セションに対して複数のスレッドが対応する場合

1つのセションに対して複数のスレッドを同時に使用することはできません。セマフォを利用して排他制御を行ってく

ださい。

- 27 -

(1) セション1を作成します。セションIDはses1とします。

(2) セション1と動作スレッドを対応づけます。

(3) CONNECT文を実行します。

(4) セション1と動作スレッドの対応を切り離します。

- 28 -

(5) セション1とスレッドT1を対応付け、SQL文を実行した後、セション1とスレッドT1の対応を切り離します。1つのセショ

ンにおいて、同時に複数のスレッドを実行することはできません。セマフォを利用するなど、排他処理を行ってくださ

い。

(6) セション1とスレッドT2を対応付けます。スレッドT1で使用されていたセションID(ses1)が、スレッドT2に渡されます。

同様にしてスレッドnまで動作します。

(7) セション1と動作スレッドを対応づけます。

(8) DISCONNECT文を実行します。

(9) セション1と動作スレッドの対応を切り離します。

(10) セション1を破棄します。

スレッド数がセション数以上の場合(スレッド数≧セション数)

この場合、各スレッドにセションが作成さているので、排他制御を考慮する必要はありません。ただし、複数スレッドが

共通でCPUを使用するため、必ずしもレスポンスを向上できるとは限りません。

(1) セション1~セションnを作成します。

(2) 各セションに対してスレッドT1~Tnを対応付け、SQL文を実行した後、対応を切り離します。この場合、各スレッド

に専用のセションがあるので、排他を考慮する必要はありません。

(3) セション1~セションnを破棄します。

スレッド数がセション数より少ない場合(スレッド数<セション数)

2つのスレッドを使用して3つのセションを実行する例を示します。セションとスレッドの対応を一度切り離すことにより、

セション数よりも少ないスレッド数で動作できます。このため、資源の共用による省資源化を実現できます。また、ディ

スクのI/OなどによるCPUの無駄な待ち状態を解消する操作を行うことによって、レスポンスを向上できます。

- 29 -

(1) セション1~セション3を作成します。

(2) セション1とスレッドT1およびセション2とスレッドT2をそれぞれ対応付け、SQL文を実行した後、対応を切り離しま

す。

(3) セション1とスレッドT1およびセション3とスレッドT2をそれぞれ対応付け、SQL文を実行した後、対応を切り離しま

す。

(4) セション1における作業が終了したので、今までセション1で使用していたスレッドT1をセション2で使用します。ま

た、セション3とスレッドT2を対応付けます。SQL文を実行した後、対応を切り離します。

(5) セション1~セション3を破棄します。

2.7 名前の一意性と有効範囲

ここでは、SQL埋込みCプログラムおよびSQL埋込みCOBOLプログラムに記述するSQL文中の名前の一意性と有効範

囲について説明します。

- 30 -

2.7.1 埋込みCプログラムの場合

ここでは、SQL埋込みCプログラムに記述するSQL文中の名前の一意性と有効範囲について説明します。

以下の埋込みSQL文をSQL埋込みCプログラムに記述する場合は、注意が必要です。

・ 埋込み例外宣言

・ ホスト変数

・ カーソル宣言とホスト変数の関係

埋込み例外宣言

埋込み例外宣言で指定したGOTOのホストラベル識別子は、次の同一エラー条件が出現するまで有効となります。

埋込み例外宣言の有効範囲が、複数の関数にまたがる場合は、有効となるすべての関数に、GOTOのホストラベル識別

子を記述する必要があります。ホストラベル識別子を関数内に記述していない場合は、コンパイル時にエラーとなります。

埋込み例外宣言のGOTOのホストラベル識別子が、main関数、sub1関数およびsub2関数で有効となる場合には、そ

れぞれの関数内にGOTOのホストラベル識別子を記述します。

ホスト変数

ホスト変数の名前は、SQL埋込みCプログラムで一意である必要があります。名前が一意でない場合は、コンパイル時に

エラーとなります。

このため、複数の関数で共通に使うホスト変数、SQLSTATEおよびSQLMSGは、グローバル域に記述する必要がありま

す。

ただし、マルチスレッド環境の場合は、コンパイル時にオプションを指定することにより、以下の変数については、関数単

位に変数の名前を重複して記述できます。

・ SQLSTATE

・ SQLMSG

それぞれの例を以下に示します。

例1

複数の関数で共通に使うホスト変数をグローバル域に記述する例

- 31 -

EXEC SQL BEGIN DECLARE SECTION ;

char SQLSTATE[6] ; …… (1)

char SQLMSG[256] ; …… (2)

long common1 ; …… (3)

long common2 ; …… (4)

EXEC SQL END DECLARE SECTION ;

main() {

EXEC SQL BEGIN DECLARE SECTION ;

long private1 ; …… (5)

long private2 ; …… (6)

EXEC SQL END DECLARE SECTION ;

}

long sub1(){

EXEC SQL BEGIN DECLARE SECTION ;

long private3 ; …… (7)

long private4 ; …… (8)

EXEC SQL END DECLARE SECTION ;

}

(1)~(4) 複数関数で共通なホスト変数の記述

(5)~(6) main関数でだけ使用するホスト変数の記述

(7)~(8) sub1関数でだけ使用するホスト変数の記述

例2

マルチスレッド環境において、複数の関数で共通に使うホスト変数を関数単位に重複して記述する例

SQLHDBS ses_id;

int main( void )

{

EXEC SQL BEGIN DECLARE SECTION;

auto char SQLSTATE[6]; …… (1)

auto char SQLMSG[256]; …… (2)

EXEC SQL END DECLARE SECTION;

SQLThrAllocID( &ses_id );

SQLThrStartID( ses_id );

EXEC SQL CONNECT TO 'SV1';

:

sub01();

:

EXEC SQL DISCONNECT ALL;

SQLThrEndID ( ses_id );

SQLThrFreeID ( ses_id );

return 0;

}

void sub01( void )

{

EXEC SQL BEGIN DECLARE SECTION;

auto char SQLSTATE[6]; …… (3)

auto char SQLMSG[256]; …… (4)

auto short len1; …… (5)

EXEC SQL END DECLARE SECTION;

:

EXEC SQL CONNECT TO 'SV2';

:

return 0;

}

- 32 -

(1)~(2) 複数関数で共通なホスト変数のmain関数における記述

(3)~(4) 複数関数で共通なホスト変数のsub01関数における記述

(5) sub01関数でだけ使用するホスト変数の記述

カーソル宣言とホスト変数の関係

カーソル宣言で使用したホスト変数が評価されるのは、OPEN文の実行時です。このため、複数の関数でホスト変数が指

定された同一のカーソルをオープンする場合は、カーソル宣言に指定したホスト変数は、グローバル域に記述する必要

があります。マルチスレッド環境で動作させる場合は、グローバル域に記述した変数に対して排他を考慮する必要があり

ます。

カーソル宣言文をグローバル域に記述する例を以下に示します。

EXEC SQL BEGIN DECLARE SECTION ;

char SQLSTATE[6] ; …… (1)

char SQLMSG[256] ; …… (2)

long common1 ; …… (3)

(5)

EXEC SQL END DECLARE SECTION ;

EXEC SQL DECLARE CUR1 CURSOR FOR SELECT … WHERE NUMBER = :common1; … (4)

(6) (5)

main() {

EXEC SQL OPEN CUR1 ;

: (6)

}

long sub1(){

EXEC SQL OPEN CUR1 ;

: (6)

}

(1)~(3) 複数関数で共通なホスト変数の記述

(4) 複数関数で共通なカーソル宣言の記述

(5) main関数とsub1関数で共通に使うホスト変数名

(6) main関数とsub1関数で共通に使うカーソル名

2.7.2 埋込みCOBOLプログラムの場合

ここでは、SQL埋込みCOBOLプログラムに記述するSQL文中の名前の一意性と有効範囲について説明します。

入れ子構造のSQL埋込みCOBOLプログラムに、以下の埋込みSQL文を記述する場合は、注意が必要です。

・ 埋込み例外宣言

・ ホスト変数

・ カーソル宣言とホスト変数の関係

埋込み例外宣言

埋込み例外宣言で指定したGOTOの手続き名は、次の同一エラー条件が出現するまで有効となります。

埋込み例外宣言の有効範囲が、複数の入れ子プログラムにまたがる場合は、有効となるすべてのプログラム中にGOTOの手続き名を記述する必要があります。手続き名を記述してない場合は、コンパイル時にGOTO文に指定した手続き名

がない旨のエラーとなります。

埋込み例外宣言のGOTO手続き名が、入れ子関係のプログラムSAMPLE01、SAMPLE02およびSAMPLE03で有効

となる場合には、それぞれのプログラム内にGOTOの手続き名を記述します。

- 33 -

主プログラムの埋込み例外宣言で指定したGOTOの手続き名“ERR1”(2)には、各入れ子プログラムから分岐できま

せん。このため、各入れ子プログラム中に、主プログラムの埋込み例外宣言で指定したGOTOの手続き名“ERR1”(1)を記述します。

ホスト変数

ホスト変数の名前は、SQL埋込みCOBOLプログラムで一意である必要があります。名前が一意でない場合は、コンパイ

ル時でエラーになります。

このため、複数の入れ子プログラムで共通に使うホスト変数、SQLSTATEおよびSQLMSGは、大域名として一番外側の

プログラムに記述する必要があります。例を以下に示します。

複数の入れ子プログラムで、共通に使うホスト変数をグローバル域に記述する例

- 34 -

カーソル宣言とホスト変数の関係

カーソル宣言で使用したホスト変数が評価されるのは、OPEN文の実行時です。このため、複数の入れ子プログラムで、

ホスト変数が指定された同一のカーソルをオープンする場合は、カーソル宣言に指定したホスト変数は、大域名として一

番外側のプログラムに記述する必要があります。

カーソル宣言文を一番外側のプログラムに記述する例を以下に示します。

- 35 -

(1) プログラム“SAMPLE01”、“SAMPLE02”で共通に使うカーソル名

(2) プログラム“SAMPLE01”、“SAMPLE02”で共通に使うホスト変数

2.8 システムコールを使用する場合の注意事項

ここでは、UNIX系システムにおけるデータベースを処理するアプリケーションで、fork関数、exec関数およびsignal関数

などのシステムコールを使用する場合の注意事項について説明します。

新しいプロセスの生成方法

アプリケーションで、新しいプロセスの生成および実行を行う場合は、fork関数とexec関数の2つの関数を利用します。親

プロセスからfork関数を用いて子プロセスを生成し、子プロセスでのプログラムの実行はexec関数を使用してください。以

下に使い方を示します。

- 36 -

fork関数またはexec関数のどちらかだけを使用して、新しいプロセスの生成および実行を行う場合は、以下の注意事項

があります。

・ fork関数またはexec関数は、SQL文の実行前に行う必要があります。SQL文を実行した後にfork関数またはexec関数を使用すると、アプリケーションは正しく動作しません。

・ マルチスレッド環境において、fork関数またはexec関数は、はじめてのセション(セションID)を作成する前に行う必要

があります。

シグナル操作

アプリケーションでsignal関数を使用している、いないにかかわらず、SQL文実行中は以下のシグナルは割込みの対象と

はなりません。

・ SIGHUP

・ SIGQUIT

・ SIGTSTP

・ SIGTTIN

・ SIGTTOU

アプリケーションの中のSQL文以外の部分を実行しているときは、割込み対象シグナルはアプリケーション中でのsignal関数の指定に従います。

- 37 -

シグナルの抑止

アプリケーションでシグナル“SIGINT”を利用しないようにすることができます。シグナルを利用しないようにするには、動

作環境ファイルの実行パラメタ“SIGNAL_INF=NO”を設定します。

2.9 SQL文のデータ操作文に関する注意事項

Symfoware/RDBには、表の設計変更による列の変更によって、アプリケーションに影響があるか否かをチェックする機能

があります。あらかじめ以下の方法でチェックしておくことを推奨します。

アプリケーションのコンパイル時にチェックする

アプリケーションに埋め込まれたSQL文をチェックします。アプリケーションのコンパイル・リンク時に、Kオプションを指定

します。このオプションを指定すると、選択リストに“*”を指定したカーソル宣言または単一行SELECT文や、挿入列リスト

を省略したINSERT文が存在する場合に、アプリケーションのコンパイルがエラーになります。

アプリケーションの実行時にチェックする

アプリケーションで実行するSQL文をチェックします。実行時のチェックはコンパイル時のチェックと異なり、アプリケーショ

ンで動的SQL文を実行するときにもSQL文をチェックします。選択リストに“*”を指定したカーソル宣言または単一行

SELECT文や、挿入列リストを省略したINSERT文を実行した場合、SQL文の実行がエラーになります。SQL文のチェック

を有効にするためには、クライアント用の動作環境ファイルの実行パラメタに、ALTER_CHECK = (YES)を指定します。

詳細については、“7.4.1 クライアント用の動作環境ファイルによる定義”を参照してください。

2.10 コールバック機能の利用方法

ここでは、コールバック機能の利用方法について説明します。

・ コールバック関数の概要

・ コールバック関数の登録方法

コールバック機能とは、アプリケーションでSQL文を実行するとき、あらかじめSQL文の種別に対して登録した関数を実行

する機能です。コールバック機能を利用すると、SQL文の実行ログを採取したり、SQL文の実行を迂回することができま

す。また、コールバック関数にはSQL文の実行結果が通知されるため、デッドロックやコネクション切断などの特定のエ

ラーが発生したSQL文の実行ログを採取することも可能になります。

コールバック関数の概要

コールバック機能を利用する場合は、コールバック関数とよばれる利用者定義関数を作成し、SQL文の種別ごとに登録

します。これにより、アプリケーションでSQL文が実行されるたびに、登録されたコールバック関数が実行されます。

コールバック関数にはセションID(マルチスレッド環境で動作するアプリケーションの場合)、SQL文、実行結果および入

出力データが通知されるため、利用者は必要に応じてデータを加工してください。

- 38 -

コールバック関数

コールバック関数は、利用者が作成する関数です。関数名は利用者によって任意に指定できますが、復帰値や関数

のパラメタは規定されています。

コールバック関数は、SQL文の処理の直前か直後かによって、入口コールバック関数または出口コールバック関数と

呼ばれます。入口コールバックまたは出口コールバックは、コールバック関数の登録時に指定します。

入口コールバック関数は、復帰値によってその後の動作が異なります。入口コールバック関数がSQLRDB_CONTINUEを返した場合は、SQL文の処理を実行します。しかし、SQLRDB_NOCONTINUEを返した場合はSQL文の処理は実

行されず、出口コールバック関数が実行されます。入口コールバック関数でエラーが発生した場合などSQL文の処

理を実行したくない場合は、SQLRDB_NOCONTINUEを返してください。

出口コールバック関数には、SQL文の実行結果としてSQLSTATEおよびSQLMSGが通知されます。エラーが発生し

たSQL文の実行ログを採取する場合は、SQLSTATEおよびSQLMSGの情報を使用してください。ただし、アプリケー

ションでホスト変数SQLMSGが定義されていない場合は、SQLMSGは通知されません。また、入口コールバック関数

には、SQLSTATEおよびSQLMSGは通知されません。

アプリケーションとデータを共有するため、コールバック関数に対し利用者定義領域のアドレスを設定することができ

ます。コールバック関数の結果をアプリケーションに通知するには、利用者定義領域を使用してください。利用者定

義領域のアドレスは、コールバック関数の登録時に指定します。

- 39 -

コールバック関数の登録方法

アプリケーションにコールバック関数を登録する方法には以下があります。

・ アプリケーションのソースに記述する方法

・ 動的ライブラリを使用して登録する方法

SQL文を実行する場面に合わせて、個別の処理が必要なコールバック関数の場合は、アプリケーションのプログラムソー

スに記述する方法で登録します。コールバック関数を登録するには、アプリケーションの修正およびコンパイルが必要に

なります。

アプリケーションの全体を通して、汎用的な処理を行うコールバック関数の場合は、動的ライブラリを使用する方法で登

録します。アプリケーションの修正は必要ありません。

アプリケーションのソースに記述する方法

コールバック関数を静的に登録するには、アプリケーション中にSQLSetCallback関数を記述します。登録は各SQL文の種別ごとに行うため、登録するSQL文種別の数だけSQLSetCallback関数を実行します。また、複数のSQL文種別

に対し同一のコールバック関数を登録する場合は、登録するSQL文種別のリストをSQLSetCallback関数に指定する

ことで、一括して登録することができます。

SQLSetCallback関数はアプリケーション中のどこでも記述することができますが、コールバック関数を実行したいSQL文より前に記述する必要があります。

一度登録したSQL文種別に対し再度コールバック関数を登録すると、コールバック関数を変更することができます。

また、登録したコールバック関数を解除したい場合は、SQLSetCallback関数の関数アドレスを指定するパラメタに

NULLを指定してください。コールバック関数の変更および解除は、アプリケーション中のどの位置でも可能です。

マルチスレッド環境で動作するアプリケーションの場合、コールバック関数はセションごとにSQL文種別に登録されま

す。そのため、SQLSetCallback関数のパラメタにはコールバック関数を登録するセションIDを指定してください。また、

SQLSetCallback関数を実行できるのは、SQLThrAllocID関数によるセション作成後になります。

コールバック関数を登録するSQL文の種別は、リストの形式で指定します。リストはshort型の配列変数の各要素に、

登録したいSQL文の種別を設定して作成します。また、0が設定されている要素までをリストとみなすため、リストの

後には必ず0を設定してください。これは1種類のSQL文に対し登録する場合でも同様に設定する必要があります。

一度に設定できるSQL文の種別に制限はありません。また、重複して指定された場合もエラーにはなりません。

一度に複数のSQL文種別に対し登録した場合でも、再登録や解除は、個々または別の組合せで行うことが可能で

す。

/* INSERT文、UPDATE文にコールバック関数を登録する場合 */

SQLRETURN CallbackSQL1( ・・・ );

SQLRETURN CallbackSQL2( ・・・ );

SQLRETURN CallbackSQL3( ・・・ );

short list[3];

/* 一括して登録する場合 */

list[0] = SQLRDB_CF_INSERT;

list[1] = SQLRDB_CF_UPDATE;

list[2] = 0;

SQLSetCallback( 0, CallbackSQL1, NULL, list, RDB_CALL_IN );

/* 個別に登録する場合 */

list[0] = SQLRDB_CF_INSERT;

list[1] = 0;

SQLSetCallback( 0, CallbackSQL2, NULL, list, RDB_CALL_IN );

list[0] = SQLRDB_CF_UPDATE;

list[1] = 0;

SQLSetCallback( 0, CallbackSQL3, NULL, list, RDB_CALL_IN );

- 40 -

各SQL文の種別に対し現在コールバック関数が登録されているかどうかは、SQLGetCallback関数を使用することで

取得できます。SQLGetCallback関数は、コールバック関数が登録されている場合はSQLRDB_ENTRYを返し、登録

されていない場合はSQLRDB_NOENTRYを返します。

動的ライブラリを使用して登録する方法

コールバック関数を動的に登録するためには、SQLDynSetCallback関数を含む登録用の動的ライブラリを作成しま

す。動的ライブラリには、以下のSymfoware/RDBのライブラリをリンクしてください。

32ビットで実行するアプリケーション:

libsqldrv.soをリンクします。また、マルチスレッド環境で動作するアプリケーションの場合は、libsqldrvm.soをリンク

してください。

64ビットで実行するアプリケーション:

libsql64drv.soをリンクします。また、マルチスレッド環境で動作するアプリケーションの場合は、libsql64drvm.soをリンクしてください。

32ビットで実行するアプリケーション:

f3cwdrv.libをリンクします。また、マルチスレッド環境で動作するアプリケーションの場合は、f3cwdrvm.libをリンク

してください。

64ビットで実行するアプリケーション:

f3cwdrv_x64.libをリンクします。また、マルチスレッド環境で動作するアプリケーションの場合は、f3cwdrvm_x64.libをリンクしてください。

SQLDynSetCallback関数は利用者が作成する関数ですが、関数名、復帰値およびパラメタは規定されています。利

用者はこの関数内で、SQLSetCallback関数を使用してコールバック関数を登録します。

SQLDynSetCallback関数が正常終了する場合は、復帰値としてSQLRDB_NORMALを返してください。しかし、エ

ラーなどで関数が異常終了する場合は、SQLRDB_NORMAL以外を返却してください。

SQLDynSetCallback関数がエラーを返すとコールバック関数を利用するアプリケーションに以下のエラーが返ります。

- マルチスレッド環境で動作するアプリケーションの場合は、SQLThrAllocID関数でエラー復帰します。

- シングルスレッド環境で動作するアプリケーションの場合は、SQLDynSetCallback関数が実行されたSQL文の実

行結果としてSQLSTATEに74600を設定しエラー復帰します。またアプリケーションにホスト変数SQLMSGが定義

されている場合は、返却された値を埋め込んだ以下のエラーメッセージを出力します。

SQLMSG JYP1085E:コールバック関数の登録処理でエラーが発生しました.詳細種別=“@1@”

動的ライブラリは、環境変数RDBSETCALLBACKまたはクライアント用の動作環境ファイルのSET_CALLBACKパラ

メタに指定します。環境変数RDBSETCALLBACKは、アプリケーションを実行する前に指定してください。

環境変数に指定する場合

Solarisの場合

Cシェルで設定する場合

setenv RDBSETCALLBACK ライブラリ名

bash、Bシェル、Kシェルで設定する場合

RDBSETCALLBACK=ライブラリ名;export RDBSETCALLBACK

Linuxの場合

- 41 -

TCシェルで設定する場合

setenv RDBSETCALLBACK ライブラリ名

bashで設定する場合

RDBSETCALLBACK=ライブラリ名;export RDBSETCALLBACK

Windows(R)の場合

set RDBSETCALLBACK=ライブラリ名

動作環境ファイルに指定する場合

SET_CALLBACK = (ライブラリ名)

環境変数または動作環境ファイルに設定するライブラリ名が絶対パスでの指定でない場合は、以下のディレクトリに

ライブラリを格納する必要があります。

環境変数LD_LIBRARY_PATHに指定したディレクトリ

PATHに指定したディレクトリ

環境変数RDBSETCALLBACKと動作環境ファイルのパラメタSET_CALLBACKの両方が指定された場合、環境変

数RDBSETCALLBACKに指定された値が有効になります。

アプリケーションが実行されると、プロセス内で 初に実行されるSQL文の処理において、環境変数およびクライアン

ト用の動作環境ファイルがチェックされ、動的ライブラリ内のSQLDynSetCallback関数が実行されます。なお、プロセ

ス内の 初のSQL文に対しコールバック関数が指定されている場合もコールバック関数は実行されます。

なお、マルチスレッド環境で動作するアプリケーションの場合、SQLDynSetCallback関数はSQLThrAllocID関数の処

理で実行されます。

- 42 -

- 43 -

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

アプリケーションを開発することにより、データベースのデータを検索したり、更新することができます。アプリケーション

は、利用するホスト言語プログラムの中にデータ操作を行うためのSQL文を埋め込んで作成します。このような、SQL文を

埋め込んだプログラムをSQL埋込みホストプログラムと呼びます。また、このとき使用する言語を、ホスト言語と呼びます。

本章では、アプリケーションの作成方法について説明しています。

参照

基本的なデータ操作を行うためのSQLの使用方法については、“アプリケーション開発ガイド(共通編)”を参照してくださ

い。

3.1 SQL埋込みCプログラムの作成方法

アプリケーションのコーディングは、データベースを処理する部分をSQL文で、そのほかの部分を利用する言語で記述し

ます。利用可能な言語には、C言語およびCOBOL言語があります。SQL文を含むC言語で作成されたアプリケーション

をSQL埋込みCプログラムと呼びます。

本節では、SQL埋込みCプログラムの作成方法について説明します。

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

Cプログラムの中にSQL文を組み込んだアプリケーションを、SQL埋込みCプログラムと呼びます。SQL文は、以下に示す

ように“EXEC SQL”および“;”ではさんで指定します。

図3.1 SQL文のコーディング形式(SQL埋込みCプログラム)

SQL文の指定例を以下に示します。

例1

埋込みSQL宣言節の例

EXEC SQL BEGIN DECLARE SECTION ;

例2

FETCH文の例

EXEC SQL FETCH CU1 INTO :GNO, :GOOD, :QOH ;

また、SQL文の記述の途中で改行すると、改行した位置と次の行の先頭の位置の間に1文字の空白があるのと同じにな

ります。なお、文字列定数および各国語文字列定数の途中で改行することはできません。

3.1.2 SQL文の指定位置および指定順序

アプリケーション中に埋め込んで使用するSQL文には、実行文と非実行文があります。実行文は、データベースをアクセ

スしたり、トランザクションの制御を行うために使用します。非実行文は、実行文で利用するカーソルの宣言やホスト変数

の宣言、例外条件発生時の動作を定義します。非実行文は、アプリケーションの実行対象にはなりません。したがって、

アプリケーション中のGOTO文などによる制御の影響を受けません。

なお、SQL文の利用範囲については、“付録D SQL文の使用範囲”を参照してください。

SQL文の一覧を以下に示します。

- 44 -

表3.1 SQL文

分類 SQL文 備考

非カーソル系データ操作

単一行SELECT文

実行文UPDATE文:探索

INSERT文

DELETE文:探索

カーソル系データ操作

カーソル宣言(DECLARE CURSOR) 非実行文

OPEN文

実行文

CLOSE文

FETCH文

UPDATE文:位置づけ

DELETE文:位置づけ

動的SQL文

ALLOCATE DESCRIPTOR文

実行文

DEALLOCATE DESCRIPTOR文

DESCRIPTOR取得文

DESCRIPTOR設定文

PREPARE文

DEALLOCATE PREPARE文

DESCRIBE文

EXECUTE文

EXECUTE IMMEDIATE文

動的カーソル宣言 非実行文

動的OPEN文

実行文

動的FETCH文

動的CLOSE文

動的DELETE文:位置づけ

動的UPDATE文:位置づけ

ストアドプロシジャ CALL文 実行文

トランザクション制御文

COMMIT文

実行文ROLLBACK文

SET TRANSACTION文

コネクション管理文

CONNECT文

実行文SET CONNECTION文

DISCONNECT文

セション管理文

SET CATALOG文

実行文SET SCHEMA文

SET SESSION AUTHORIZATION文

表宣言 表宣言 非実行文

埋込み例外宣言 WHENEVER文 非実行文

埋込みSQL宣言節 BEGIN DECLARE SECTION 非実行文

- 45 -

分類 SQL文 備考

END DECLARE SECTION

資源操作文 RELEASE TABLE文 実行文

利用者制御文 SET USER PASSWORD文 実行文

アクセス制御文 SET ROLE文 実行文

SQL埋込みCプログラムでの、SQL文の指定位置について説明します。

埋込みSQL宣言節の指定位置

埋込みSQL宣言節は、ホスト変数を定義するためのものです。埋込みSQL宣言節は、C言語仕様上で変数宣言が記述

可能な位置に記述します。なお、ホスト変数を参照するカーソル宣言や実行文の記述位置より、ソースファイル上で先行

して定義します。また、ホスト変数の変数名は、Cプログラムソース上で、一意にかつ、“SQL”以外で始まる名前にする必

要があります。

ホスト変数の宣言

ホスト変数は、アプリケーションとデータベースの間でデータの受渡しをするのに使用する変数です。すなわち、アプ

リケーションで参照するデータをデータベースから取り出すため、または逆に、アプリケーションで設定したデータを

データベースに格納するために、SQL文に指定する変数です。

ホスト変数の宣言は、埋込みSQL宣言節で行います。宣言の記述方法そのものは、C言語での変数の宣言と同じで

す。以下に、ホスト変数の宣言の例を示します。

図3.2 ホスト変数宣言の例(SQL埋込みCプログラム)

状態変数の宣言

状態変数は、処理結果の状態をアプリケーションに伝えるための変数です。状態変数には状態コードが設定されま

す。状態コードは、処理が正常に完了した、または処理中になんらかの例外条件が発生したという状態を表します。

状態変数の変数名は“SQLSTATE”です。

SQLSTATEは長さ5桁の文字列型(char SQLSTATE[6])の変数であり、埋込みSQL宣言節で宣言します。埋込みSQLを使用するアプリケーション中では、状態変数を必ず宣言します。

メッセージ変数の宣言

メッセージ変数は、処理結果をメッセージとしてアプリケーションに伝えるための変数です。メッセージ変数の変数名

は“SQLMSG”です。

SQLMSGは文字列型の変数であり、埋込みSQL宣言節で宣言します。メッセージ変数の宣言のしかたを以下に示し

ます。

char SQLMSG[n]

n:メッセージ変数の長さ(バイト数)であり、2以上32001以下の値を指定します。

メッセージ変数にメッセージが設定されるときの規則を以下に示します。

- 46 -

- 設定されるメッセージは1つだけです。

- メッセージの長さがメッセージ変数の長さ(n)を超える場合、メッセージの先頭からn文字分設定されます。

カーソル宣言の指定位置

カーソル宣言は、Cプログラムソース上のどの位置にも記述できます。ただし、宣言したカーソル名を参照するカーソル系

のSQL文より、ソースファイル上で先行して記述します。なお、カーソル名は、Cプログラムソース上で一意にすることが必

要です。

埋込み例外宣言の指定位置

埋込み例外宣言は、Cプログラムの関数内であればどの位置にも記述できます。埋込み例外宣言の意味と有効範囲に

ついては、“3.1.4 SQL文の処理結果の確認”で説明します。

実行文の指定位置

データ操作文やトランザクション制御文などの実行文は、C言語の実行文が記述可能な位置ならどの位置にも記述でき

ます。

INCLUDE文の指定位置

アプリケーション中にINCLUDE文を指定することができます。インクルードファイルには、SQL文およびC言語の言語テ

キストを記述できます。インクルードファイルに、ホスト変数および状態変数の宣言を格納しておくことにより、複数のアプ

リケーションで共通に使用する変数をまとめて宣言することができます。

表宣言

表宣言は、スキーマ名の修飾をしない表名を定義する宣言文です。表宣言で定義した表名を、それ以降のSQL文で記

述する場合、スキーマ名を省略することができます。INCLUDE文と表宣言の例を以下に示します。

[インクルードファイル“HOSTVAR”]

char SQLSTATE[6];

long STOCK;

[SQL埋込みCプログラム]

EXEC SQL BEGIN DECLARE SECTION;

EXEC SQL INCLUDE HOSTVAR;

EXEC SQL END DECLARE SECTION;

main(){

EXEC SQL DECLARE 在庫表 TABLE ON SCH1;

EXEC SQL SELECT 在庫数量 INTO :STOCK FROM 在庫表 WHERE 製品番号 = 240;

スキーマ名修飾省略

printf("%d\n",STOCK);

}

3.1.3 ホスト変数および標識変数の指定方法

ホスト変数は、アプリケーションとデータベースの間でデータの受渡しをするのに使用する変数です。SQL文中でホスト

変数と対にして指定し、データの内容がNULL値かどうかを表すために使用する変数を、標識変数と呼びます。アプリ

ケーションで参照するデータをデータベースから取り出す場合、標識変数には、取り出したデータがNULL値かどうかを

表す情報が設定されます。逆に、アプリケーションで設定したデータをデータベースに格納する場合には、標識変数に

は、格納するデータがNULL値かどうかを表す情報を設定しておきます。標識変数は、埋込みSQL宣言節で宣言しま

す。宣言の記述方法はホスト変数と同じです。なお、標識変数のデータ型はSQLのSMALLINTに対応するデータ型で

あることが必要です。

- 47 -

参照

各ホスト言語でのデータ型と、SQLのデータ型との対応については、“SQLリファレンス”を参照してください。

ホスト変数および標識変数をSQL文中に指定する場合には、変数の前にコロン“:”を付けて指定します。以下にその指

定例を示します(ゴシック部がホスト変数または標識変数です)。ただし、SQL文以外の、C言語のステートメント中では、

一般のC言語の変数と同じで、コロン“:”は付けません。

標識変数には、SQL文の処理結果が以下のように格納されます。

・ 取り出すデータがNULL値の場合、標識変数には、-1が格納されます。

・ 取り出すデータのデータ型が文字列または各国語文字列で、かつNULL値ではなく、取り出すデータの長さが相手

指定の文字列または各国語文字列の長さよりも長い場合は、取り出すデータの有効な長さが標識変数に格納され

ます。

・ 取り出すデータの有効な長さが32,000バイトを超える場合は、標識変数に0または32,000が格納されます。

・ 上記以外の場合は、標識変数に0が格納されます。

なお、標識変数を指定していない場合、取り出すデータがNULL値になると、SQL文の処理はエラーになります。

例1

ホスト変数の指定例

STOCKおよびHOUSEをホスト変数、QFLAGをSTOCKの標識変数、そして、WFLAGをHOUSEの標識変数として指

定します。SQL文中にホスト変数および標識変数を指定する場合は、コロン“:”を付けます。

EXEC SQL SELECT 在庫数量,倉庫番号

INTO :STOCK INDICATOR :QFLAG,

:HOUSE INDICATOR :WFLAG

FROM 在庫表 WHERE 製品番号 = 110;

例2

SQL文以外のC言語のステートメント上のホスト変数の指定例

STOCKをホスト変数、QFLAGをSTOCKの標識変数として使用しています。C言語のステートメントでは、これらの変

数にコロン“:”は付けません。

EXEC SQL FETCH CU1 INTO :STOCK INDICATOR :QFLAG;

if( QFLAG == -1) goto p_null ;

if( STOCK == 0) goto p_loop ;

ホスト変数を使用する場合の注意事項

文字列型または各国語文字列型の場合、NULL文字(\0)はデータ受渡しの対象にはなりません。そのため、アプリケー

ションで文字列の終わりを認識するような処理を行う場合、NULL文字を設定しなければなりません。以下に例を示しま

す。

SQLSTATE[5]='\0';

printf( "SQLSTATE:%s\n" , SQLSTATE );

ホスト変数へ入出力するデータの文字コード系の考慮

ホスト変数へ入出力するデータの文字コード系がSymfoware/RDBの文字コード系と異なる場合は、そのホスト変数に格

納するデータの文字コード系を、クライアント用の動作環境ファイルまたは環境変数に設定します。

以下に、ホスト変数へ入出力するデータの文字コード系がSymfoware/RDBの文字コード系と異なる場合の例、および、

ホスト変数へ入出力するデータの文字コード系とSymfoware/RDBの文字コード系が同じ場合の例を示します。

例1

ホスト変数へ入出力するデータの文字コードとSymfoware/RDBの文字コード系が異なる場合

- 48 -

以下の例では、Symfoware/RDBの文字コード系がシフトJISコード、また、SELECT文(1)でホスト変数に格納された

データの文字コード系がUNICODEであるとします。そして、このデータを格納するデータベースの文字コード系は

UNICODEであるとします。

この場合、クライアント用の動作環境ファイルまたは環境変数には、ホスト変数に格納されているデータがUNICODEであることを示すパラメタを設定します。

設定するパラメタについての詳細は、“7.4.1 クライアント用の動作環境ファイルによる定義”を参照してください。

こうすることによって、サーバでのコード変換の必要がなくなります。

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

:

char CHARACTER SET NCHAR H1[10];

EXEC SQL END DECLARE SECTION;

:

memset(H1,'\0',sizeof(H1));

EXEC SQL SELECT COL1 INTO :H1 FROM S1.T0 WHERE COL0=3; …… (1)

EXEC SQL INSERT INTO S1.T1 VALUES(3,:H1); …… (2)

(1) データベースよりUNICODEなどのSymfoware/RDBの文字コード系と異なるコードのデータが取得できます。

(2) 上記の単一行SELECT文で取得したデータのコードのまま、INSERT文が実行できます。このように、アプリケー

ションにおいて、Symfoware/RDBの文字コード系と異なるコード系のデータが操作可能です。

例2

ホスト変数へ入出力するデータの文字コードがSymfoware/RDBの文字コード系と同じ場合

以下の例では、Symfoware/RDBの文字コード系がシフトJISコードであるとします。この場合、ホスト変数に入出力す

るデータの文字コード系はシフトJISコードになります。

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

:

char CHARACTER SET NCHAR H1[10];

EXEC SQL END DECLARE SECTION;

:

memset(H1,'\0',sizeof(H1));

memcpy(H1,"日本語",6); …… (1)

EXEC SQL INSERT INTO S1.T1 VALUES(:H1); …… (2)

(1) Symfoware/RDBの文字コード系の“日本語”がホスト変数H1に格納されます。

(2) Symfoware/RDBの文字コード系の“日本語”でINSERT文を実行します。このように、Symfoware/RDBの文字コー

ド系を使用してデータ操作を行う場合に適しています。

マルチスレッド環境でのホスト変数の宣言

マルチスレッド環境で実行するアプリケーションでは、ホスト変数にはauto変数を使用することを推奨します。extern変数

およびstatic変数などを使用した場合は、スレッド間でホスト変数が共有されるため、複数のスレッドから同時にデータベー

スをアクセスすると、参照および更新が正しくできない場合があります。extern変数およびstatic変数などを使用する場合

は、セマフォを利用するなどして、並列に動作するスレッド間の排他制御を考慮したアプリケーションを作成してください。

参照

セマフォの詳細については、OSのシステム関数について説明されているマニュアルを参照してください。

- 49 -

long long型および、8バイトで実装されるlong型のホスト変数の利用について

long型は、コンパイラにより、4バイトになる場合と8バイトになる場合があります。

8バイトで実装されるlong型および、long long型のホスト変数を利用した場合、ホスト変数には 大20桁のデータを代入

できます。

一方、データベースで扱えるデータの 大桁数は18桁です。

このため、19桁以上の値を代入したホスト変数をSQL文中の検索条件などで利用した場合、データベースアクセス時に

エラーとなります。検索条件などに19桁以上の値を指定することで、データベースアクセス時のエラーが発生することを

防ぎたい場合は、アプリケーション中で事前にホスト変数の値が18桁以下であるかをチェックしてください。

条件値以下のすべての値を取り出すための条件値が18桁を超えている場合に、アプリケーションにて条件値を18桁の

大数に変更するプログラム例を以下に示します。

下記の表にアクセスし、列VALUE1の値が検索条件の値以下の行の列CODE1をすべて取り出す例を示します。

スキーマ:SCH1

表:TBL1

列:CODE1:SMALLINT UNIQUE NOT NULL

VALUE1:DECIMAL(18,0)

18桁以下の場合に、真を返却するマクロ(sample1.h)

#define CheckGetPrecision18(data) ((long long)(data) <= 999999999999999999LL )

検索条件の組立て(C言語)

short gyoumu1() {

long long condition;

short code[65536];

int count;

condition = 123456789012345678LL; /*実際は、画面入力などを元にデータを組み立てます。*/

count = dba_KINGAKU_SETTEI( code , condition );

return 0;

}

データベースアクセスアプリケーション(SQL埋込みCプログラム)

#include “sample1.h”

short dba_KINGAKU_SETTEI( short *para1 , long long para2 ) {

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

short code1;

long long condition;

EXEC SQL END DECLARE SECTION;

int count;

EXEC SQL WHENEVER SQLERROR GOTO :ERROR;

EXEC SQL WHENEVER NOT FOUND GOTO :NOTFOUND;

condition = para2;

/* データベースの対応カラムの精度と比較 */

if ( !CheckGetPrecision18( condition ) ) {

condition = 999999999999999999LL; /* 条件値を18桁の最大値に変更 */

}

- 50 -

/* カーソル宣言 */

EXEC SQL DECLARE CUR1 CURSOR FOR SELECT CODE1

FROM SCH1.TBL1 WHERE VALUE1 <= :condition;

EXEC SQL OPEN CUR1;

for ( count = 0 ;; count++ ) {

EXEC SQL FETCH CUR1 INTO :code1;

para1[count] = code1;

}

NOTFOUND:

EXEC SQL CLOSE CUR1;

return(count);

ERROR:

EXEC SQL CLOSE CUR1;

return(-1);

3.1.4 SQL文の処理結果の確認

アプリケーションはSQL文を実行したあと、実行結果を確認して処理を進めて行くことが必要です。このSQL文の実行結

果を確認する方法には、以下の2通りがあります。

a. 状態変数およびメッセージ変数を使用する場合

b. 埋込み例外宣言(WHENEVER文)を使用する場合

状態変数およびメッセージ変数を使用する場合

SQL文の実行結果は、各SQL文の実行ごとに、状態変数SQLSTATEおよびメッセージ変数SQLMSGに通知されます。

アプリケーションでは、その値を判定しながら処理を進めます。

SQLSTATEおよびSQLMSGは、あらかじめ埋込みSQL宣言節で宣言しておく必要があります。宣言の詳細は、“状態変

数の宣言”および“メッセージ変数の宣言”を参照してください。

SQLSTATEに通知される値とその意味は、“アプリケーション開発ガイド(共通編)”の“SQLSTATE値”を参照してくださ

い。また、SQLMSGに通知される内容は、“メッセージ集”を参照してください。

SQLSTATEおよびSQLMSGを使用したSQL文の実行結果の確認方法は、“A.12 状態変数およびメッセージ変数の使

用例”を参照してください。

埋込み例外宣言(WHENEVER文)を使用する場合

埋込み例外宣言は、SQL文が例外条件を生じた場合に実行する処理を指定するSQL文です。これにより、SQL文の実

行ごとに、実行結果をチェックする必要がなくなります。埋込み例外宣言の指定例を以下に示します。

例1

データなし以外のエラーが発生した場合には、ERR001へ進むことを指定します。

EXEC SQL WHENEVER SQLERROR GOTO :ERR001;

(1) (2)

(1) 条件

(2) 例外動作

例2

検索の結果データが見つからない場合に、処理をそのまま続行することを指定します。

EXEC SQL WHENEVER NOT FOUND CONTINUE;

(1) (2)

- 51 -

(1) 条件

(2) 例外動作

条件は、以下の2通りの指定ができます。

NOT FOUND:

検索データが見つからない場合に指定の例外動作を行います。

SQLERROR:

“検索データが見つからない”以外の例外(エラー)が発生した場合に指定の例外動作を行います。

例外動作は、以下の2通りの指定ができます。

CONTINUE:

次のステートメントに進みます。

GOTO <行き先>:

行き先で指定のステートメントに進みます。ここで、<行き先>は、制御を移す先の文に付けられた名札(ラベル)の前にコロン“:”を付けて指定します。

例3

SQL埋込みCプログラムで、SQL文にエラーが発生した場合には、P_ERRORへ進み、変数rcodeに8を設定すること

を指定します。

EXEC SQL WHENEVER SQLERROR GOTO :P_ERROR ;

P_ERROR: rcode = 8 ;

WHENEVER文は複数個宣言することができます。条件の同じWHENEVER文を指定した場合、アプリケーション中

での記述順序があとの宣言が有効になります。実行の順序とは関係ありません。

WHENEVER文の有効範囲の例を以下に示します。

- 52 -

図3.3 WHENEVER文を使用したアプリケーションの例

(1) 状態変数“SQLSTATE”およびメッセージ変数“SQLMSG”を宣言します。

(2) SQL文の実行でNOT FOUND以外のエラーが生じた場合にP_ERRORへ進み、エラー情報を出力しプログラムは

終了します。

(3) カーソル“CU1”の操作でNOT FOUND(検索データが見つからない)が生じた場合にP_NEXTへ進みカーソル

“CU1”のクローズと在庫数量の出力を行います。

(4) カーソル“CU2”の操作でNOT FOUND(検索データが見つからない)が生じた場合にP_ENDへ進みカーソル“CU2”のクローズと発注数量の出力を行い、プログラムは終了します。

3.1.5 日本語文字使用時の注意事項

ここでは、アプリケーション中に日本語文字を使用する方法について説明します。

- 53 -

ホスト変数の長さ

シフトJISコードの場合

シフトJISコードの日本語文字を使用する場合、各国語文字列型のデータをデータベースから取得、またはデータ

ベースに格納する場合、日本語文字は2バイトとなります。このため、ホスト変数の長さは、以下のように算出してくだ

さい。

ホスト変数の長さ = 日本語文字数 * 2バイト + 1

EUCコードの場合

EUCコードの日本語文字を使用する場合は、日本語文字に3バイトの拡張漢字または利用者定義文字を含む可能

性があります。このため、ホスト変数の長さは、格納に十分な大きさを考慮して以下のように算出してください。

ホスト変数の長さ = 日本語文字数 * 3バイト + 1

UTF-8形式の場合

UTF-8形式の日本語文字を使用する場合は、日本語文字コードは2~6バイトとなります。

ホスト変数の長さ = 日本語文字数 * 6バイト + 1

SQL記述子域のオクテット長

動的SQLを使用して、各国語文字列型のデータをデータベースから取得する場合、SQL記述子域のオクテット長(バイト

数)は、以下のようになります。

シフトJISコードの場合

シフトJISコードの日本語文字を使用する場合は、1文字を2バイトに換算した値となります。

EUCコードの場合

EUCコードの日本語文字を使用する場合は、取得するデータが2バイト表現の日本語文字か3バイト表現の日本語文

字かにかかわらず、SQL記述子域のオクテット長(バイト数)は、1文字を3バイトに換算した値となります。

UTF-8形式の場合

UTF-8形式の日本語文字を使用する場合は、1文字を6バイトに換算した値となります。

切捨ておよび補正

データベース中の日本語文字の長さは2バイトです。これに対してEUCコードおよびUTF-8形式の日本語文字を使用

する場合、ホスト変数の長さは、EUCコードは3バイトであり、UTF-8形式は6バイトです。このため、ホスト変数の使用

に際して、以下の留意事項があります。

ホスト変数に設定する値の補正

ホスト変数にEUCコードまたはUTF-8形式の日本語文字を設定してデータベースにデータを格納する場合、ホスト変

数に設定する日本語文字列の長さがホスト変数の長さよりも短い場合は、有効文字列以外の領域には、英数字の空

白を設定してください。なお、日本語の空白は、有効な文字列とみなします。

ホスト変数に設定される値の切捨ておよび補正

データベースから取り出したEUCコードまたはUTF-8形式の日本語文字をホスト変数に格納する場合、自動的に切

捨ておよび補正が行われます。

切捨て

ホスト変数に格納される日本語文字の長さがホスト変数の長さよりも長い場合は、格納可能な文字数のみ格納し、

残りは切り捨てられます。

補正

ホスト変数に格納される日本語文字の長さがホスト変数の長さよりも短い場合は、有効な文字列以外の領域には

英数字の空白が設定されます。

- 54 -

3.1.6 可変長文字列のデータ操作

ホスト変数の可変長文字列をCプログラムで操作する場合は、文字列の長さが必要です。このため、コンパイル時には、

可変長文字列を文字列の長さと文字列を持つ構造体形式に変換します。Cプログラムは、変換された構造体の変数で

データ操作を行います。

詳細は、“A.1 可変長文字列のデータ操作例”を参照してください。

3.1.7 日本語可変長文字列のデータ操作

ホスト変数の日本語可変長文字列をCプログラムで操作する場合は、文字列の長さが必要です。このため、コンパイル時

には、日本語可変長文字列の長さと日本語文字列を持つ構造体に変換します。Cプログラムは、変換された構造体の変

数でデータ操作を行います。

詳細は、“A.2 日本語可変長文字列のデータ操作例”を参照してください。

3.1.8 ポインタ変数として宣言したホスト変数の使用方法

ここでは、ポインタ変数として宣言したホスト変数の使用方法について、以下を説明します。

・ ポインタ変数のデータ領域の設定とサイズ

・ ポインタ変数の使用方法

ポインタ変数のデータ領域の設定とサイズ

ポインタ変数は、領域のアドレスを保持する変数です。ポインタ変数を利用すると、動的に領域を獲得することができま

す。また、関数のパラメタで領域のアドレスを渡すことができるため、アプリケーション間で領域を共有できます。

ホスト変数をポインタ変数として宣言した場合、ホスト変数はデータではなくデータ領域の先頭アドレスを保持します。し

たがって、アプリケーション中で、 初にホスト変数を使用する前に、参照するデータ領域のアドレスを設定してください。

ポインタ変数が参照するデータ領域のサイズは、コンパイル時または実行時に、以下のように認識されます。

数値型の場合

数値型の場合、ポインタ変数が参照する領域のサイズは参照する先の数値型のサイズになります。

参照

数値型については、“SQLリファレンス”を参照してください。

文字列型の場合

文字列型のポインタ変数が参照する領域のサイズは、先頭アドレスからNULL文字までの長さとなります。

文字列型のポインタ変数を値指定に使用する場合、参照先のデータ領域に設定した文字列の 後にNULL文字を

設定する必要があります。

EXEC SQL BEGIN DECLARE SECTION;

char *country; (1)

EXEC SQL END DECLARE SECTION;

country = malloc(11); (2)

strcpy( country, “Japanese” ); (3)

EXEC SQL INSERT INTO SCH.TBL( COUNTRY ) (4)

VALUES( :country );

(1) 文字列型のポインタ変数countryを宣言します。

(2) countryに11バイトの領域のアドレスを設定します。

- 55 -

(3) countryの参照する領域に文字列を設定します。strcpy関数を使用して、文字列の 後にNULL文字を設定し

ます。

(4) INSERT文の値指定にcountryを指定します。

文字列型のポインタ変数を相手指定に使用する場合、参照先のデータ領域の 後にNULL文字を設定します。

Symfoware/RDBは先頭アドレスからNULL文字までを領域のサイズとします。

EXEC SQL BEGIN DECLARE SECTION;

char *country; (1)

EXEC SQL END DECLARE SECTION;

country = malloc(11); (2)

memset( country, ‘ ‘, 10 ); (3)

*(country+10) = ‘\0’; (4)

EXEC SQL SELECT COUNTRY INTO :country (5)

FROM SCH.TBL

WHERE DATANO = 1;

(1) 文字列型のポインタ変数countryを宣言します。

(2) countryに11バイトの領域のアドレスを取得します。

(3) 領域の値は不定なので、空白文字を設定します。

(4) 11バイト目にNULL文字を設定します。

(5) 単一行SELECT文の相手指定にcountryを指定します。

可変長文字列型の場合

可変長文字列型の場合はコンパイル時に構造体に変換されるため、データ領域はデータ長に2バイト足したサイズ

が必要になります。可変長文字列型のサイズは、変換された構造体のメンバ sqllen に設定してください。

アプリケーション中に以下のように宣言します。

VARCHAR *country;

↓コンパイル時に構造体に変換します。

struct country_SQLVAR {

short sqllen;

char sqlvar[1];

} *country;

可変長文字列型のポインタ変数を相手指定に使用する場合、SQL文を実行するとデータ領域長を設定するメンバ

sqllen に取得したデータの長さが設定されます。したがって、再度SQL文を実行する場合は、実行前に領域長を設

定し直す必要があります。

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR *country;

short loop;

EXEC SQL END DECLARE SECTION;

char buff[12];

country = (struct country_SQLVAR *)malloc(13); (1)

country->sqllen = 10; (2)

for ( loop=0; loop<MAX_COUNTRY; loop++ ) { (3)

EXEC SQL SELECT COUNTRY INTO :country (4)

FROM SCH.TBL

WHERE DATANO = :loop;

- 56 -

country->sqllen = 10; (5)

}

(1) countryに13バイトの領域のアドレスを設定します。

(2) 変換後の構造体のメンバsqllenに領域長を設定します。

(3) MAX_COUNTRY件のデータを取り出します。

(4) countryを指定したSELECT文を実行します。

(5) 次のSQL文の実行前に、変換後の構造体のメンバsqllenに領域長を設定します。

BLOB型の場合

BLOB型の場合はコンパイル時に構造体に変換されるため、データ領域はデータ長に8バイト足したサイズが必要に

なります。また、データ領域は1Kバイト(1024バイト)単位で取得してください。BLOB型のサイズは、変換された構造体

のメンバ ホスト変数名_length に設定してください。

アプリケーション中に以下のように宣言します。

SQL TYPE IS BLOB *image;

↓コンパイル時に構造体に変換します。

struct image_SQLBLOB {

long image_reserved;

long image_length;

char image_data[1];

} *image;

BLOB型のポインタ変数を相手指定に使用する場合、SQL文を実行するとデータ領域長を設定するメンバ 変数名

_length に取得したデータの長さが設定されます。したがって、再度SQL文を実行する場合は、実行前に領域長を設

定し直す必要があります。

EXEC SQL BEGIN DECLARE SECTION;

SQL TYPE IS BLOB *image;

short loop;

EXEC SQL END DECLARE SECTION;

char buff[12];

image = (struct image_SQLBLOB *)malloc(10248); (1)

image->image_length = 10240; (2)

for ( loop=0; loop<MAX_COUNTRY; loop++ ) { (3)

EXEC SQL SELECT COUNTRY INTO :image (4)

FROM SCH.TBL

WHERE DATANO = :loop;

image->image_length = 10240; (5)

}

(1) imageに10248バイトの領域のアドレスを設定します。

(2) 変換後の構造体のメンバimage_lengthに領域長を設定します。

(3) MAX_COUNTRY件のデータを取り出します。

(4) imageを指定したSELECT文を実行します。

(5) 次のSQL文の実行前に、変換後のメンバimage_lengthに領域長を設定します。

- 57 -

ROW_ID型の場合

ROW_ID型の場合、ポインタ変数が参照する領域は24バイト必要です。また、サイズは24になります。

DECIMAL型の場合

精度が p のDECIMAL型の場合、ポインタ変数が参照する領域は (p÷2)+1 バイト必要です。また、サイズも(p÷2)+1になります。

NUMERIC型の場合

精度が p のNUMERIC型の場合、ポインタ変数が参照する領域は p+1 バイト必要です。また、サイズも p+1 になりま

す。

構造体型の場合

構造体型の場合、ポインタ変数が参照する領域のサイズは各メンバのサイズの合計となります。

SQLSTATEの場合

SQLSTATEをポインタ宣言する場合は、5バイト以上の領域が必要です。

ポインタ変数の使用方法

以下に、ポインタ変数を使用したデータ操作を実現するためのプログラミング例を示します。

データ領域を動的に取得する例

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

short datano;

SQL TYPE IS BLOB *image;

EXEC SQL END DECLARE SECTION;

short main()

{

image = (struct image_SQLBLOB *)malloc( 10240 + 8 ); …… (1)

image->image_length = 10240;

datano = 5;

/* データの取得 */

EXEC SQL SELECT IMAGE …… (2)

INTO :image

FROM SCH01.TBL01

WHERE DATANO = :datano;

return 1;

}

(1) ホスト変数 image に領域のアドレスを設定します。

(2) 該当するデータを取得します。

関数パラメタをデータ領域として使用する例

/* データ取得関数 */

short get_data( void *, short );

short main()

{

void *image;

image = malloc( 10240 + 8 ); …… (1)

- 58 -

ret = get_data( image, 5 ); …… (2)

return 1;

}

short get_data(

void *image_data;

short number;

{

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

SQL TYPE IS BLOB *image;

short datano;

EXEC SQL END DECLARE SECTION;

image = (struct image_SQLBLOB *)image_data; …… (3)

image->image_length = 10240; …… (4)

datano = number;

/* データの取得 */

EXEC SQL SELECT IMAGE …… (5)

INTO :image

FROM SCH01.TBL01

WHERE DATANO = :datano;

return 0;

}

(1) データ取得関数に指定するデータ領域を取得します。

(2) データ取得関数を呼び出します。

(3) ホスト変数に領域アドレスを設定します。

(4) ホスト変数の領域長を設定します。

(5) データを取得します。

3.1.9 構造体として宣言したホスト変数の使用方法

ここでは、構造体として宣言したホスト変数の使用方法について、以下を説明します。

・ 構造体ホスト変数の使用方法

・ 標識変数の使用方法

・ 複数行の一括挿入

構造体型として宣言したホスト変数を構造体ホスト変数と呼びます。

構造体ホスト変数を宣言すると、各メンバがデータベースの各列に対応するように扱われるので、複数列のデータを行単

位で操作することができます。また、複数行の一括挿入もできます。ポインタ変数と組み合わせて利用することにより、ア

プリケーションが簡潔化され、保守性が向上します。

なお、標識変数を使用する場合は、構造体型の標識変数を宣言する必要があります。

構造体型ホスト変数を使用する場合は、以下の点に注意してください。

・ INSERT文のVALUES句に指定する場合は、挿入列リストの数と構造体のメンバの個数は同じでなければなりませ

ん。また、構造体のメンバの順序は、挿入列リストに指定されている列の順序に対応します。

・ INSERT文の挿入列リストが省略された場合は、構造体のメンバが表のすべての列に対応している必要があります。

- 59 -

・ 単一行SELECT文のINTO句に指定する場合は、選択リストの数と構造体のメンバの個数は同じでなければなりませ

ん。また、構造体のメンバの順序は、選択リストに指定されている列の順序に対応します。

・ FETCH文のINTO句に指定する場合は、カーソル宣言で指定した問合せ指定の選択リストの数と構造体のメンバの

個数は同じでなければなりません。また、構造体のメンバの順序は、選択リストに指定されている列の順序に対応し

ます。

・ 選択リストに“*”が指定された場合は、FROM句で指定した順に各表の各列のすべてに対応したメンバを定義する

必要があります。

・ EXECUTE文の結果USING句に指定する場合は、被準備文である動的単一行SELECT文の相手指定の個数と構

造体のメンバの個数は同じでなければなりません。また、構造体のメンバの順序は、被準備文の相手指定の順序に

対応します。

・ EXECUTE文のパラメタUSING句に指定する場合は、被準備文の動的パラメタ指定の個数と構造体のメンバの個数

は同じでなければなりません。また、構造体のメンバの順序は、被準備文の動的パラメタの順序に対応します。

・ それぞれの列に対応するメンバの型は、列の型に対して指定可能でなければなりません。

・ 構造体のメンバを指定する場合は、メンバの型で宣言されたホスト変数と同様に使用することができます。

・ 構造体を定義する場合に、メンバとして構造体を指定することはできません。

構造体ホスト変数の使用方法

データを構造体ホスト変数で取得する例

#include <stdio.h>

#include <string.h>

EXEC SQL BEGIN DECLARE SECTION

char SQLSTATE[6];

char SQLMSG[256];

struct { …… (1)

long num;

char name[21];

char atta[41];

short year;

} data;

short number;

EXEC SQL END DECLARE SECTION;

short main()

{

/* データの取得 */

EXEC SQL SELECT * INTO :data …… (2)

FROM SCH01.TBL01

WHERE NUMBER = :number;

return 1;

}

(1) 構造体型のホスト変数を宣言します。

(2) 該当するデータを取得します。

ポインタ宣言した構造体変数を使用する例

short get_10_data( void * );

short set_10_data( void * );

EXEC SQL BEGIN DECLARE SECTION;

struct _tbl { …… (1)

- 60 -

short number;

SQL TYPE IS BLOB(10K) image1;

SQL TYPE IS BLOB(10K) image2;

};

EXEC SQL END DECLARE SECTION;

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

EXEC SQL END DECLARE SECTION;

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 SQL BEGIN DECLARE SECTION;

struct _tbl *outdata; …… (5)

EXEC SQL END DECLARE SECTION;

outdata = (struct _tbl *)data0; …… (6)

EXEC SQL SELECT DATANO,IMAGE1,IMAGE2 INTO :outdata …… (7)

FROM SCH01.TBL01;

return 0;

}

short set_10_data( void *data0 )

{

EXEC SQL BEGIN DECLARE SECTION;

struct _tbl *indata; …… (8)

EXEC SQL END DECLARE SECTION;

indata = (struct _tbl *)data0; …… (9)

EXEC SQL UPDATE SCH01.TBL01 SET IMAGE = :indata->image1 …… (10)

WHERE DATANO = :indata->number;

return 0;

}

(1) 構造体の型を宣言します。

(2) 領域を取得します。

(3) データ領域をデータ取得関数のパラメタに設定し、関数を呼びます。

(4) データ領域をデータ設定関数のパラメタに設定し、関数を呼びます。

(5) 構造体型のホスト変数を定義します。

(6) ホスト変数に領域のアドレスを設定します。

(7) データを取得します。

(8) 構造体型のホスト変数を定義します。

- 61 -

(9) ホスト変数に領域のアドレスを設定します。

(10) データを更新します。

標識変数の使用方法

構造体ホスト変数を使用する場合、標識変数は以下のようになります。

構造体標識変数

short型のメンバを持ち、構造体として宣言した変数を、標識変数として指定します。

- メンバはすべてshort型でなければなりません。

- メンバの数はホスト変数のメンバの数と同じでなければなりません。

- 標識変数のメンバの順序は、ホスト変数のメンバの順序に対応します。

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[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 SQL END DECLARE SECTION;

EXEC SQL SELECT COL01, COL02, COL03, COL04

INTO :data :indi

FROM SCH01.TBL01

WHERE DATANO = 1;

(1)のメンバに対応する標識変数は(5)になります。

同様に(2)-(6)、(3)-(7)、(4)-(8)が対応します。

配列指定の標識変数

short型の配列指定の変数1つをメンバとする構造体型の変数を標識変数とし、配列の要素数はホスト変数のメンバ

数と同じとします。

- メンバはshort型でなければなりません。

- メンバの配列数はホスト変数のメンバの数と同じでなければなりません。

- 標識変数の配列の順序は、ホスト変数のメンバの順序に対応します。

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

struct {

long col1; (1)

char col2[21]; (2)

char col3[41]; (3)

short col4; (4)

} data;

struct {

- 62 -

short ind[4]; (5)

} indi;

EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT COL01, COL02, COL03, COL04

INTO :data :indi

FROM SCH01.TBL01

WHERE DATANO = 1;

(1)のメンバに対応する標識変数は(5)のindi.ind[0]です。

同様に(2)-indi.ind[1]、(3)-indi.ind[2]、(4)-indi.ind[3]が対応します。

複数行の一括挿入

配列指定された構造体型のホスト変数または、構造体型のホスト変数のポインタを使用することで、INSERT文により複

数行のデータを一括挿入することができます。

複数行の一括挿入:(1)配列指定された構造体型を利用

以下の方法で、複数行を一括挿入する例を示します。

- 挿入データとして、配列指定された構造体型のホスト変数を指定

- 構造体のメンバには配列指定を含めることはできません。ただし、文字列型の1次元配列は指定可能です。

- 挿入する行数をINSERT文のFOR句に指定します。

- 標識変数を指定することはできません。

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

struct {

short col1;

short col2;

VARCHAR col3[10];

VARCHAR col4[10];

} data[5];

short rowcount;

EXEC SQL END DECLARE SECTION;

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, "SHIZUOKA" );

data[1].col3.sqllen = strlen( data[1].col3.sqlvar );

strcpy( data[1].col4.sqlvar, "MISHIMA" );

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 );

strcpy( data[4].col4.sqlvar, "YOKOHAMA" );

data[4].col4.sqllen = strlen( data[4].col4.sqlvar );

- 63 -

rowcount = 5;

EXEC SQL INSERT INTO SCH1.TBL1( COL01, COL02, COL03, COL04 )

VALUES( :data ) FOR :rowcount;

複数行の一括挿入:(2)構造体のポインタ型を利用

以下の方法で、複数行を一括挿入する例を示します。

- 挿入データとして、構造体のポインタ型のホスト変数を指定

- 構造体のメンバには配列指定を含めることはできません。ただし、文字列型の1次元配列は指定可能です。

- 挿入する行数をINSERT文のFOR句に指定します。

- 標識変数を指定することはできません。

- INSERT文のFOR句に指定した値と実際のデータ個数を必ず一致させてください。

- INSERT文のVALUES句にデータのポインタを正しく設定してください。

EXEC SQL BEGIN DECLARE SECTION;

struct _tbl{

short col1;

short col2;

CHAR col3[5];

CHAR col4[5];

};

char SQLSTATE[6];

char SQLMSG[256];

EXEC SQL END DECLARE SECTION;

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;

}

short insert_dat( struct _tbl *data, short data_count)

- 64 -

{

EXEC SQL BEGIN DECLARE SECTION;

struct _tbl *indata;

short rowcount;

EXEC SQL END DECLARE SECTION;

indata = data;

rowcount = data_count;

EXEC SQL CONNECT TO DEFAULT;

EXEC SQL DELETE FROM ST1.TBL4;

EXEC SQL INSERT INTO ST1.TBL4(COL01, COL02, COL03, COL04)

VALUES (:indata) FOR :rowcount;

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT ALL;

return 0;

}

3.1.10 BLOB型のコンパイル時の展開方法

ここでは、BLOB型をSQL上で指定する方法について説明します。ホスト変数は、BLOB型を持つ列に代入する値として

指定することができます。

ホスト変数は、以下の形式でホストプログラム内に定義する必要があります。

SQL TYPE IS BLOB(<長さ><単位>) 変数名;

<長さ>:以下の範囲の任意の整数を設定

単位がK の場合:1 ~ 2097152

単位がM の場合:1 ~ 2048

単位がG の場合:1 ~ 2

<単位>:K(キロバイト)、M(メガバイト)、G(ギガバイト)

ただし、コンパイル時には、以下のような構造体形式に変換します。Cプログラムは、変換された構造体の変数でデータ

操作を行います。

参照

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

[32ビットで実行するSQL埋込みCプログラムをコンパイルする場合]

アプリケーション中に以下のように宣言します。

SQL TYPE IS BLOB (1K) area;

↓ コンパイル時に構造体に変換します。

struct{

long area_reserved;

unsigned long area_length;

char area_data[1024];

}area;

[64ビットで実行するSQL埋込みCプログラムをコンパイルする場合]

- 65 -

アプリケーション中に以下のように宣言します。

SQL TYPE IS BLOB (1K) area;

↓ コンパイル時に構造体に変換します。

struct{

int area_reserved;

unsigned int area_length;

char area_data[1024];

}area;

3.1.11 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:

データに対応する数値(16進数の0から9)

m:

符号(正:16進数のA,C,E,F 負:16進数のB,D)

データ設定の例

EXEC SQL BEGIN DECLARE SECTION;

DECIMAL(5,2) D1;

DECIMAL(6,2) D2;

EXEC SQL END DECLARE SECTION;

精度:5、位取り:2のホスト変数 D1 に123.45を設定する場合

- 66 -

精度:5、位取り:2のホスト変数 D1 に12.34を設定する場合

精度:6、位取り:2のホスト変数 D2 に1234.56を設定する場合

備考. 精度が偶数の場合の先頭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:

データに対応する数値(16進数の0から9)

mm:

符号(正:16進数の2B 負:16進数の2D)

データ設定の例

EXEC SQL BEGIN DECLARE SECTION;

NUMERIC(5,2) N1;

EXEC SQL END DECLARE SECTION;

精度:5、位取り:2のホスト変数 N1 に123.45を設定する場合

- 67 -

精度:5、位取り:2のホスト変数 N1 に12.34を設定する場合

3.1.12 拡張SQL文識別子を使用した動的SQL文の実行方法

ここでは、拡張SQL文識別子を使用した動的SQL文の実行方法について説明します。

拡張SQL文識別子

拡張SQL文識別子は、文字列型のホスト変数で指定し、アプリケーションの実行時に値を動的に設定します。

拡張SQL文識別子は、以下のSQL文に指定できます。

・ ALLOCATE CURSOR文

・ DEALLOCATE PREPARE文

・ DESCRIBE文

・ EXECUTE文

・ PREPARE文

拡張SQL文識別子の使用方法

拡張SQL文識別子を使用すると、ホスト変数を指定することにより被準備文の名前を実行時に動的に指定することが

可能になるため、PREPARE文やEXECUTE文など、被準備文の名前を指定するSQL文をまとめることができます。

そのため、多数の被準備文を使用するアプリケーションでも、開発量の削減を実現できます。

拡張SQL識別子ではなくSQL文識別子を使用すると、被準備文の名前をSQL文中に識別子として文字列で指定す

るため、複数のSQL文を準備する場合は、準備するSQL文の数だけPREPARE文を記述する必要があります。

また、各被準備文を実行する場合は、個々のSQL文識別子ごとにEXECUTE文などのSQL文を記述しなければなり

ません。

そのため、多数の被準備文を使用するアプリケーションは、その開発規模が大きくなってしまいます。

拡張SQL文識別子を使用した場合とSQL文識別子を使用した場合で、複数の被準備文を実行する例を以下に示し

ます。

例1

拡張SQL文識別子を使用して複数の被準備文を実行する例を以下に示します。

:

for ( loop=0; loop<nn; loop++ ) {

EXEC SQL PREPARE :cmd FROM :strsql; (1)

}

:

for ( loop=0; loop<nn; loop++ ) {

EXEC SQL EXECUTE :cmd; (2)

}

:

(1)拡張SQL文識別子を使用して、ループによりnn個の準備可能文を準備します。

(2)拡張SQL文識別子を使用して、ループによりnn個の被準備文を実行します。

例2

SQL文識別子を使用して複数の被準備文を実行する例を以下に示します。

:

EXEC SQL PREPARE CMD1 FROM :strsql; (1)

- 68 -

EXEC SQL PREPARE CMD2 FROM :strsql; (1)

EXEC SQL PREPARE CMD3 FROM :strsql; (1)

:

:

EXEC SQL PREPARE CMDnn FROM :strsql; (1)

:

EXEC SQL EXECUTE CMD1; (2)

EXEC SQL EXECUTE CMD2; (2)

EXEC SQL EXECUTE CMD3; (2)

:

:

EXEC SQL EXECUTE CMDnn; (2)

:

(1)SQL文識別子CMD1~CMDnnまでに対応するSQL文を準備します。

(2)SQL文識別子CMD1~CMDnnまでに対応する被準備文を実行します。

拡張SQL文識別子の有効範囲

拡張SQL文識別子の有効範囲はセションになります。そのため複数のコンパイル単位にまたがって使用することがで

き、拡張SQL文識別子を使用するSQL文ごとにカプセル化し、共有することが可能です。

複数のコンパイル単位にまたがって拡張SQL文識別子を使用する例を以下に示します。パラメタcommand_nameに'CMD1'が指定されたとします。

sub_pre.sc

short sub_prep( char *command_name )

{

:

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR cmd1[36];

VARCHAR strsql[256];

EXEC SQL END DECLARE SECTION;

:

strcpy(cmd1.sqlvar, command_name);

cmd1.sqllen = strlen(cmd1.sqlvar);

EXEC SQL PREPARE :cmd1 FROM :strsql; (1)

:

}

(1)拡張SQL文識別子cmd1を使用して、実行するSQL文を準備します。被準備文の名前は“CMD1”になりま

す。

sub_exec.sc

short sub_exec( char *command_name )

{

:

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR cmd1[36];

EXEC SQL END DECLARE SECTION;

:

strcpy(cmd1.sqlvar, command_name);

cmd1.sqllen = strlen(cmd1.sqlvar);

EXEC SQL EXECUTE :cmd1 USING SQL DESCRIPTOR 'DESC1'; (1)

:

}

(1)名前が“CMD1”の被準備文を実行します。

- 69 -

3.1.13 拡張カーソル名を使用したカーソル操作

ここでは、拡張カーソル名で指定されたカーソルの使用方法について説明します。

拡張カーソル

ALLOCATE CURSOR文を使用して宣言したカーソルを拡張カーソルといいます。

拡張カーソルは、ALLOCATE CURSOR文に拡張カーソル名および拡張SQL文識別子を指定して定義します。拡張カー

ソル名は、文字列型のホスト変数を使用して定義し、アプリケーションの実行時に値を動的に設定します。

拡張カーソル名は、以下のSQL文に指定できます。

・ ALLOCATE CURSOR文

・ 動的CLOSE文

・ 動的DELETE文:位置づけ

・ 動的FETCH文

・ 動的OPEN文

・ 動的UPDATE文:位置づけ

拡張カーソル名の使用方法

拡張カーソル名を使用すると、ホスト変数を指定することによりカーソルの名前を実行時に動的に指定することが可

能になるため、複数のカーソルを宣言する場合にカーソル宣言をまとめることができます。

そのため、多数のカーソルを操作するアプリケーションでも、開発量の削減を実現できます。

拡張カーソル名ではなくカーソル名を使用すると、カーソルの名前をSQL文中に識別子として文字列で指定するた

め、複数のカーソルを宣言する場合は、使用するカーソルの数だけカーソル宣言を記述する必要があります。

また、カーソルを操作する場合は、個々のカーソル名を記述したSQL文を記述しなければなりません。

そのため、多数のカーソルを使用するアプリケーションは、その開発規模が大きくなってしまいます。

拡張カーソル名を使用した場合とカーソル名を使用した場合で、複数のカーソルを宣言する例を以下に示します。

例1

拡張カーソル名を使用して、複数のカーソルを宣言する例を示します。

:

for ( loop=0; loop<nn; loop++ ) {

EXEC SQL PREPARE :cmd FROM :strsql; (1)

EXEC SQL ALLOCATE :cur1 CURSOR FOR :cmd1; (2)

}

:

(1)拡張SQL文識別子を使用して、ループによりnn個の準備可能文を準備します。

(2)拡張カーソル名を使用して、ループによりnn個のカーソルを宣言します。

例2

カーソル名を使用して、複数のカーソルを宣言する例を示します。

:

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR strsql[256];

EXEC SQL END DECLARE SECTION;

:

EXEC SQL PREPARE CMD1 FROM :strsql; (1)

EXEC SQL PREPARE CMD2 FROM :strsql; (1)

EXEC SQL PREPARE CMD3 FROM :strsql; (1)

:

:

EXEC SQL PREPARE CMDnn FROM :strsql; (1)

- 70 -

:

EXEC SQL DECLARE CUR1 CURSOR FOR CMD1; (2)

EXEC SQL DECLARE CUR2 CURSOR FOR CMD2; (2)

EXEC SQL DECLARE CUR3 CURSOR FOR CMD3; (2)

:

:

EXEC SQL DECLARE CURnn CURSOR FOR CMDnn; (2)

:

:

:

(1)SQL文識別子CMD1~CMDnnを定義します。

(2)SQL文識別子CMD1~CMDnnに対し、カーソルCUR1~CURnnを宣言します。

拡張カーソル名の有効範囲

拡張カーソル名の有効範囲はセションになります。

そのため複数のコンパイル単位にまたがって使用することができ、拡張カーソル名を使用するSQL文ごとにカプセル

化し、共有することが可能です。

複数のコンパイル単位にまたがった拡張カーソルの使用例を示します。パラメタcursor_nameに'CUR1'が指定され

たとします。

sub_pre.sc

short sub_pre( char *command_name )

{

:

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR cmd1[36];

VARCHAR strsql[256];

EXEC SQL END DECLARE SECTION;

:

strcpy(cmd1.sqlvar, command_name);

cmd1.sqllen = strlen(cmd1.sqlvar);

EXEC SQL PREPARE :cmd1 FROM :strsql; (1)

:

}

(1)ホスト変数cmd1を使用して拡張SQL文識別子を定義します。

sub_alloc_cur.sc

short sub_alloc_cur( char *command_name, char *cursor_name )

{

:

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR cur1[36];

VARCHAR cmd1[36];

EXEC SQL END DECLARE SECTION;

:

strcpy(cmd1.sqlvar, command_name);

cmd1.sqllen = strlen(cmd1.sqlvar);

strcpy(cur1.sqlvar, cursor_name);

cur1.sqllen = strlen(cur1.sqlvar);

EXEC SQL ALLOCATE :cur1 CURSOR FOR :cmd1; (1)

:

(1)拡張カーソル名cur1と拡張SQL文識別子cmd1を使用して拡張カーソルを宣言します。

- 71 -

sub_open.sc

short sub_open( char *cursor_name )

{

:

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR cur1[36];

EXEC SQL END DECLARE SECTION;

:

strcpy(cur1.sqlvar, cursor_name);

cur1.sqllen = strlen(cur1.sqlvar);

EXEC SQL OPEN :cur1; (1)

:

(1)拡張カーソルCUR1をオープンします。

3.2 SQL埋込みCOBOLプログラムの作成方法

アプリケーションのコーディングは、データベースを処理する部分をSQL文で、そのほかの部分を利用する言語で記述し

ます。利用可能な言語には、C言語およびCOBOL言語があります。SQL文を含むCOBOL言語で作成されたアプリケー

ションをSQL埋込みCOBOLプログラムと呼びます。

本節では、SQL埋込みCOBOLプログラムの作成方法について説明します。

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

アプリケーションのコーディングは、データベースを処理する部分をSQL文で、そのほかの部分を利用する言語で記述し

ます。以下にアプリケーションのコーディング規則について説明します。

SQL埋込みCOBOLプログラム

COBOLプログラムの中にSQL文を組み込んだアプリケーションを、SQL埋込みCOBOLプログラムと呼びます。SQL文は、図3.4 SQL文のコーディング形式(SQL埋込みCOBOLプログラム)に示すように“EXEC SQL”および“END-EXEC”ではさんで指定します。

“EXEC SQL”、SQL文および“END-EXEC”はB領域に書きます。固定形式のCOBOLプログラムの場合は、ステートメン

トの第12カラムから第72カラムの間がB領域になります。可変形式のCOBOLプログラムの場合は、第12カラムからそのレ

コードの 後までがB領域になります。

図3.4 SQL文のコーディング形式(SQL埋込みCOBOLプログラム)

SQL文の指定例を以下に示します。ゴシック部がSQL文です。

- 72 -

例1

埋込みSQL宣言節の例

EXEC SQL BEGIN DECLARE SECTION END-EXEC.

例2

FETCH文の例

EXEC SQL FETCH CU1 INTO :GNO, :GOOD, :QOH END-EXEC.

参照

また、SQL文の継続(行のつながり)の規則は、COBOLの正書法の規則に準じます。

COBOLの正書法については、“NetCOBOL使用手引書”、“COBOL97使用手引書”または“COBOL文法書”を参照し

てください。

3.2.2 SQL文の指定位置および指定順序

アプリケーション中に埋め込んで使用するSQL文には、実行文と非実行文があります。実行文は、データベースをアクセ

スしたり、トランザクションの制御を行うために使用します。非実行文は、実行文で利用するカーソルの宣言やホスト変数

の宣言、例外条件発生時の動作を定義します。非実行文は、アプリケーションの実行対象にはなりません。したがって、

アプリケーション中のGOTO文などによる制御の影響を受けません。

なお、SQL文の使用範囲については、“付録D SQL文の使用範囲”を参照してください。

SQL文の一覧を以下に示します。

表3.2 SQL文

分類 SQL文 備考

非カーソル系データ操作

単一行SELECT文

実行文UPDATE文:探索

INSERT文

DELETE文:探索

カーソル系データ操作

カーソル宣言(DECLARECURSOR)

非実行文

OPEN文

実行文

CLOSE文

FETCH文

UPDATE文:位置づけ

DELETE文:位置づけ

動的SQL文

ALLOCATE DESCRIPTOR文

実行文

DEALLOCATEDESCRIPTOR文

DESCRIPTOR取得文

DESCRIPTOR設定文

PREPARE文

DEALLOCATE PREPARE文

- 73 -

分類 SQL文 備考

DESCRIBE文

EXECUTE文

EXECUTE IMMEDIATE文

動的カーソル宣言 非実行文

動的OPEN文

実行文

動的FETCH文

動的CLOSE文

動的DELETE文:位置づけ

動的UPDATE文:位置づけ

ストアドプロシジャ CALL文 実行文

トランザクション制御文

COMMIT文

実行文ROLLBACK文

SET TRANSACTION文

コネクション管理文

CONNECT文

実行文SET CONNECTION文

DISCONNECT文

セション管理文

SET CATALOG文

実行文SET SCHEMA文

SET SESSIONAUTHORIZATION文

表宣言 表宣言 非実行文

埋込み例外宣言 WHENEVER文 非実行文

埋込みSQL宣言節BEGIN DECLARE SECTION

非実行文END DECLARE SECTION

資源操作文 RELEASE TABLE文 実行文

利用者制御文 SET USER PASSWORD文 実行文

アクセス制御文 SET ROLE文 実行文

SQL埋込みCOBOLプログラムでの、SQL文の指定位置について説明します。

埋込みSQL宣言節の指定位置

埋込みSQL宣言節は、ホスト変数を定義するためのものです。埋込みSQL宣言節は、DATA DIVISIONの作業場所節

(WORKING-STORAGE SECTION)またはLINKAGE SECTIONに記述します。また、ホスト変数の変数名は、COBOLプログラムソース上で、“SQL”以外で始まる名前で命令し、一意にする必要があります。

ホスト変数の宣言

ホスト変数は、アプリケーションとデータベースの間でデータの受渡しをするのに使用する変数です。すなわち、アプ

リケーションで参照するデータをデータベースから取り出すため、または逆に、アプリケーションで設定したデータを

データベースに格納するために、SQL文に指定する変数です。

ホスト変数の宣言は、埋込みSQL宣言節で行います。宣言の記述方法そのものは、COBOLでの変数の宣言と同じ

です。ホスト変数の宣言の例を以下に示します。

- 74 -

図3.5 ホスト変数宣言の例(SQL埋込みCOBOLプログラム)

状態変数の宣言

状態変数は、処理結果の状態をアプリケーションに伝えるための変数です。状態変数には状態コードが設定されま

す。状態コードは、処理が正常に完了した、または処理中になんらかの例外条件が発生したという状態を表します。

状態変数の変数名は“SQLSTATE”です。

SQLSTATEは長さ5桁の文字列型(01 SQLSTATE PIC X(5))の変数であり、埋込みSQL宣言節で宣言します。埋込

みSQLを使用するアプリケーション中では、状態変数を必ず宣言します。

メッセージ変数の宣言

メッセージ変数は、処理結果をメッセージとしてアプリケーションに伝えるための変数です。メッセージ変数の変数名

は“SQLMSG”です。

SQLMSGは固定長文字列型の変数であり、埋込みSQL宣言節で宣言します。メッセージ変数の宣言のしかたを以下

に示します。

01 SQLMSG PIC X(n)

n:メッセージ変数の長さ(バイト数)です。

1以上32692以下の値を指定します。

1以上32000以下の値を指定します。

メッセージ変数にメッセージが設定される際の規則を以下に示します。

- 設定されるメッセージは1つだけです。

- メッセージの長さがメッセージ変数の長さ(n)を超える場合、メッセージの先頭からn文字分設定されます。

- メッセージ変数のメッセージのうしろの領域は空白パディングされます。

カーソル宣言の指定位置

カーソル宣言は、PROCEDURE DIVISION節内に記述します。ただし、宣言したカーソル名を参照するカーソル系の

SQL文よりソースファイル上で先行して記述します。なお、カーソル名は、COBOLプログラムソース上で一意にすることが

必要です。

埋込み例外宣言の指定位置

埋込み例外宣言は、PROCEDURE DIVISIONに記述します。埋込み例外宣言の意味と有効範囲については、“3.2.4SQL文の処理結果の確認”で説明します。

実行文の指定位置

データ操作文やトランザクション制御文などの実行文は、PROCEDURE DIVISIONに記述します。

- 75 -

INCLUDE文の指定位置

アプリケーション中にINCLUDE文を指定することができます。インクルードファイルには、SQL文およびCOBOLの言語テ

キストを記述できます。インクルードファイルに、ホスト変数および状態変数の宣言を格納しておくことにより、複数のアプ

リケーションで共通に使用する変数をまとめて宣言することができます。

INCLUDE文に指定するファイル名

INCLUDE文には、以下のファイル名を指定してください。

- インクルードファイル名から拡張子“.COBOL”を除いたファイル名

- インクルードファイル名

インクルードファイルの検索優先順位

INCLUDE文が指定された場合、インクルードファイルは、以下の順番に検索されます。

1. 指定されたファイル名に、拡張子“.COBOL”を付加したファイル名

2. 指定されたファイル名

表宣言

表宣言は、スキーマ名の修飾をしない表名を定義する宣言文です。表宣言で定義した表名を、それ以降のSQL文で記

述する場合、スキーマ名を省略することができます。INCLUDE文と表宣言の例を以下に示します。

[インクルードファイル“HOSTVAR”]

01 SQLSTATE PIC X(5).

01 STOCK PIC S9(9) BINARY.

[SQL埋込みCOBOLプログラム]

EXEC SQL BEGIN DECLARE SECTION END-EXEC.

EXEC SQL INCLUDE HOSTVAR END-EXEC.

EXEC SQL END DECLARE SECTION END-EXEC.

PROCEDURE DIVISION.

EXEC SQL DECLARE 在庫表 TABLE ON SCH1 END-EXEC.

EXEC SQL SELECT 在庫数量 INTO :STOCK FROM 在庫表

WHERE 製品番号 = 240 END-EXEC. ↑

スキーマ名修飾省略

DISPLAY "在庫数量 = " STOCK.

STOP RUN.

3.2.3 ホスト変数および標識変数の指定方法

ホスト変数は、アプリケーションとデータベースの間でデータの受渡しをするのに使用する変数です。SQL文中でホスト

変数と対にして指定し、データの内容がNULL値かどうかを表すために使用する変数を、標識変数と呼びます。アプリ

ケーションで参照するデータをデータベースから取り出す場合、標識変数には、取り出したデータがNULL値かどうかを

表す情報が設定されます。逆に、アプリケーションで設定したデータをデータベースに格納する場合には、標識変数に

は、格納するデータがNULL値かどうかを表す情報を設定しておきます。標識変数は、埋込みSQL宣言節で宣言しま

す。宣言の記述方法はホスト変数と同じです。なお、標識変数のデータ型はSMALLINTに対応するデータ型であること

が必要です。

参照

各ホスト言語でのデータ型と、SQLのデータ型との対応については、“SQLリファレンス”を参照してください

ホスト変数および標識変数をSQL文中に指定する場合には、変数の前にコロン“:”を付けて指定します。以下にその指

定例を示します(ゴシック部がホスト変数または標識変数です)。ただし、SQL文以外の、COBOLステートメント中では、一

般のCOBOLの変数と同じで、コロン“:”は付けません。

標識変数には、SQL文の処理結果が以下のように格納されます。

- 76 -

・ 取り出すデータがNULL値の場合、標識変数には、-1が格納されます。

・ 取り出すデータのデータ型が文字列または各国語文字列で、かつNULL値ではなく、取り出すデータの長さが相手

指定の文字列または各国語文字列の長さよりも長い場合は、取り出すデータの有効な長さが標識変数に格納され

ます。

・ 上記以外の場合は、標識変数に0が格納されます。

なお、標識変数を指定していない場合、取り出すデータがNULL値になると、SQL文の処理はエラーになります。

例1

ホスト変数の指定例

STOCKおよびHOUSEをホスト変数、QFLAGをSTOCKの標識変数、そして、WFLAGをHOUSEの標識変数として指

定します。SQL文中にホスト変数および標識変数を指定する場合は、コロン“:”を付けます。

EXEC SQL SELECT 在庫数量,倉庫番号

INTO :STOCK INDICATOR :QFLAG,

:HOUSE INDICATOR :WFLAG

FROM 在庫表 WHERE 製品番号 = 110 END-EXEC.

例2

SQL文以外のCOBOLステートメント上のホスト変数の指定例

STOCKをホスト変数、QFLAGをSTOCKの標識変数として使用しています。COBOLステートメントでは、これらの変数

にコロン“:”は付けません。

EXEC SQL FETCH CU1 INTO :STOCK INDICATOR :QFLAG END-EXEC.

IF QFLAG = -1 GO TO P-NULL.

IF STOCK = 0 GO TO P-LOOP.

3.2.4 SQL文の処理結果の確認

アプリケーションはSQL文を実行したあと、実行結果を確認して処理を進めて行くことが必要です。このSQL文の実行結

果を確認する方法には、以下の2通りがあります。

a. 状態変数およびメッセージ変数を使用する場合

b. 埋込み例外宣言(WHENEVER文)を使用する場合

状態変数およびメッセージ変数を使用する場合

SQL文の実行結果は、各SQL文の実行ごとに、状態変数SQLSTATEおよびメッセージ変数SQLMSGに通知されます。

アプリケーションでは、その値を判定しながら処理を進めます。

SQLSTATEおよびSQLMSGは、あらかじめ埋込みSQL宣言節で宣言しておく必要があります。宣言の詳細は、“状態変

数の宣言”および“メッセージ変数の宣言”を参照してください。

SQLSTATEおよびSQLMSGを使用したSQL文の実行結果の確認方法は、“B.4 状態変数およびメッセージ変数の使用

例”を参照してください。

参照

SQLSTATEに通知される値とその意味は、“アプリケーション開発ガイド(共通編)”を参照してください。また、SQLMSGに通知される内容は、“メッセージ集”を参照してください。

埋込み例外宣言(WHENEVER文)を使用する場合

埋込み例外宣言は、SQL文が例外条件を生じた場合に実行する処理を指定するSQL文です。これにより、SQL文の実

行ごとに、実行結果をチェックする必要がなくなります。埋込み例外宣言の指定例を以下に示します。

- 77 -

例1

データなし以外のエラーが発生した場合には、ERR001へ進むことを指定します。

EXEC SQL WHENEVER SQLERROR GOTO :ERR001 END-EXEC.

(1) (2)

(1) 条件

(2) 例外動作

例2

検索の結果データが見つからない場合に、処理をそのまま続行することを指定します。

EXEC SQL WHENEVER NOT FOUND CONTINUE END-EXEC.

(1) (2)

(1) 条件

(2) 例外動作

条件は、以下の2通りの指定ができます。

NOT FOUND:

検索データが見つからない場合に指定の例外動作を行います。

SQLERROR:

“検索データが見つからない”以外のエラーが発生した場合に指定の例外動作を行います。

例外動作は、以下の2通りの指定ができます。

CONTINUE:

次のステートメントに進みます。

GOTO <行き先>:

行き先で指定のステートメントに進みます。ここで、<行き先>は、制御を移す先の節名(セクション名)または段落

名(パラグラフ名)の前にコロン“:”を付けて指定します。

例3

SQL埋込みCOBOLプログラムで、SQL文にエラーが発生した場合には、P-ERRORへ進み、変数RCODEに8を設定

することを指定します。

EXEC SQL WHENEVER SQLERROR GOTO :P-ERROR END-EXEC.

P-ERROR.

MOVE 8 TO RCODE.

WHENEVER文は複数個宣言することができます。条件の同じWHENEVER文を指定した場合、アプリケーション中

での記述順序であとの宣言が有効になります。実行の順序とは関係ありません。

WHENEVER文の有効範囲の例を以下に示します。

- 78 -

図3.6 WHENEVER文を使用したアプリケーションの例

(1) 状態変数“SQLSTATE”およびメッセージ変数“SQLMSG”を宣言します。

(2) SQL文の実行でNOT FOUND以外のエラーが生じた場合にP-ERRORへ進み、エラー情報を出力し、プログラム

は終了します。

(3) カーソル“CU1”の操作でNOT FOUND(検索データが見つからない)が生じた場合にP-NEXTへ進み、カーソル

“CU1”のクローズと在庫数量の出力を行います。

(4) カーソル“CU2”の操作でNOT FOUND(検索データが見つからない)が生じた場合にP-ENDへ進み、カーソル

“CU2”のクローズと発注数量の出力を行い、プログラムは終了します。

3.2.5 可変長文字列のデータ操作

可変長文字列データを操作する場合は、文字列の長さが必要です。このため、データ操作を行うホスト変数は、可変長

文字列の長さをもつ符号付き2進項目と、文字列自身をもつ英数字項目からなる集団項目の形式で定義します。

また、日本語可変長文字列のデータ操作も同様に行えます。

- 79 -

詳細は、“B.1 可変長文字列のデータ操作例”を参照してください。

3.2.6 BLOB型のコンパイル時の展開方法

ここでは、BLOB型をSQL上で指定する方法について説明します。ホスト変数は、BLOB型を持つ列に代入する値として

指定することができます。

ホスト変数は、以下の形式でホストプログラム内に定義する必要があります。

01 変数名 SQL TYPE IS BLOB(<長さ><単位>).

<長さ>:1 ~2Gの任意の整数を設定

単位がK の場合:1 ~2097152

単位がM の場合:1 ~2048

単位がG の場合:1 ~2

<単位>:K(キロバイト)、M(メガバイト)、G(ギガバイト)

ただし、コンパイル時には、以下のような集団項目形式に変換します。COBOLプログラムは、変換された集団項目の変

数でデータ操作を行います。

参照

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

アプリケーション中に以下のように宣言します。

01 AREA SQL TYPE IS BLOB (1K).

↓ コンパイル時に集団項目に変換します。

01 AREA.

49 AREA-RESERVED PIC S9(9)

USAGE IS BINARY.

49 AREA-LENGTH PIC S9(9)

USAGE IS BINARY.

49 AREA-DATA PIC X(1024).

3.2.7 集団項目ホスト変数の記述方法

データベースの複数列を集団項目として操作できるホスト変数を、集団項目ホスト変数と呼びます。集団項目ホスト変数

を宣言すると、集団項目に属する基本項目が、データベースの各列に対応するように扱われます。このとき、標識変数を

使用する場合は、集団項目繰り返し標識変数を宣言します。集団項目ホスト変数に対応した標識変数定義を繰り返し記

述できます。集団項目ホスト変数を指定する場合は、コンパイルオプションに-Gを指定する必要があります。

集団項目ホスト変数は、繰り返し指定ができます。集団項目ホスト変数に繰り返し指定を指定する場合は、コンパイルオ

プションに-E1を指定する必要があります。なお、-Gは省略できます。

集団項目ホスト変数をINSERT文に指定することにより、複数の行を一括して挿入することができます。

なお、集団項目ホスト変数や集団項目繰り返しホスト変数の宣言中に、別の集団項目ホスト変数や集団項目繰り返しホ

スト変数を入れ子で宣言することはできません。

以下に、コンパイルオプションの指定例と、集団項目ホスト変数の使用例を示します。

集団項目指定

例1

集団項目を指定する場合のコンパイルオプションの指定例

Solaris/Linuxの場合

sqlcobol -G demo09main.scob -M -o ../bin/demo09 demo09sub.o

- 80 -

Windows(R)の場合

sqlcobol -G demo09main.scob -M -o ..\bin\demo09.exe demo09sub.obj

例2

集団項目ホスト変数の使用例

WORKING-STORAGE SECTION.

EXEC SQL BEGIN DECLARE SECTION.

01 SQLSTATE PIC X(5).

01 SQLMSG PIC X(255).

01 G1.

02 HOST1 PIC S9(4) BINARY. …… (1)

02 HOST2 PIC N(10). …… (2)

02 HOST3 PIC S9(9) BINARY. …… (3)

02 HOST4 PIC S9(4) BINARY. …… (4)

01 G2.

02 IND PIC S9(4) BINARY OCCURS 4. …… (5)

EXEC SQL END DECLARE SECTION.

PROCEDURE DIVISION.

* 変数初期化

INITIALIZE SQLSTATE.

INITIALIZE SQLMSG.

INITIALIZE G1.

INITIALIZE G2.

* SQL呼出し

EXEC SQL SELECT COL1, COL2, COL3, COL4 INTO :G1 :G2 FROM S.T1 …… (6)

WHERE COL1= 100 END-EXEC.

*

DISPLAY "COL1=" HOST1.

DISPLAY "IND= " IND(1).

DISPLAY "COL2=" HOST2.

DISPLAY "IND= " IND(2).

DISPLAY "COL3=" HOST3.

DISPLAY "IND= " IND(3).

DISPLAY "COL4=" HOST4.

DISPLAY "IND= " IND(4).

(1)~(4) 集団項目ホスト変数“G1”を定義します。

(5) 集団項目繰り返し標識変数を定義します。

(6) 集団項目ホスト変数“G1”の各基本項目に対して、単一行SELECT文で、データベースからデータを取り出しま

す。

集団項目繰り返し指定

集団項目繰り返し指定を利用することで、複数行のデータを一括挿入できます。

例1

集団項目繰り返しホスト変数のコンパイルオプションの指定例

Solaris/Linuxの場合

sqlcobol -E1 demo09main.scob -M -o ../bin/demo09 demo09sub.o

Windows(R)の場合

sqlcobol -E1 demo09main.scob -M -o ..\bin\demo09 demo09sub.obj

- 81 -

例2

集団項目繰り返しホスト変数および複数行の一括挿入の使用例

WORKING-STORAGE SECTION.

EXEC SQL BEGIN DECLARE SECTION.

01 SQLSTATE PIC X(5).

01 SQLMSG PIC X(255).

01 CTR PIC S9(4) BINARY.

01 G1.

02 G-REP OCCURS 3. …… (1)

03 HOST1 PIC S9(4) BINARY. …… (2)

03 HOST2 PIC X(10). …… (3)

03 HOST3 PIC S9(9) BINARY. …… (4)

03 HOST4 PIC S9(4) BINARY. …… (5)

01 G2.

02 HOST1 PIC S9(4) BINARY.

02 HOST2 PIC X(10).

02 HOST3 PIC S9(9) BINARY.

02 HOST4 PIC S9(4) BINARY.

01 G3.

02 IND PIC S9(4) BINARY OCCURS 4. …… (6)

EXEC SQL END DECLARE SECTION.

PROCEDURE DIVISION.

* 変数初期化

INITIALIZE SQLSTATE.

INITIALIZE SQLMSG.

INITIALIZE G1.

INITIALIZE G2.

INITIALIZE G3.

* 値の設定

PERFORM TEST BEFORE

VARYING CTR FROM 1 BY 1

UNTIL CTR > 3

COMPUTE HOST1 OF G-REP OF G1(CTR) = CTR

END-PERFORM.

*

MOVE "AAA" TO HOST2 OF G-REP OF G1(1).

MOVE "BBB" TO HOST2 OF G-REP OF G1(2).

MOVE "CCC" TO HOST2 OF G-REP OF G1(3).

*

COMPUTE HOST3 OF G-REP OF G1(1) = 11111111.

COMPUTE HOST3 OF G-REP OF G1(2) = 22222222.

COMPUTE HOST3 OF G-REP OF G1(3) = 33333333.

*

COMPUTE HOST4 OF G-REP OF G1(1) = 1111.

COMPUTE HOST4 OF G-REP OF G1(2) = 2222.

COMPUTE HOST4 OF G-REP OF G1(3) = 3333.

* INSERT

EXEC SQL INSERT INTO S.T(COL1,COL2,COL3,COL4) VALUES(:G1.G-REP) FOR 3

…… (7)

END-EXEC.

* カーソル宣言

EXEC SQL DECLARE CU1 CURSOR FOR

SELECT COL1,COL2,COL3,COL4 FROM S.T

WHERE COL1 < 100

END-EXEC.

*

EXEC SQL OPEN CU1 END-EXEC.

*

PERFORM TEST BEFORE

VARYING CTR FROM 1 BY 1

UNTIL CTR > 3

* FETCH

- 82 -

EXEC SQL FETCH CU1 INTO :G2 INDICATOR :G3

END-EXEC

* DISPLAY

DISPLAY "COL1=" HOST1 OF G2

DISPLAY "IND= " IND(1)

DISPLAY "COL2=" HOST2 OF G2

DISPLAY "IND= " IND(2)

DISPLAY "COL3=" HOST3 OF G2

DISPLAY "IND= " IND(3)

DISPLAY "COL4=" HOST4 OF G2

DISPLAY "IND= " IND(4)

END-PERFORM.

(1)~(5) 集団項目繰り返しホスト変数を宣言します。

集団項目ホスト変数“G-REP”に対して、繰り返し“OCCURS 3”を定義します。

(6) 集団項目繰り返し標識変数を宣言します。

(7) 複数行のINSERT文を実行します。

繰り返しの基本項目に値を設定しておいて、集団項目ホスト変数“G-REP”をINSERT文に指定して、複数行のデー

タをデータベースに挿入します。

3.2.8 COBOLプログラム作成時の注意事項

データベースを処理するCOBOLプログラムでは、初期化プログラムの利用はできません。初期化プログラムとは、呼び

出されたときに、常にプログラムを初期状態としたい場合、プログラム名段落に“INITIAL”を指定したプログラムのことで

す。

3.2.9 クラス定義を使用する場合の注意事項

COBOLソース単位がクラス定義(オブジェクト指向プログラミング機能)の場合、アプリケーション作成時の注意事項を以

下に示します。

・ ホスト変数定義はOBJECT定義のデータ部またはOBJECT定義に含まれるメソッド定義のデータ部に記述しなけれ

ばなりません。

・ 複数のオブジェクトメソッドに埋込みSQL文を記述する場合はOBJECT定義のデータ部にSQLSTATEおよびSQLMSGを定義しなければなりません。

・ 埋込みSQL文はOBJECT定義に含まれるメソッド定義の手続き部に記述しなければなりません。

・ OBJECT定義のデータ部にWORKING-STORAGE SECTIONを必ず記述しなければなりません。

・ COBOLソース単位がクラス定義の場合、COBOL97(V40L10)以降でコンパイルしなければなりません。

以下に、クラス定義(オブジェクト指向プログラミング機能)を使用する場合のプログラミング例を示します。

IDENTIFICATION DIVISION.

CLASS-ID. CLASS-NAME.

IDENTIFICATION DIVISION.

FACTORY.

DATA DIVISION.

WORKING-STORAGE SECTION.

01 DATA1 PIC X(5).

PROCEDURE DIVISION.

IDENTIFICATION DIVISION.

METHOD-ID. METHOD-NAME1

DATA DIVISION.

WORKING-STORAGE SECTION.

01 DATA2 PIC X(5).

PROCEDURE DIVISION.

- 83 -

MOVE "AAAAA" TO DATA1

MOVE "11111" TO DATA2

IDENTIFICATION DIVISION.

OBJECT.

DATA DIVISION.

WORKING-STORAGE SECTION.

EXEC SQL BEGIN DECLARE SECTION END-EXEC.

01 SQLSTATE PIC X(5).

01 SQLMSG PIC X(255).

01 HVAR1 PIC S9(4) BINARY.

EXEC SQL END DECLARE SECTION END-EXEC.

01 DATA3 PIC X(5).

PROCEDURE DIVISION.

IDENTIFICATION DIVISION.

METHOD-ID. METHOD-NAME1

DATA DIVISION.

WORKING-STORAGE SECTION.

01 DATA3 PIC X(5).

PROCEDURE DIVISION.

EXEC SQL INSERT INTO S.T VALUES(1,2,3,4,5) END-EXEC.

IDENTIFICATION DIVISION.

METHOD-ID. METHOD-NAME2

DATA DIVISION.

WORKING-STORAGE SECTION.

01 DATA3 PIC X(5).

PROCEDURE DIVISION.

EXEC SQL SELECT C2 INTO :HVAR1 FROM S.T WHERE C1 = 1 END-EXEC.

3.2.10 UNICODEを使用する場合のエンディアンの選択

アプリケーションの文字コード系をUNICODEで動作させる場合、日本語項目の表現形式はUCS-2のリトルエンディアン

形式となります。

以下の富士通COBOL製品を使用した場合、コンパイル時にUCS-2の形式としてビッグエンディアン形式を選択すること

ができます。

・ NetCOBOL Enterprise Edition V8.0以降

レコード順ファイルや相対ファイルを使用して、アプリケーションにデータの入出力を行う場合、ファイルの日本語項目の

表現形式は、アプリケーションのコンパイル時に指定した形式と同じになります。

コンパイル時にUCS-2の形式をビッグエンディアン形式にすることで、レコード順ファイルや相対ファイルのデータがUCS-2のビッグエンディアン形式となり、他のプラットフォームと共通で使用可能となる利点があります。

- 84 -

オプションの指定方法

以下に、UCS-2のビッグエンディアン形式を使用する場合のコンパイル例を示します。

sqlcobolを使用する場合

sqlcobol -RCS BE demoU01main.scob -M -o ../bin/demo01

sqlpcobを使用する場合

sqlpcob -RCS BE demoU01main.scob

cobol -WC,"RCS(UCS2,BE)" -M -o ../bin/demo01 demoU01main.cobol -L/opt/FJSVrdb2b/lib -lsqldrv

注意

プレコンパイルとコンパイルを別々に実行する場合は、COBOLコンパイラにRCSオプションを必ず指定してください。

また、複数のコンパイル単位から構成されるアプリケーションは、すべて同じRCSオプションを指定してコンパイルしてく

ださい

使用例

レコード順ファイルを使用したプログラム例を以下に示します。

コンパイル時にUCS-2の形式をビッグエンディアン形式にすることで、プログラム内にエンディアンを意識した処理を

入れることなく、共通のデータファイルを使用可能になります。

000100 IDENTIFICATION DIVISION.

000200 PROGRAM-ID. R-INS001.

000300 ENVIRONMENT DIVISION.

000400 INPUT-OUTPUT SECTION.

000500 FILE-CONTROL.

000600 SELECT FILE001

000700 ASSIGN TO "./FILE0001".

000800 DATA DIVISION.

000900 FILE SECTION.

001000 FD FILE001.

001100 01 RECORD01.

001200 02 FNCOL01 PIC N(5).

001300 WORKING-STORAGE SECTION.

001400 EXEC SQL BEGIN DECLARE SECTION END-EXEC.

001500 01 SQLSTATE PIC X(5).

001600 01 SQLMSG PIC X(255).

001700 01 HOST1 PIC N(10).

- 85 -

001800 EXEC SQL END DECLARE SECTION END-EXEC.

001900*

002000 PROCEDURE DIVISION.

002100*

002200*

002300* CONNECT

002400 EXEC SQL

002500 CONNECT TO DEFAULT

002600 END-EXEC.

002700 DISPLAY "PTST:SQLMSG : " SQLMSG

002800

002900* SELECT

003000 EXEC SQL

003100 SELECT COL1 INTO :HOST1 FROM S.T1

003200 WHERE COL1= 100

003300 END-EXEC.

003400 DISPLAY "PTST:SQLMSG : " SQLMSG

003500

003600* COMMIT

003700 EXEC SQL

003800 COMMIT WORK

003900 END-EXEC.

004000 DISPLAY "PTST:SQLMSG : " SQLMSG

004100

004200* DISCONNECT

004300 EXEC SQL

004400 DISCONNECT DEFAULT

004500 END-EXEC.

004600 DISPLAY "PTST:SQLMSG : " SQLMSG

004700

004800 OPEN OUTPUT file001.

004900 WRITE RECORD01 FROM HOST1.

005000 CLOSE FILE001.

005100

005200 EXIT PROGRAM.

005300

3.2.11 UNICODEを使用する場合のコード系の選択

アプリケーションの文字コード系をUNICODEで動作させる場合、日本語項目の表現形式はUCS-2のリトルエンディアン

形式となります。

以下の富士通COBOL製品を使用し、かつ、Symfoware ServerがWindows(R)の場合、コンパイル時にUTF-32の形式と

してリトルエンディアン形式またはビッグエンディアン形式を選択することができます。

・ NetCOBOL V11.0以降

オプションの指定方法

以下に、UTF-32のリトルエンディアン形式を使用する場合のコンパイル例を示します。

sqlcobolを使用する場合

sqlcobol -un -RCS UTF32_LE demoU01main.scob -M -o ../bin/demo01

sqlpcobを使用する場合

sqlpcob -un -RCS UTF32_LE demoU01main.scob

cobol -WC,"ENCODE(UTF8,UTF32,LE)" -M demoU01main.cob

- 86 -

注意

プレコンパイルとコンパイルを別々に実行する場合は、COBOLコンパイラにENCODEオプションを必ず指定してくださ

い。

また、複数のコンパイル単位から構成されるアプリケーションは、すべて同じENCODEオプションを指定してコンパイルし

てください。

3.2.12 拡張SQL文識別子を使用した動的SQL文の実行方法

ここでは、拡張SQL文識別子を使用した動的SQL文の実行方法について説明します。

拡張SQL文識別子

拡張SQL文識別子は、文字列型のホスト変数で指定し、アプリケーションの実行時に値を動的に設定します。

拡張SQL文識別子は、以下のSQL文に指定できます。

・ ALLOCATE CURSOR文

・ DEALLOCATE PREPARE文

・ DESCRIBE文

・ EXECUTE文

・ PREPARE文

拡張SQL文識別子の使用方法

拡張SQL文識別子を使用すると、ホスト変数を指定することにより被準備文の名前を実行時に動的に指定することが

可能になるため、PREPARE文やEXECUTE文など、被準備文の名前を指定するSQL文をまとめることができます。

そのため、多数の被準備文を使用するアプリケーションでも、開発量の削減を実現できます。

拡張SQL識別子ではなくSQL文識別子を使用すると、被準備文の名前をSQL文中に識別子として文字列で指定す

るため、複数のSQL文を準備する場合は、準備するSQL文の数だけPREPARE文を記述する必要があります。

また、各被準備文を実行する場合は、個々のSQL文識別子ごとにEXECUTE文などのSQL文を記述しなければなり

ません。

そのため、多数の被準備文を使用するアプリケーションは、その開発規模が大きくなってしまいます。

拡張SQL文識別子を使用した場合とSQL文識別子を使用した場合で、複数の被準備文を実行する例を以下に示し

ます。

例1

拡張SQL文識別子を使用した複数の被準備文を実行するアプリケーション

:

001010 PERFORM VARYING LOOP FROM 1 BY 1 UNTIL LOOP > nn

003010 EXEC SQL PREPARE :cmd FROM :strsql END-EXEC. (1)

000000 END-PERFORM.

:

001010 PERFORM VARYING LOOP FROM 1 BY 1 UNTIL LOOP > nn

003010 EXEC SQL EXECUTE :cmd END-EXEC. (2)

000000 END-PERFORM.

:

(1)拡張SQL文識別子を使用して、ループによりnn個の準備可能文を準備します。

(2)拡張SQL文識別子を使用して、ループによりnn個の被準備文を実行します。

例2

SQL文識別子を使用した複数の被準備文を実行するアプリケーション

- 87 -

:

001000 EXEC SQL PREPARE CMD1 FROM :strsql END-EXEC. (1)

001010 EXEC SQL PREPARE CMD2 FROM :strsql END-EXEC. (1)

001020 EXEC SQL PREPARE CMD3 FROM :strsql END-EXEC. (1)

:

:

001100 EXEC SQL PREPARE CMDnn FROM :strsql END-EXEC. (1)

:

002010 EXEC SQL EXECUTE CMD1 END-EXEC. (2)

002020 EXEC SQL EXECUTE CMD2 END-EXEC. (2)

002030 EXEC SQL EXECUTE CMD3 END-EXEC. (2)

:

:

003010 EXEC SQL EXECUTE CMDnn END-EXEC. (2)

:

(1)SQL文識別子CMD1~CMDnnまでに対応するSQL文を準備します。

(2)SQL文識別子CMD1~CMDnnまでに対応する被準備文を実行します。

拡張SQL文識別子の有効範囲

拡張SQL文識別子の有効範囲はセションになります。そのため複数のコンパイル単位にまたがって使用することがで

き、拡張SQL文識別子を使用するSQL文ごとにカプセル化し、共有することが可能です。

複数のコンパイル単位にまたがって拡張SQL文識別子を使用するアプリケーション

sub_pre.scob

000030 IDENTIFICATION DIVISION.

000040 PROGRAM-ID. SUB-PREP.

:

001000 EXEC SQL PREPARE :cmd1 FROM :strsql END-EXEC. (1)

:

010000 EXIT PROGRAM.

(1)ホスト変数cmd1を使用して拡張SQL文識別子“CMD1”を定義します。

sub_exec.scob

000030 IDENTIFICATION DIVISION.

000040 PROGRAM-ID. SUB-EXEC.

:

001000 EXEC SQL EXECUTE :cmd1 USING SQL DESCRIPTOR 'DESC1' END-EXEC. (1)

:

010000 EXIT PROGRAM.

(1)拡張SQL文識別子“CMD1”の被準備文を実行します。

3.2.13 拡張カーソル名を使用したカーソル操作

ここでは、拡張カーソル名で指定されたカーソルの使用方法について説明します。

拡張カーソル

ALLOCATE CURSOR文を使用して宣言したカーソルを拡張カーソルといいます。

拡張カーソルは、ALLOCATE CURSOR文に拡張カーソル名および拡張SQL文識別子を指定して定義します。拡張カー

ソル名は、文字列型のホスト変数を使用して定義し、アプリケーションの実行時に値を動的に設定します。

拡張カーソル名は、以下のSQL文に指定できます。

・ ALLOCATE CURSOR文

・ 動的CLOSE文

- 88 -

・ 動的DELETE文:位置づけ

・ 動的FETCH文

・ 動的OPEN文

・ 動的UPDATE文:位置づけ

拡張カーソル名の使用方法

拡張カーソル名を使用すると、ホスト変数を指定することによりカーソルの名前を実行時に動的に指定することが可

能になるため、複数のカーソルを宣言する場合にカーソル宣言をまとめることができます。

そのため、多数のカーソルを操作するアプリケーションでも、開発量の削減を実現できます。

拡張カーソル名ではなくカーソル名を使用すると、カーソルの名前をSQL文中に識別子として文字列で指定するた

め、複数のカーソルを宣言する場合は、使用するカーソルの数だけカーソル宣言を記述する必要があります。

また、カーソルを操作する場合は、個々のカーソル名を記述したSQL文を記述しなければなりません。

そのため、多数のカーソルを使用するアプリケーションは、その開発規模が大きくなってしまいます。

拡張カーソル名を使用した場合とカーソル名を使用した場合で、複数のカーソルを宣言する例を以下に示します。

例1

拡張カーソル名を使用して、複数のカーソルを宣言する例を示します。

:

001010 PERFORM VARYING LOOP FROM 1 BY 1 UNTIL LOOP > nn

003010 EXEC SQL PREPARE :cmd1 FROM :strsql END-EXEC. (1)

003010 EXEC SQL ALLOCATE :cur1 CURSOR FOR :cmd1 END-EXEC.(2)

000000 END-PERFORM.

:

(1)拡張SQL文識別子を使用して、ループによりnn個の準備可能文を準備します。

(2)拡張カーソル名を使用して、ループによりnn個のカーソルを宣言します。

例2

カーソル名を使用して、複数のカーソルを宣言する例を示します。

:

001000 EXEC SQL PREPARE CMD1 FROM :strsql END-EXEC. (1)

001010 EXEC SQL PREPARE CMD2 FROM :strsql END-EXEC. (1)

001020 EXEC SQL PREPARE CMD3 FROM :strsql END-EXEC. (1)

:

:

002010 EXEC SQL PREPARE CMDnn FROM :strsql END-EXEC. (1)

:

002020 EXEC SQL DECLARE CUR1 CURSOR FOR CMD1 END-EXEC. (2)

002030 EXEC SQL DECLARE CUR2 CURSOR FOR CMD2 END-EXEC. (2)

002040 EXEC SQL DECLARE CUR3 CURSOR FOR CMD3 END-EXEC. (2)

:

:

002nn0 EXEC SQL DECLARE CURnn CURSOR FOR CMDnn END-EXEC. (2)

:

(1)SQL文識別子CMD1~CMDnnを定義します。

(2)SQL文識別子CMD1~CMDnnに対し、カーソルCUR1~CURnnを宣言します。

拡張カーソル名の有効範囲

拡張カーソル名の有効範囲はセションになります。

そのため複数のコンパイル単位にまたがって使用することができ、拡張カーソル名を使用するSQL文ごとにカプセル

化し、共有することが可能です。

- 89 -

複数のコンパイル単位にまたがった拡張カーソルの使用例を示します。

sub_pre.scob

000030 IDENTIFICATION DIVISION.

000040 PROGRAM-ID. SUB-PREP.

:

001000 EXEC SQL PREPARE :cmd1 FROM :strsql END-EXEC. (1)

:

(1)ホスト変数cmd1を使用して拡張SQL文識別子を定義します。

sub_alloc_cur.scob

000030 IDENTIFICATION DIVISION.

000040 PROGRAM-ID. SUB-ALLOC.

:

001000 EXEC SQL ALLOCATE :cur1 CURSOR FOR :cmd1 END-EXEC. (1)

:

(1)拡張カーソル名cur1と拡張SQL文識別子cmd1を使用して拡張カーソルを宣言します。

sub_open.scob

000030 IDENTIFICATION DIVISION.

000040 PROGRAM-ID. SUB-OPEN.

:

001000 EXEC SQL OPEN :cur1 END-EXEC. (1)

:

(1)拡張カーソルcur1をオープンします。

3.3 行識別子の使用時の注意事項

ここでは、行識別子の概要と注意事項について説明します。

行識別子とは

行識別子は、データベース中の任意の表の行を一意に識別するためのものです。行識別子名は、“ROW_ID”です。行

識別子は、単一行SELECT文またはFETCH文により取り出すことができます。取り出した行識別子は、探索条件に指定

して任意の行を操作するために使用します。

行識別子を使用することにより、データベース中の単一行を高速に操作することができます。また、あらかじめ検索した

集合の任意の行を一意に識別して操作することができます。

行識別子を使用して行の更新を行います。

EXEC SQL BEGIN DECLARE SECTION;

ROW_ID H_RID;

EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT ROW_ID INTO :H_RID FROM 在庫管理.在庫表 WHERE 製品番号 = 351;

EXEC SQL UPDATE 在庫管理.在庫表 SET 倉庫番号 = 3 WHERE ROW_ID = :H_RID;

行識別子使用時の注意

行識別子を使用する場合の注意事項を、以下に示します。

・ 行識別子を使用したアプリケーションのコンパイルでは、sqlcc、sqlfccおよびsqlcobolコマンドに、-W96オプション、-W2000オプションまたは-W2007オプションを指定してください。

- 90 -

・ 単一行SELECT文やカーソルを使用したFETCH文で取り出した行識別子を、SQLデータ操作文のWHERE句の探

索条件に指定する場合、SQLデータ操作文は、行識別子を取り出した単一行SELECT文やカーソルが識別する問

合せ式と同じ表を操作する必要があります。取り出した行識別子を、異なる表を操作するデータ操作の探索条件に

指定すると、検索データは見つかりません。

・ 取り出した行識別子は、そのトランザクション内で再検索または更新に使用することができます。ただし、トランザクショ

ンの独立性水準により同一トランザクション内においても、同じデータを検索できなかったり、異なる行を更新してし

まうことがあります。

独立性水準 同一行の操作

SERIALIZABLE

同一行の操作を保証します。

REPEATABLEREAD

同一行の操作を保証します。

READCOMMITTED

以下のいずれかの条件で取得した行識別子は、再検

索で異なる行を識別することがあります。

・ 単一行SELECT文

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

・ カーソルの更新可能性句がREAD ONLY

READUNCOMMITTED

再検索で異なる行を識別することがあります。

・ 取り出した行識別子を、他のトランザクションで再検索または更新に利用すると、同じデータを検索できなかったり、

異なる行を更新することがあります。このような場合は、行識別子を取り出したときに行のデータも同時に取り出して

おき、行識別子を利用して更新する前に、行識別子で再検索して行のデータが他のトランザクションにより変更され

ていないかどうかを調べる必要があります。

事 象 原 因

検索データなし該当行が、他のトランザクションにより削除ま

たは更新されています。

前回の検索結果と値

が異なる

他のトランザクションにより行が更新されてい

ます。

他のトランザクションにより行が削除されたあ

と、別の行が挿入されています。

参照

行識別子を指定可能な箇所についての詳細は、“SQLリファレンス”を参照してください。

3.4 ロール使用時の記述方法

権限定義時に利用者に付与したロールは、アプリケーションでSET ROLE文を実行することにより有効になります。

また、アプリケーションでは、権限の定義時にデフォルトロールを設定していた場合は、現行セション単位にロールを変

更することができます。ロールの変更は、SET ROLE文で行います。

アプリケーションの例を以下に示します。

EXEC SQL CONNECT TO '在庫管理DB' AS 'C1'

EXEC SQL SET ROLE 'STOCKS_A2' ;

- 91 -

EXEC SQL INSERT INTO 伝票( 在庫カラム,倉庫カラム) VALUES(:H1,:H2);

EXEC SQL COMMIT WORK ;

EXEC SQL DISCONNECT 'C1' ;

参照

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

3.5 一時表の使用方法

一時表には、アプリケーションのセション内で利用できる表と、トランザクション内で利用できる表があります。(一時表の

定義時に、行削除指定によって設定できます。)

一時表を使用する業務が1つのトランザクションで構成されている場合は、トランザクション内で利用できる一時表を使用

します。この場合、一時表に格納した行は、トランザクション終了時に削除されます。同時に、データベーススペースに割

り付けた一時表の領域も解放されます。

また、業務が複数のトランザクションで構成されている場合は、セション内で利用できる一時表を使用します。この場合、

データベーススペースに割り付けた一時表の領域はセション終了時まで保持されます。しかし、一時表を使用する処理

が完了し、以降の処理で一時表を使用しない場合には、行削除指定で設定した一時表の利用範囲に関係なく、データ

ベーススペースに割り付けた一時表の領域を解放することができます。一時表の解放は、RELEASE TABLE文を使用し

ます。一時表を解放する場合は、トランザクションが終了している必要があります。

月末業務や年度末業務など、定常的に行われない業務で使用した一時表を、RELEASE TABLE文で領域を解放する

ことによって、データベーススペースを効率よく利用できます。

アプリケーション中に、以下のSQL文を記述します。

EXEC SQL RELEASE GLOBAL TEMPORARY TABLE STOCKS.在庫一時表;

注意

RELEASE TABLE文は、動的SQL文では使用できません。

- 92 -

- 93 -

第4章 動的SQLを利用するアプリケーションの作成

本章では、動的SQLについて、その機能と使用方法を説明します。

4.1 動的SQLの概念

動的SQLは、アプリケーションの実行時にSQL文を作り出して実行させる場合に使用します。たとえば、削除する行の探

索条件をファイルから入力して、その条件に従って表から行を削除するアプリケーションを開発するとします。この場合、

プログラムのコーディング時には、削除行の探索条件が決まっていないので、行を削除するSQL文は書くことができませ

ん。アプリケーションの実行時に、ファイルから探索条件を読み込んで、はじめてSQL文が完成します。このようなアプリ

ケーションは、埋込みSQL文では作成することができません。つまり、埋込みSQL文の場合は、コンパイル時に解釈され

るため、コンパイル時にSQL文が完成している必要があるからです。このようなアプリケーションには、動的SQLを使用し

ます。動的SQLは、プログラムの実行時にSQL文を解釈し、実行させます。

本節では、動的SQLを実行するために必要な以下の要素について説明します。

・ SQLDA構造体およびSQL記述子域

・ 準備可能文

・ 動的パラメタ指定

・ USING句

SQLDA構造体およびSQL記述子域

SQL文を動的に変更してデータ操作を行う場合、つまり、アプリケーション外からSQL文を入力するような場合には、どの

ようなSQL文が入力されるのか、アプリケーションの作成時にはわかりません。たとえば、データベースからデータを取り

出す場合には、データを取り出すための変数をアプリケーション上に宣言する必要があります。しかし、どのようなSQL文が入力されるのかわからなければ、変数を宣言することができません。これは、データをデータベースに挿入する場合も

同様です。

そこで、動的にSQL文を変更する場合には、データ操作を行うための一時的な記述子領域を割り当てます。この記述子

領域を利用することにより、アプリケーションには、適当な変数を宣言しておくだけでデータ操作が行えるようになります。

この記述子領域は、SQLDA構造体として利用する方法とSQL記述子域として利用する方法があります。なお、SQLDA構造体はC言語の場合に利用できます。

SQLDA構造体

SQLDA構造体の領域は、利用者がアプリケーション内で動的に割り当てて使用します。したがって、利用者はSQLDA構造体の情報を直接操作することができます。SQLDA構造体を使用する場合は、動的パラメタ指定や選択リストの

情報を、SQLDA構造体のメンバに設定、またはメンバから取得するという操作だけで処理が簡単になります。

SQLDA構造体の位置づけを以下に示します。

SQL記述子域

SQL記述子域は、被準備文中に含まれる動的パラメタ指定や選択リストに関する情報を格納する利用者定義の記述

子領域です。利用者はこの領域を介して、被準備文中に含まれる動的パラメタ指定の値を設定したり、選択リストの

結果を取り出したりすることができます。

- 94 -

この操作はALLOCATE DESCRIPTOR文を実行することで割り当てられるSQL記述子を介して行われます。このSQL記述子の領域は、Symfoware/RDBの内部情報として獲得されるため、SQL記述子に対して利用者が直接アクセスを

行うことはできません。SQL記述子に対するデータ操作はSET DESCRIPTOR文やGET DESCRIPTOR文を実行する

ことで行います。

SQL記述子域の位置づけを以下に示します。

準備可能文

プログラムの実行時に作成して実行させることのできるSQL文を“準備可能文”といいます。準備可能文を以下に示しま

す。

・ 動的単一行SELECT文

・ INSERT文

・ UPDATE文:探索

・ DELETE文:探索

・ 動的SELECT文

・ 準備可能動的UPDATE文:位置づけ

・ 準備可能動的DELETE文:位置づけ

・ スキーマ定義文

・ スキーマ操作文

・ 格納構造定義文

・ 格納構造操作文

・ 利用者制御文

・ アクセス制御文

注意

データベース簡単運用の場合には、使用可能なSQL文の範囲が異なります。データベース簡単運用ガイドを参照し、使

用可能なSQL文の範囲を確認してください。

このうち、動的単一行SELECT文、動的SELECT文、準備可能動的UPDATE文および準備可能動的DELETE文は、準

備可能文としてだけ指定することができるSQL文です。動的単一行SELECT文は、問合せ指定に、また、動的SELECT文は、カーソル指定にそれぞれ構文が一致します。

利用者制御文のSET USER PASSWORD文およびアクセス制御文のSET ROLE文は準備可能文として実行できませ

ん。

なお、準備可能文を実行させるためには、実行の準備処理が必要です。実行の準備がされた準備可能文を“被準備文”

と呼びます。

準備可能文の例を以下に示します。

- 95 -

例1

在庫表より導出する在庫数量と倉庫番号の表の、製品番号が“110”の行を取り出しの対象とする動的単一行SELECT文を指定します。

SELECT 在庫数量, 倉庫番号 FROM 在庫管理.在庫表 WHERE 製品番号 = 110

例2

在庫表より導出する製品名と在庫数量の表を在庫数量の昇順に取り出す動的SELECT文を指定します。

SELECT 製品名, 在庫数量 FROM 在庫管理.在庫表 ORDER BY 在庫数量 ASC

例3

カーソルCU1が位置づけられている行の製品名を“電池”に、倉庫番号を“5”に変更する準備可能動的UPDATE文:位置づけを指定します。

UPDATE 在庫管理.在庫表

SET 製品名 = N'電池', 倉庫番号 = 5 WHERE CURRENT OF CU1

動的パラメタ指定

準備可能文の中で、値指定(入力変数)を指定したい場合は、値指定の部分に、“?”(疑問符)を記述します。この“?”を“動的パラメタ指定”といいます。動的パラメタ指定は、埋込みSQL文の変数指定に相当します。動的パラメタ指定は、準

備可能文の以下の箇所に指定することができます。

・ 動的SELECT文、動的単一行SELECT文、UPDATE文:探索およびDELETE文:探索の探索条件

・ UPDATE文:探索または準備可能動的UPDATE文:位置づけの設定句

・ INSERT文の挿入値リスト

動的パラメタ指定の例を以下に示します。

例4

DELETE文:探索の探索条件に動的パラメタ指定を指定します。

DELETE FROM 在庫管理.在庫表 WHERE 製品名 = ?

例5

UPDATE文:探索の設定句に動的パラメタ指定を指定します。

UPDATE 在庫管理.在庫表

SET 在庫数量 = 0, 倉庫番号 = ? WHERE 製品番号 = 111

例6

INSERT文の挿入値リストに動的パラメタ指定を指定します。

INSERT INTO 在庫管理.在庫表(製品番号,製品名,在庫数量) VALUES(?, ?, ?)

USING句

被準備文の動的パラメタ指定の値の設定と実行結果の取り出しにはUSING句を用います。USING句の使用方法と指定

形式を以下に示します。

- 96 -

表4.1 USING句の使用方法と指定形式

使用方法 指定できるSQL文 指 定 形 式

動的パラメタ指定の値の設定EXECUTE文動的OPEN文

USING 引数[, 引数, …] USING SQL DESCRIPTOR 記述

子名

実行結果の取り出しEXECUTE文動的FETCH文

INTO 引数[, 引数, …] INTO SQL DESCRIPTOR 記述

子名

“表4.1 USING句の使用方法と指定形式”の中で、EXECUTE文に指定するUSING句のうち、動的パラメタ指定の値の

設定に用いるUSING句を“パラメタUSING句”といいます。実行結果の取り出しに用いるUSING句を“結果USING句”と

いいます。

また、USING句の指定形式には以下があります。

・ 引数を指定する方法

・ SQLDA構造体変数の変数名またはSQL記述子名として指定する方法

前者を“USING引数”といい、後者を“USING記述子”といいます。

EXECUTE文にUSING記述子を指定する方法を以下に示します。

EXECUTE STM INTO SQL DESCRIPTOR 'OUTDESC' USING SQL DESCRIPTOR 'INDESC'

(1) (2)

(1) 結果USING句

(2) パラメタUSING句

4.2 SQL文を動的に変更して実行する

本節では、SQL文を動的に変更して実行する方法について、以下を説明します。

・ SQL文の準備とSQLDA構造体の操作

- 動的SELECT文を準備して実行する(SQLDA構造体の場合)

- 動的単一行SELECT文を準備して実行する(SQLDA構造体の場合)

・ SQL文の準備とSQL記述子域の操作

- 動的SELECT文を準備して実行する(SQL記述子域の場合)

- 動的単一行SELECT文を準備して実行する(SQL記述子域の場合)

4.2.1 SQL文の準備とSQLDA構造体の操作

動的SQLを使用してデータベースからデータの取り出しを行う場合には、実行結果を受け取る相手指定を指定します。

相手指定に実行結果を受け取るためには、選択リストの情報をその相手指定の属性と一致させることが必要です。そこ

で、データベースからSQLDA構造体に選択リストの情報を取り込んで、属性を変更します。SQLDA構造体の位置づけ

を以下に示します。

SQLDA構造体は、相手指定または動的パラメタ指定に関する情報を持ちます。

- 97 -

SQLDA構造体は、項目記述子域“SQLVAR”およびSQLVARの 大要素数“SQLN”と有効要素数“SQLD”で構成され

ています。

SQLDA構造体は以下の形式です。

#define SQL_DESC_ENT_NUM 1

typedef struct sqlextinf {

int SQLPOSITION; /* CALL文のパラメタ位置 */

char SQLSYSTEMRSV[252]; /* 予約域 */

} sqlextinf;

typedef struct sqlvar {

char *SQLDATA; /* 変数データ域 */

short *SQLIND; /* 標識変数データ域 */

int SQLLEN; /* データ長 */

short SQLTYPE; /* データ型のコード */

short SQLSCALE; /* 位取り */

union{

short PRECISION;

struct {

char PRECISION;

char DATETIME_INTERVAL_PRECISION;

} INTERVAL;

} SQLPRECISION; /* 精度 */

short SQLNULLABLE; /* NULL可能性 */

struct {

short SQLNAMEL; /* 列名長 */

char SQLNAMEC[128]; /* 列名 */

} SQLNAME;

sqlextinf *SQLEXTINF; /* 拡張情報 */

} sqlvar;

typedef struct SQLDA {

short SQLN; /* SQLVARの実配列数 */

short SQLD; /* SQLVARのデータの設定数 */

sqlvar SQLVAR[SQL_DESC_ENT_NUM];

} SQLDA;

SQLDA構造体の構成要素の各メンバの意味は以下の通りです。

SQLN

SQLNは、記述され得る動的パラメタ指定の 大数または選択リスト項目の 大数を示します。したがって、SQLNは配

列SQLVARの 大要素数を決定します。

SQLD

SQLDは、配列SQLVARの有効要素数を決定します。

被準備文中に選択リスト項目がある場合、SQLDA構造体を指定した出力DESCRIBE文を実行すると、SQLDには選択リ

スト項目の個数が返却されます。

また、被準備文中に動的パラメタ指定が記述されている場合、SQLDA構造体を指定した入力DESCRIBE文を実行する

と、SQLDには動的パラメタ指定の個数が返却されます。

SQLVAR

SQLVARは、動的パラメタ指定または選択リスト項目の各種情報を格納する配列です。

動的パラメタ指定に対してはSQL文が実行される前に、この配列の情報を設定する必要があります。n個の動的パラメタ

指定があるような、SQL文を被準備文として実行する場合、SQLVAR[0]からSQLVAR[n-1]に格納されている情報でSQL文が実行されます。

- 98 -

選択リストに対してはSQL文が実行される前に、この配列の情報を設定する必要があります。n個の選択リストがあるような

SQL文を被準備文として実行する場合、SQL文実行後にSQLVAR[0]からSQLVAR[n-1]に指定したデータバッファに

データが格納されます。

項目記述子域“SQLVAR”は、以下の内容で構成されています。

メンバ名 意味 データ型

SQLDATA ホスト変数のアドレス -

SQLIND 標識変数のアドレス -

SQLLEN 長さ(バイト数) 2進の精度を持つ真数(注1)

SQLTYPE データ型のコード 2進の精度を持つ真数(注2)

SQLSCALE

位取り、または 日時型、時間隔

型のコード2進の精度を持つ真数(注2)

SQLPRECISION.PRECISION

精度 2進の精度を持つ真数(注2)

SQLPRECISION.INTERVAL.DATETIME_INTERVAL_PRECISION

時間隔先行フィールド精度 2進の精度を持つ真数(注3)

SQLNULLABLE

NULL値を許すかどうか 2進の精度を持つ真数(注2)

SQLNAME

列指定の列名 長さ108バイト以下の文字列型

SQLEXTINF

拡張情報 -

注1) C言語のint型のデータ型です。

注2) C言語のshort型のデータ型です。

注3) C言語のchar型のデータ型です。

SQLDA構造体のSQLTYPEの値(データ型のコード)とSQLのデータ型の対応は以下のとおりです。

コード データ型

1 CHARACTER

2 NUMERIC

3 DECIMAL

4 INTEGER

5 SMALLINT

7 REAL

8 DOUBLE PRECISION

9 DATE, TIMEまたはTIMESTAMP

10 INTERVAL

11 NATIONAL CHARACTER

- 99 -

コード データ型

12 CHARACTER VARYING

13 NATIONAL CHARACTER VARYING

30 BLOB

31 (注)

50 ROW_ID

注) SQL埋込みCプログラムにおいて、8バイトの整数型(long long型など)と対応します。DESCRIBE文では、コードに31は返却されません。

SQLTYPEの値が日時型を示す9の場合、SQLSCALEには、以下のDATETIME_INTERVAL_CODEを格納します。

コード データ型

1 DATE

2 TIME

3 TIMESTAMP

SQLTYPEの値が時間隔型を示す10の場合、SQLSCALEには、以下のDATETIME_INTERVAL_CODEを格納します。

コード 時間隔修飾子

1 YEAR

2 MONTH

3 DAY

4 HOUR

5 MINUTE

6 SECOND

7 YEAR TO MONTH

8 DAY TO HOUR

9 DAY TO MINUTE

10 DAY TO SECOND

11 HOUR TO MINUTE

12 HOUR TO SECOND

13MINUTE TOSECOND

実行結果の取り出し手順

USING記述子を使用して、実行結果を取り出す方法の順序を以下に示します。ここでは処理の流れを説明します。な

お、各SQL文についてはこれ以降で説明します。

- 100 -

図4.1 被準備文の実行結果の取り出し手順

SQL文を動的に変更してデータ操作を行う場合、そのSQL文を実行するための準備処理を行います。

SQL文の準備

動的SQLの実行の準備を行うには、PREPARE文を使用します。プログラムの実行時にSQL文を作成して実行させる場

合に、そのSQL文を“SQL文変数”と呼ばれるホスト変数に文字列として格納します。そして、PREPARE文で実行の準備

をします。このとき、SQL文変数に格納されたSQL文は文を識別するSQL文識別子と対応づけられます。

SQL文変数の内容が準備可能動的UPDATE文:位置づけまたは準備可能動的DELETE文:位置づけの場合は、事前に

対応するカーソルをオープンしておくことが必要です。また、指定したカーソルは動的カーソルであることが必要です。

なお、すでにPREPARE文で定義されたSQL文識別子に対して、再度PREPARE文を実行する場合は、先の被準備文が

解放され、新たに被準備文が準備されます。先の被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソ

ルを参照している準備可能動的UPDATE文:位置づけまたは準備可能動的DELETE文:位置づけの被準備文も同時に

解放されます。ただし、被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソルは閉じられた状態である

ことが必要です。

PREPARE文の指定例を以下に示します。実行準備を行うSQL文は、SQL文変数strに格納されているとします。このSQL文のSQL文識別子をSTMと定義します。

- 101 -

PREPARE STM FROM :str

(1) (2)

(1) SQL文識別子

(2) SQL文変数

SQL文の解放

PREPARE文によって準備された被準備文を解放するには、DEALLOCATE PREPARE文を使用します。

被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソルを参照している準備可能動的UPDATE文:位置

づけまたは準備可能動的DELETE文:位置づけの被準備文も同時に解放されます。また、その際のカーソルは、閉じら

れた状態であることが必要です。

DEALLOCATE PREPARE文の指定例を以下に示します。解放する被準備文は、PREPARE文によってSQL文識別子

をSTMと定義された被準備文とします。

DEALLOCATE PREPARE STM

(1)

(1) SQL文識別子

SQLDA構造体を操作するSQL文

“図4.1 被準備文の実行結果の取り出し手順”で示したように、データベースからSQLDA構造体に選択リストの情報を取

り込むには、DESCRIBE文を使用します。DESCRIBE文とその機能について以下で説明します。

DESCRIBE文

DESCRIBE文では、PREPARE文で準備された被準備文の選択リストの情報をSQLDA構造体に取り込みます。この

SQL文を“出力DESCRIBE文”といいます。

SQL文識別子STM2に対応する被準備文の選択リストの情報を、SQLDA構造体に取り込む出力DESCRIBE文の例

を以下に示します。

DESCRIBE OUTPUT STM2 USING SQL DESCRIPTOR :OUTSQLDA

(1) (2)

(1) SQL文識別子

(2) SQLDA構造体

SQL文識別子STM2に対する被準備文が以下の場合、SQLDA構造体の内容は次のようになります。

SELECT 製品名, 在庫数量 FROM 在庫管理.在庫表 WHERE 製品番号 = 110

(1)

(1) 選択リスト

- SQLD : 2

選択リストの個数2が設定されます。

- SQLDA構造体の項目記述子域のメンバの情報

製品名、在庫数量の属性がそれぞれ設定されます。

- 製品名 : NATIONAL CHARACTER(10)(NOT NULL制約あり)

- 在庫数量: INTEGER(NOT NULL制約なし)

識別子 製品名 在庫数量

SQLTYPE 11 4

SQLLEN 20 4

- 102 -

識別子 製品名 在庫数量

SQLPRECISION.PRECISION

0 31

SQLSCALE 0 0

SQLNULLABLE 0 1

SQLIND 値は設定されない 値は設定されない

SQLDATA 値は設定されない 値は設定されない

SQLNAME 製品名 (注) 在庫数量 (注)

SQLPRECISION.INTERVAL

0 0

注) 長さはSQLNAMELに格納されます。

4.2.1.1 動的SELECT文を準備して実行する(SQLDA構造体の場合)データの取り出しを連続的に行う場合には、動的SELECT文を準備して実行します。SQLDA構造体を使用して、動的

SELECT文を実行するアプリケーションの例を以下に示します。

端末から入力した動的SELECT文の例です。

動的SELECT文を実行するアプリケーションの例

#include <stdio.h>

#include <string.h>

#include "qdbnosis.h"

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

VARCHAR str[1024]; /* SQL文変数 */ …(1)

SQLDA *sqlda_out; /* SQLDA構造体 */

EXEC SQL END DECLARE SECTION;

void main()

{

short vartype; /* データ型 */

short varleng; /* 文字数 */

short varolen; /* バイト数 */

short varprec; /* 精度 */

short varscal; /* 位取り SQL記述子域 */

char varname[129]; /* 列の名前 */

short vardcod; /* 日時,時間隔 */

short vardpre; /* 時間隔精度 */

short varocount; /* 選択リストの数 */

short i; /* SQL記述子域のカウンタ */

char ocdata[100][15]; /* CHARACTER型 */

char oncdata[100][21]; /* NCHAR型 */

long oidata[100]; /* 真数型 相手指定 */

double ofdata[100]; /* 概数型 */

char oddata[100][22]; /* 日時,時間隔 */

short inddata[100]; /* 標識変数 */

size_t size; /* SQLDAのサイズ */

memset(SQLSTATE, 0x00, 6); …(2)

memset(SQLMSG, 0x00, 256); …(2)

memset(&str, 0x00, sizeof(str)); …(2)

memset(varname, 0x00, sizeof(varname)); …(2)

- 103 -

memset(ocdata, 0x00, sizeof(ocdata) ); …(2)

memset(oncdata, 0x00, sizeof(oncdata) ); …(2)

memset(oddata, 0x00, sizeof(oddata)); …(2)

size = sizeof(SQLDA) + sizeof(sqlvar) * (100 - 1); …(3)

sqlda_out = (SQLDA *)malloc(size);

memset( sqlda_out, 0x00, size );

sqlda_out->SQLN = 100; …(4)

EXEC SQL CONNECT TO DEFAULT; …(5)

EXEC SQL WHENEVER SQLERROR GOTO :ERR; …(6)

printf( "実行する動的SELECT文を指定してください \n" );

gets( str.sqlvar ); …(7)

str.sqllen = strlen( str.sqlvar );

EXEC SQL DECLARE CUR1 CURSOR FOR STMID; …(8)

EXEC SQL PREPARE STMID FROM :str; …(9)

EXEC SQL DESCRIBE OUTPUT STMID USING SQL DESCRIPTOR :sqlda_out; …(10)

/**************/

/* 選択リスト */

/**************/

varocount = sqlda_out->SQLD; …(11)

for( i = 0; i < varocount; i++ ) {

vartype = sqlda_out->SQLVAR[i].SQLTYPE; …(12)

varleng = sqlda_out->SQLVAR[i].SQLLEN; …(12)

varprec = sqlda_out->SQLVAR[i].SQLPRECISION.PRECISION; …(12)

varscal = sqlda_out->SQLVAR[i].SQLSCALE; …(12)

vardcod = sqlda_out->SQLVAR[i].SQLSCALE; …(12)

vardpre = sqlda_out->SQLVAR[i].SQLPRECISION.INTERVAL. …(12)

DATETIME_INTERVAL_PRECISION;

/* CHAR型かVCHAR型 */ …(13)

if( vartype == 1 || vartype == 12 ) { …(13)

sqlda_out->SQLVAR[i].SQLTYPE = 1; …(13)

sqlda_out->SQLVAR[i].SQLLEN = 14; …(13)

sqlda_out->SQLVAR[i].SQLDATA = (char *)&ocdata[i][0]; …(13)

} …(13)

/* NCHAR型かNVCHAR型 */ …(13)

else if( vartype == 11 || vartype == 13 ) { …(13)

sqlda_out->SQLVAR[i].SQLTYPE = 11; …(13)

sqlda_out->SQLVAR[i].SQLLEN = 20; …(13)

sqlda_out->SQLVAR[i].SQLDATA = (char *)&oncdata[i][0]; …(13)

} …(13)

/* INTEGER型かSMALLINT型 */ …(13)

else if( vartype == 4 || vartype == 5 ) { …(13)

sqlda_out->SQLVAR[i].SQLTYPE = 4; …(13)

sqlda_out->SQLVAR[i].SQLLEN = 4; …(13)

sqlda_out->SQLVAR[i].SQLPRECISION.PRECISION = 31; …(13)

sqlda_out->SQLVAR[i].SQLSCALE = 0; …(13)

sqlda_out->SQLVAR[i].SQLDATA = (char *)&oidata[i]; …(13)

} …(13)

/* NUMERIC型かDECIMAL型かREAL型かDOUBLE PRECISION型 */ …(13)

else if( vartype == 2 || vartype == 3 || …(13)

vartype == 7 || vartype == 8 ) { …(13)

sqlda_out->SQLVAR[i].SQLTYPE = 8; …(13)

sqlda_out->SQLVAR[i].SQLLEN = 8; …(13)

sqlda_out->SQLVAR[i].SQLPRECISION.PRECISION = 52; …(13)

sqlda_out->SQLVAR[i].SQLSCALE = 0; …(13)

sqlda_out->SQLVAR[i].SQLDATA = (char *)&ofdata[i]; …(13)

} …(13)

/* 日時型かINTERVAL型 */ …(13)

- 104 -

else if( vartype == 9 || vartype == 10 ) { …(13)

sqlda_out->SQLVAR[i].SQLTYPE = 12; …(13)

sqlda_out->SQLVAR[i].SQLLEN = 21; …(13)

sqlda_out->SQLVAR[i].SQLDATA = (char *)&oddata[i][0]; …(13)

} …(13)

}

EXEC SQL OPEN CUR1; …(14)

EXEC SQL WHENEVER NOT FOUND GOTO :NOTFND; …(15)

for(;;) {

EXEC SQL FETCH CUR1 INTO SQL DESCRIPTOR :sqlda_out; …(16)

/************/

/* 実行結果 */

/************/

for( i = 0; i < varocount; i++ ) {

vartype = sqlda_out->SQLVAR[i].SQLTYPE;

memcpy( varname, sqlda_out->SQLVAR[i].SQLNAME.SQLNAMEC,

sqlda_out->SQLVAR[i].SQLNAME.SQLNAMEL );

varname[sqlda_out->SQLVAR[i].SQLNAME.SQLNAMEL] = 0x00;

/* CHAR型 */

if( vartype == 1 ) {

printf( "%s -> %s ", varname, &ocdata[i][0] );

}

/* NCHAR型 */

else if( vartype == 11 ) {

printf( "%s -> %s ", varname, &oncdata[i][0] );

}

/* 真数型 */

else if( vartype == 4 ) {

printf( "%s -> %d ", varname, oidata[i] );

}

/* 概数型 */

else if( vartype == 8 ) {

printf( "%s -> %lf ", varname, ofdata[i] );

}

/* 日時型かINTERVAL型 */

else if( vartype == 12 ) {

printf( "%s -> %s ", varname, &oddata[i][2] );

}

}

printf( "\n" );

}

NOTFND:

EXEC SQL CLOSE CUR1; …(17)

EXEC SQL DEALLOCATE PREPARE STMID; …(18)

EXEC SQL COMMIT WORK; …(19)

EXEC SQL DISCONNECT DEFAULT; …(20)

free( sqlda_out );

return;

ERR:

EXEC SQL WHENEVER SQLERROR CONTINUE;

printf( "SQLERROR SQLSTATE = %s SQLMSG = %s\n", SQLSTATE, SQLMSG );

EXEC SQL ROLLBACK WORK;

EXEC SQL DISCONNECT DEFAULT;

free( sqlda_out );

return;

}

(1) SQL文変数はSQL文を格納する領域です。可変長文字列は、コンパイル時に以下の構造体に展開されます。

struct {

short sqllen; /* 長さ領域の変数 */

- 105 -

char sqlvar[1024]; /* 文字列領域の変数 */

}str;

(2) 変数を初期化します。

(3) SQLDA構造体の領域を獲得します。

(4) 配列SQLVARの配列数(SQLNの値)を指定します。

(5) コネクションを接続します。

(6) SQL文の実行でデータなし以外のエラーが生じた場合にERRへ進み、エラー情報を出力しプログラムは終了しま

す。

(7) 端末から入力された動的SELECT文を読み込み、strに格納します。

(8) カーソルCUR1を宣言します。カーソル指定としてSQL文識別子STMIDを指定します。

(9) strのSQL文を実行できるようにするための準備処理を行います。

(10) 入力した動的SELECT文の選択リストの情報をSQLDA構造体に取り込みます。

(11) SQLDA構造体に設定されている選択リストの個数(SQLDの値)を取得します。

(12) SQLDA構造体に設定されているそれぞれの選択リストの情報(SQLTYPE、SQLLEN、SQLPRECISION、

SQLSCALEの値)を取得します。

(13) SQLDA構造体に実行結果を取り出す相手指定のデータ型や変数のアドレスを設定します。

- CHARACTER(n)、CHARACTER VARYING(n)をCHARACTER(14)に変更します。(nは文字列の長さ)

- NATIONAL CHARACTER(n)、NATIONAL CHARACTER VARYING(n)をNATIONAL CHARACTER(10)に変更します。(nは文字列の長さ)

- INTEGER、SMALLINTをINTEGERに変更します。

- NUMERIC(p,q)、DECIMAL(p,q)、REAL、DOUBLE PRECISIONをDOUBLE PRECISIONに変更します。(pは精度、qは位取り)

- DATE、TIME、TIMESTAMPおよびINTERVALをCHARACTER VARYING(19)に変更します。(nは文字列の

長さ)

(14) カーソルCUR1をオープンします。

(15) 検索の結果データが見つからない場合にNOTFNDに進み、プログラムは終了します。

(16) カーソルCUR1の位置づけおよびデータの読込みを行います。このとき、SQLDA構造体のSQLDATAに設定し

たアドレスに実行結果の値が設定されます。

(17) カーソルCUR1をクローズします。

(18) SQL文識別子STMIDに対応する被準備文を解放します。

(19) 現行のトランザクションを終了します。

(20) コネクションを切断します。

4.2.1.2 動的単一行SELECT文を準備して実行する(SQLDA構造体の場合)1行のデータの取り出しを行う場合には、動的単一行SELECT文を準備して実行します。動的単一行SELECT文を実行

するには、USING句を指定したEXECUTE文を使用します。SQLDA構造体を使用して、動的単一行SELECT文の指定

例を以下に示します。なお、SQLDA構造体を操作するSQL文の詳細については、“図4.1 被準備文の実行結果の取り

出し手順”の例を参照してください。

端末から入力した動的単一行SELECT文の例です。

[端末から入力した動的単一行SELECT文をstrに格納]

EXEC SQL PREPARE STMID FROM :str;

- 106 -

size = sizeof(SQLDA) + sizeof(sqlvar) * (100 - 1);

sqlda_out = (SQLDA *)malloc(size);

EXEC SQL DESCRIBE OUTPUT STMID USING SQL DESCRIPTOR :sqlda_out;

ocount = sqlda_out->SQLD;

for( i = 0; i < ocount; i++) {

vartype = sqlda_out->SQLVAR[i].SQLTYPE;

varleng = sqlda_out->SQLVAR[i].SQLLEN;

[選択リストの情報をSQLDA構造体から取得]

sqlda_out->SQLVAR[i].SQLTYPE = 1;

sqlda_out->SQLVAR[i].SQLLEN = 14;

[SQLDA構造体の選択リストの情報を変更]

}

EXEC SQL EXECUTE STMID INTO SQL DESCRIPTOR :sqlda_out;

[実行結果の値の取得]

free( sqlda_out );

EXEC SQL DEALLOCATE PREPARE STMID;

4.2.2 SQL文の準備とSQL記述子域の操作

動的SQLを使用してデータベースからデータの取り出しを行う場合には、実行結果を受け取る相手指定を指定します。

相手指定に実行結果を受け取るためには、選択リストの情報をその相手指定の属性と一致させることが必要です。そこ

で、データベースからSQL記述子域に選択リストの情報を取り込んで、属性を変更します。SQL記述子域の位置づけを

以下に示します。

SQL記述子域は、識別子COUNTと0以上の項目記述子域(SQL記述子域の各要素)で構成されています。COUNTは、

SQL記述子域の選択リストの数を示し、そのデータ型は2進の精度を持つ真数です。以下の図では、SQL記述子域の選

択リストの数をnで表しています。

- 107 -

項目記述子域は以下の内容で構成されています。

識別子 意味 データ型

TYPE データ型のコード 2進の精度を持つ真数

LENGTH 長さ(文字数) 2進の精度を持つ真数

OCTET_LENGTH 長さ(バイト数) 2進の精度を持つ真数

PRECISION 精度 2進の精度を持つ真数

SCALE 位取り 2進の精度を持つ真数

NULLABLENULL値を許すかどうか

の識別2進の精度を持つ真数

INDICATOR 標識変数の値 2進の精度を持つ真数

DATA データ値

TYPE、LENGTH、

OCTET_LENGTH、

PRECISION、

SCALE、CHARACTER_SET_NAMEまたは

DATETIME_INTERVAL_CODEで指定されるデータ型に一致

NAME 名前長さ38バイト以上108バイト以下

の文字列型

CHARACTER_SET_NAME

文字セット名長さ38バイト以上108バイト以下

の文字列型

DATETIME_INTERVAL_CODE

日時型・時間隔型のコー

ド2進の精度を持つ真数

DATETIME_INTERVAL_PRECISION

時間隔先行フィールド精

度2進の精度を持つ真数

SQL記述子域のTYPEの値(データ型のコード)とSQLのデータ型の対応は以下のとおりです。

コード データ型

1 CHARACTERまたはNATIONAL CHARACTER

2 NUMERIC

3 DECIMAL

4 INTEGER

5 SMALLINT

7 REAL

8 DOUBLE PRECISION

9 DATE, TIMEまたはTIMESTAMP

10 INTERVAL

12CHARACTER VARYINGまたはNATIONAL CHARACTERVARYING

30 BLOB

31 (注)

- 108 -

コード データ型

50 ROW_ID

注) SQL埋込みCプログラムにおいて、8バイトの整数型(long long型など)と対応します。DESCRIBE文では、コードに31は返却されません。

TYPEの値が1または12のとき、CHARACTER_SET_NAMEの値(文字セット名)は、文字列型と各国語文字列型で以下

のように異なります。

・ 文字列型 : BASIC

・ 各国語文字列型 : NCHAR

TYPEの値が日時型を示す9の場合、DATETIME_INTERVAL_CODEの値は以下のとおりです。

コード データ型

1 DATE

2 TIME

3 TIMESTAMP

TYPEの値が時間隔型を示す10の場合、DATETIME_INTERVAL_CODEの値は以下のとおりです。

コード 時間隔修飾子

1 YEAR

2 MONTH

3 DAY

4 HOUR

5 MINUTE

6 SECOND

7 YEAR TO MONTH

8 DAY TO HOUR

9 DAY TO MINUTE

10 DAY TO SECOND

11 HOUR TO MINUTE

12 HOUR TO SECOND

13 MINUTE TO SECOND

実行結果の取り出し手順

USING記述子を使用して、実行結果を取り出す方法の順序を“図4.2 被準備文の実行結果の取り出し手順”に示しま

す。ここでは処理の流れを説明します。なお、各SQL文については“図4.2 被準備文の実行結果の取り出し手順”以降で

説明します。

- 109 -

図4.2 被準備文の実行結果の取り出し手順

SQL文を動的に変更してデータ操作を行う場合、そのSQL文を実行するための準備処理を行います。

SQL文の準備

動的SQLの実行の準備を行うには、PREPARE文を使用します。プログラムの実行時にSQL文を作成して実行させる場

合に、そのSQL文を“SQL文変数”と呼ばれるホスト変数に文字列として格納します。そして、PREPARE文で実行の準備

をします。このとき、SQL文変数に格納されたSQL文は文を識別するSQL文識別子と対応づけられます。

SQL文変数の内容が準備可能動的UPDATE文:位置づけまたは準備可能動的DELETE文:位置づけの場合は、事前に

対応するカーソルをオープンしておくことが必要です。また、指定したカーソルは動的カーソルであることが必要です。

なお、すでにPREPARE文で定義されたSQL文識別子に対して、再度PREPARE文を実行する場合は、先の被準備文が

解放され、新たに被準備文が準備されます。先の被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソ

ルを参照している準備可能動的UPDATE文:位置づけまたは準備可能動的DELETE文:位置づけの被準備文も同時に

解放されます。ただし、被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソルは閉じられた状態である

ことが必要です。

PREPARE文の指定例を以下に示します。実行準備を行うSQL文は、SQL文変数strに格納されているとします。このSQL文のSQL文識別子をSTMと定義します。

PREPARE STM FROM :str

(1) (2)

- 110 -

(1) SQL文識別子

(2) SQL文変数

SQL文の解放

PREPARE文によって準備された被準備文を解放するには、DEALLOCATE PREPARE文を使用します。

被準備文が動的SELECT文の場合、SQL文識別子に対応するカーソルを参照している準備可能動的UPDATE文:位置

づけまたは準備可能動的DELETE文:位置づけの被準備文も同時に解放されます。また、その際のカーソルは、閉じら

れた状態であることが必要です。

DEALLOCATE PREPARE文の指定例を以下に示します。解放する被準備文は、PREPARE文によってSQL文識別子

をSTMと定義された被準備文とします。

DEALLOCATE PREPARE STM

(1)

(1) SQL文識別子

SQL記述子域を操作するSQL文

“図4.2 被準備文の実行結果の取り出し手順”で示したように、データベースからSQL記述子域に選択リストの情報を取り

込んだり、SQL記述子域に取り込まれた選択リストの情報を取得するには、それぞれSQL文を使用します。SQL記述子

域を操作する各SQL文とその機能について以下で説明します。

ALLOCATE DESCRIPTOR文

ALLOCATE DESCRIPTOR文は、指定された記述子名のSQL記述子域を割り当てます。割り当てられたSQL記述子

域は、実現値に指定された個数の項目記述子域を所有します。

“DESC1”という記述子名のSQL記述子域を割り当てる例を以下に示します。このとき、SQL記述子域の項目記述子

域の数を200とします。

ALLOCATE DESCRIPTOR 'DESC1' WITH MAX 200

(1) (2)

(1) 記述子名

(2) 実現値

DEALLOCATE DESCRIPTOR文

DEALLOCATE DESCRIPTOR文は、ALLOCATE DESCRIPTOR文で割り当てたSQL記述子域を解放します。

DEALLOCATE DESCRIPTOR文で指定した記述子名が動的OPEN文に指定されている場合、カーソルは閉じられ

た状態であることが必要です。

“DESC1”という記述子名のSQL記述子域を解放する例を以下に示します。

DEALLOCATE DESCRIPTOR 'DESC1'

(1)

(1) 記述子名

DESCRIBE文

DESCRIBE文では、PREPARE文で準備された被準備文の選択リストの情報をSQL記述子域に取り込みます。この

SQL文を“出力DESCRIBE文”といいます。

SQL文識別子STM2に対応する被準備文の選択リストの情報を、SQL記述子域に取り込む出力DESCRIBE文の例を

以下に示します。

DESCRIBE OUTPUT STM2 USING SQL DESCRIPTOR 'DESC2'

(1) (2)

(1) SQL文識別子

(2) 記述子名

- 111 -

SQL文識別子STM2に対する被準備文が以下の場合、SQL記述子域DESC2の内容は次のようになります。

SELECT 製品名, 在庫数量 FROM 在庫管理.在庫表 WHERE 製品番号 = 110

(1)

(1) 選択リスト

- COUNT : 2

選択リストの個数2が設定されます。

- 項目記述子域

製品名、在庫数量の属性がそれぞれ設定されます。

- 製品名 : NATIONAL CHARACTER(10)(NOT NULL制約あり)

- 在庫数量 : INTEGER(NOT NULL制約なし)

識別子 製品名 在庫数量

TYPE 1 4

LENGTH 10 4

OCTET_LENGTH 20 4

PRECISION 0 31

SCALE 0 0

NULLABLE 0 1

INDICATOR 値は設定されない 値は設定されない

DATA 値は設定されない 値は設定されない

NAME 製品名 (注) 在庫数量 (注)

CHARACTER_SET_NAME

NCHAR (注) 38バイトの空白

DATETIME_INTERVAL_CODE

0 0

DATETIME_INTERVAL_PRECISION

0 0

注) 38バイトに満たない場合は、残りの部分に空白が設定されます。

DESCRIPTOR取得文

DESCRIPTOR取得文では、SQL記述子域に設定されている情報をホスト変数に取り出します。ホスト変数のデータ

型は、それぞれの取得識別子のデータ型と一致していることが必要です。

選択リストの個数を、ホスト変数varcountに取得する例を以下に示します。

GET DESCRIPTOR 'DESC1' :varcount = COUNT

(1) (2) (3)

(1) 記述子名

(2) 単純相手指定

(3) 取得識別子

SQL記述子域に設定されている選択リストの内容を、それぞれホスト変数vartype、varleng、varoctetに取得する例を

以下に示します。また、取得する項目記述子域の要素番号はvarwcountに設定されている値とします。

GET DESCRIPTOR 'DESC1' VALUE :varwcount :vartype = TYPE,

(1) (2) (3) (4)

- 112 -

:varlengz = LENGTH, :varoctet = OCTET_LENGTH

(3) (4) (3) (4)

(1) 記述子名

(2) SQLVAR取得番号

(3) 単純相手指定

(4) 取得識別子

SQL記述子域から実行結果を取得する場合は、ホスト変数のデータ型は、対応する項目記述子域のTYPE、LENGTH、

OCTET_LENGTH、PRECISION、SCALE、CHARACTER_SET_NAMEに対応するデータ型であることが必要です。

SQL記述子域に設定されている実行結果を、ホスト変数vardataに取得する例を以下に示します。また、取得する項

目記述子域の要素番号はvarwcountに設定されている値とします。

GET DESCRIPTOR 'DESC1' VALUE :varwcount :vardata = DATA

(1) (2) (3) (4)

(1) 記述子名

(2) SQLVAR取得番号

(3) 単純相手指定

(4) 取得識別子

DESCRIPTOR設定文

DESCRIPTOR設定文では、実行結果を取り出す相手指定のデータ型を、SQL記述子域の選択リストに設定します。

定数またはホスト変数で指定します。ホスト変数のデータ型は、それぞれの設定識別子のデータ型と一致しているこ

とが必要です。

SQL記述子域の選択リストのデータ型を変更する例を以下に示します。ここでは、実行結果を取り出すホスト変数

vardataのデータ型が、CHARACTER(11)と宣言されているとします。したがって、選択リストのデータ型を

CHARACTER(10)に変更します。設定を行う項目記述子域の要素番号はvarwcountに設定されている値とします。

SET DESCRIPTOR 'DESC1' VALUE :varwcount TYPE = 1,

(1) (2) (3) (4)

LENGTH = 10, OCTET_LENGTH = 10

(3) (4) (3) (4)

(1) 記述子名

(2) SQLVAR設定番号

(3) 設定識別子

(4) 単純値指定

4.2.2.1 動的SELECT文を準備して実行する(SQL記述子域の場合)データの取り出しを連続的に行う場合には、動的SELECT文を準備して実行します。SQL記述子域を使用して、動的

SELECT文を実行するアプリケーションの例を以下に示します。

端末から入力した動的SELECT文の例です。

動的SELECT文を実行するアプリケーションの例

#include <stdio.h>

#include <string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

VARCHAR str[1024]; /* SQL文変数 */ …(1)

- 113 -

short vartype; /* データ型 */ …(2)

short varleng; /* 文字数 */ …(2)

short varolen; /* バイト数 */ …(2)

short varprec; /* 精度 */ …(2)

short varscal; /* 位取り */ …(2)

char varname[39]; /* 列の名前 */ …(2)

char varchar[39]; /* 文字セット名 */ …(2)

short vardcod; /* 日時,時間隔 */ …(2)

short vardpre; /* 時間隔精度 */ …(2)

short varocount; /* 選択リストの数 */

short i; /* SQL記述子域のカウンタ */

char ocdata[15]; /* CHARACTER型 */ …(3)

char CHARACTER SET IS NCHAR oncdata[21]; /* NCHAR型 */ …(3)

long oidata; /* 真数型 */ …(3)

double ofdata; /* 概数型 */ …(3)

VARCHAR oddata[20]; /* 日時,時間隔 */ …(3)

EXEC SQL END DECLARE SECTION;

void main()

{

memset(SQLSTATE, 0x00, 6); …(4)

memset(SQLMSG, 0x00, 256); …(4)

memset(&str, 0x00, sizeof(str)); …(4)

memset(varname, 0x00, 39); …(4)

memset(varchar, 0x00, 39); …(4)

memset(ocdata, 0x00, 15); …(4)

memset(oncdata, 0x00, 21); …(4)

memset(&oddata, 0x00, sizeof(oddata)); …(4)

EXEC SQL CONNECT TO DEFAULT; …(5)

EXEC SQL WHENEVER SQLERROR GOTO :ERR; …(6)

printf( "実行する動的SELECT文を指定してください \n" );

gets( str.sqlvar ); …(7)

str.sqllen = strlen( str.sqlvar );

EXEC SQL DECLARE CUR1 CURSOR FOR STMID; …(8)

EXEC SQL PREPARE STMID FROM :str; …(9)

EXEC SQL ALLOCATE DESCRIPTOR 'OUTDESC' WITH MAX 100; …(10)

EXEC SQL DESCRIBE OUTPUT STMID USING SQL DESCRIPTOR 'OUTDESC'; …(11)

/**************/

/* 選択リスト */

/**************/

EXEC SQL GET DESCRIPTOR 'OUTDESC' :varocount = COUNT; …(12)

for( i = 1; i <= varocount; i++ ) {

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(13)

:vartype = TYPE, …(13)

:varleng = LENGTH, …(13)

:varolen = OCTET_LENGTH, …(13)

:varprec = PRECISION, …(13)

:varscal = SCALE, …(13)

:varchar = CHARACTER_SET_NAME, …(13)

:vardcod = DATETIME_INTERVAL_CODE, …(13)

:vardpre = DATETIME_INTERVAL_PRECISION;…(13)

/* CHAR型かNCHAR型 */ …(14)

if( vartype == 1 || vartype == 12 ) { …(14)

/* 文字列型 */ …(14)

if( strncmp( varchar, "BASIC", 5 ) == 0 ) { …(14)

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …(14)

TYPE = 1, …(14)

LENGTH = 14, …(14)

OCTET_LENGTH = 14, …(14)

CHARACTER_SET_NAME = 'BASIC'; …(14)

} …(14)

- 114 -

/* 各国語文字列型 */ …(14)

else { …(14)

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …(14)

TYPE = 1, …(14)

LENGTH = 10, …(14)

OCTET_LENGTH = 20, …(14)

CHARACTER_SET_NAME = 'NCHAR'; …(14)

} …(14)

} …(14)

/* INTEGER型かSMALLINT型 */ …(14)

else if( vartype == 4 || vartype == 5 ) { …(14)

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …(14)

TYPE = 4, …(14)

PRECISION = 31, …(14)

SCALE = 0; …(14)

} …(14)

/* NUMERIC型かDECIMAL型かREAL型かDOUBLE PRECISION型 */ …(14)

else if( vartype == 2 || vartype == 3 || …(14)

vartype == 7 || vartype == 8 ) { …(14)

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …(14)

TYPE = 8, …(14)

PRECISION = 52, …(14)

SCALE = 0; …(14)

} …(14)

/* 日時型かINTERVAL型 */ …(14)

else if( vartype == 9 || vartype == 10 ) { …(14)

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …(14)

TYPE = 12, …(14)

LENGTH = 19, …(14)

OCTET_LENGTH = 19, …(14)

CHARACTER_SET_NAME = 'BASIC'; …(14)

} …(14)

}

EXEC SQL OPEN CUR1; …(15)

EXEC SQL WHENEVER NOT FOUND GOTO :NOTFND; …(16)

for(;;) {

EXEC SQL FETCH CUR1 INTO SQL DESCRIPTOR 'OUTDESC'; …(17)

/************/

/* 実行結果 */

/************/

for( i = 1; i <= varocount; i++ ) {

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(18)

:vartype = TYPE, …(18)

:varchar = CHARACTER_SET_NAME; …(18)

/* CHAR型かNCHAR型 */ …(18)

if( vartype == 1 ) { …(18)

/* 文字列型 */ …(18)

if( strncmp( varchar, "BASIC", 5 ) == 0 ) { …(18)

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(18)

:varname = NAME, …(18)

:ocdata = DATA; …(18)

} …(18)

/* 各国語文字列型 */ …(18)

else { …(18)

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(18)

:varname = NAME, …(18)

:oncdata = DATA; …(18)

} …(18)

} …(18)

/* 真数型 */ …(18)

else if( vartype == 4 ) { …(18)

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(18)

:varname = NAME, …(18)

- 115 -

:oidata = DATA; …(18)

} …(18)

/* 概数型 */ …(18)

else if( vartype == 8 ) { …(18)

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(18)

:varname = NAME, …(18)

:ofdata = DATA; …(18)

} …(18)

/* 日時型かINTERVAL型 */ …(18)

else if( vartype == 12 ) { …(18)

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(18)

:varname = NAME, …(18)

:oddata = DATA; …(18)

oddata.sqlvar[oddata.sqllen] = \0; …(18)

printf( "%s -> %s \n", varname, oddata.sqlvar ); …(18)

} …(18)

}

}

NOTFND:

EXEC SQL CLOSE CUR1; …(19)

EXEC SQL DEALLOCATE DESCRIPTOR 'OUTDESC'; …(20)

EXEC SQL DEALLOCATE PREPARE STMID; …(21)

EXEC SQL COMMIT WORK; …(22)

EXEC SQL DISCONNECT DEFAULT; …(23)

return;

ERR:

EXEC SQL WHENEVER SQLERROR CONTINUE;

printf( "SQLERROR SQLSTATE = %s SQLMSG = %s\n", SQLSTATE, SQLMSG );

EXEC SQL ROLLBACK WORK;

EXEC SQL DISCONNECT DEFAULT;

return;

}

(1) SQL文変数はSQL文を格納する領域です。可変長文字列は、コンパイル時に以下の構造体に展開されます。

struct {

short sqllen; /* 長さ領域の変数 */

char sqlvar[1024]; /* 文字列領域の変数 */

}str;

(2) SQL記述子域

(3) 相手指定

(4) ホスト変数を初期化します。

(5) コネクションを接続します。

(6) SQL文の実行でデータなし以外のエラーが生じた場合にERRへ進み、エラー情報を出力してプログラムは終了し

ます。

(7) 端末から入力された動的SELECT文を読み込み、strに格納します。

(8) カーソルCUR1を宣言します。カーソル指定としてSQL文識別子STMIDを指定します。

(9) strのSQL文を実行できるようにするための準備処理を行います。

(10) 相手指定のためのSQL記述子域OUTDESCを割り当てます。

(11) 入力した動的SELECT文の選択リストの情報をSQL記述子域OUTDESCに取り込みます。

(12) OUTDESCに設定されている選択リストの個数(COUNTの値)を取得します。

(13) OUTDESCに設定されているそれぞれの選択リストの情報(TYPE、LENGTH、OCTET_LENGTH、PRECISION、

SCALE、CHARACTER_SET_NAMEの値)を取得します。

(14) OUTDESCに実行結果を取り出す相手指定のデータ型を設定します。

- CHARACTER(n)、CHARACTER VARYING(n)をCHARACTER(14)に変更します。(nは文字列の長さ)

- 116 -

- NATIONAL CHARACTER(n)、NATIONAL CHARACTER VARYING(n)をNATIONAL CHARACTER(10)に変更します。(nは文字列の長さ)

- INTEGER、SMALLINTをINTEGERに変更します。

- NUMERIC(p,q)、DECIMAL(p,q)、REAL、DOUBLE PRECISIONをDOUBLE PRECISIONに変更します。(pは精度、qは位取り)

- DATE、TIME、TIMESTAMPおよびINTERVALをCHARACTER VARYING(19)に変更します。(nは文字列の

長さ)

(15) カーソルCUR1をオープンします。

(16) 検索の結果データが見つからない場合にNOTFNDに進み、プログラムは終了します。

(17) カーソルCUR1の位置づけおよびデータの読込みを行います。このとき、OUTDESCのDATAに実行結果の値が

設定されます。

(18) SQL記述子域OUTDESCからNAMEとDATAの値を取得し、それぞれ相手指定のデータ型に一致したホスト変

数に格納します。

(19) カーソルCUR1をクローズします。

(20) SQL記述子域OUTDESCを解放します。

(21) SQL文識別子STMIDに対応する被準備文を解放します。

(22) 現行のトランザクションを終了します。

(23) コネクションを切断します。

4.2.2.2 動的単一行SELECT文を準備して実行する(SQL記述子域の場合)1行のデータの取り出しを行う場合には、動的単一行SELECT文を準備して実行します。動的単一行SELECT文を実行

するには、USING句を指定したEXECUTE文を使用します。SQL記述子域を使用して、動的単一行SELECT文の指定

例を以下に示します。なお、SQL記述子域を操作するSQL文の詳細については、“図4.2 被準備文の実行結果の取り出

し手順”の例を参照してください。

端末から入力した動的単一行SELECT文の例です。

[端末から入力した動的単一行SELECT文をstrに格納]

EXEC SQL PREPARE STMID FROM :str;

EXEC SQL ALLOCATE DESCRIPTOR 'OUTDESC' WITH MAX 100;

EXEC SQL DESCRIBE OUTPUT STMID USING SQL DESCRIPTOR 'OUTDESC';

EXEC SQL GET DESCRIPTOR 'OUTDESC' :ocount = COUNT;

for( i = 1; i <= ocount; i++) {

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …

[選択リストの情報をSQL記述子域から取得]

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …

[SQL記述子域の選択リストの情報を変更]

}

EXEC SQL EXECUTE STMID INTO SQL DESCRIPTOR 'OUTDESC';

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …

[実行結果の値の取得]

EXEC SQL DEALLOCATE DESCRIPTOR 'OUTDESC';

EXEC SQL DEALLOCATE PREPARE STMID;

- 117 -

4.3 SQL文の条件を動的に変更して実行する

本節では、SQL文の条件を動的に変更して実行する方法について、以下を説明します。

・ SQLDA構造体の操作方法

- 動的SELECT文を準備して実行する(SQLDA構造体の場合)

- 動的単一行SELECT文を準備して実行する(SQLDA構造体の場合)

・ SQL記述子域の操作方法

- 動的SELECT文を準備して実行する(SQL記述子域の場合)

- 動的単一行SELECT文を準備して実行する(SQL記述子域の場合)

・ その他の被準備文を実行する

・ 変数の属性がわかっている被準備文を実行する

4.3.1 SQLDA構造体の操作方法

SQL文の条件だけを動的に変更してデータ操作を行う場合は、動的パラメタ指定を指定します。入力する値をホスト変

数に格納します。ホスト変数の値を設定するためには、動的パラメタ指定の情報をそのホスト変数の属性と一致させるこ

とが必要です。そこで、データベースからSQLDA構造体に動的パラメタ指定の情報を取り込んで、属性を変更し、値を

設定します。SQLDA構造体の位置づけを以下に示します。

SQLDA構造体は、動的パラメタ指定に関する情報を持ちます。

SQLDA構造体は、項目記述子域“SQLVAR”およびSQLVARの 大要素数“SQLN”と有効要素数“SQLD”で構成され

ています。

項目記述子域SQLVARは、動的パラメタ指定の情報を格納する配列で構成されています。SQLDは、SQLDA構造体の

動的パラメタ指定の数を示し、そのデータ型は2進の精度を持つ真数です。

SQLDA構造体の詳細については、“4.2.1 SQL文の準備とSQLDA構造体の操作”を参照してください。

動的パラメタ指定値の設定手順

USING記述子を使用して、動的パラメタ指定の値を設定する方法の順序を以下に示します。

- 118 -

図4.3 被準備文の動的パラメタ指定値の設定手順

SQLDA構造体を操作するSQL文

“図4.3 被準備文の動的パラメタ指定値の設定手順”で示したように、データベースからSQLDA構造体に動的パラメタ指

定の情報を取り込んだり、SQLDA構造体に取り込まれた動的パラメタ指定の情報を取得するには、それぞれSQL文を使

用します。SQLDA構造体を操作するSQL文とその機能について以下で説明します。

DESCRIBE文

DESCRIBE文では、PREPARE文で準備された被準備文の動的パラメタ指定の情報をSQLDA構造体に取り込みま

す。このSQL文を“入力DESCRIBE文”といいます。

SQL文識別子STM1に対応する被準備文の動的パラメタ指定の情報を、SQLDA構造体に取り込む入力DESCRIBE文の例を以下に示します。

DESCRIBE INPUT STM1 USING SQL DESCRIPTOR :INSQLDA

(1) (2)

(1) SQL文識別子

(2) SQLDA構造体

SQL文識別子STM1に対する被準備文が以下の場合、SQLDA構造体変数の内容は次のようになります。

INSERT INTO 在庫管理.在庫表(製品番号, 製品名, 在庫数量) VALUES(?, ?, ?)

(1)

(1) 動的パラメタ指定

- 119 -

- SQLD : 3

動的パラメタ指定の個数3が設定されます。

- 項目記述子域

製品番号,製品名,在庫数量の属性がそれぞれ設定されます。

- 製品番号: SMALLINT(NOT NULL制約あり)

- 製品名 : NATIONAL CHARACTER (10) (NOT NULL制約あり)

- 在庫数量: INTEGER(NOT NULL制約なし)

識別子 製品番号 製品名 在庫数量

SQLTYPE 5 11 4

SQLLEN 2 20 4

SQLPRECISION.PRECISION

15 0 31

SQLSCALE 0 0 0

SQLNULLABLE 0 0 1

SQLIND 値は設定され

ない

値は設定され

ない

値は設定されな

SQLNAME 製品番号 (注) 製品名 (注) 在庫数量 (注)

SQLPRECISION.INTERVAL.DATETIME_INTERVAL_PRECISION

0 0 0

注) 長さはSQLNAMELに格納されます。

なお、ここでは、動的パラメタ指定の情報を持つSQLDA構造体を操作するSQL文のみを説明しています。これ以外の

SQL文については、4.2.1 SQL文の準備とSQLDA構造体の操作”を参照してください。

4.3.1.1 動的SELECT文を準備して実行する(SQLDA構造体の場合)データの取り出しを連続的に行う場合には、動的SELECT文を準備して実行します。SQLDA構造体を使用して、動的パ

ラメタ指定のある動的SELECT文を実行するアプリケーションの例を以下に示します。

端末から入力した動的SELECT文の例です。端末から入力した動的パラメタ指定の値を探索条件としてデータを検

索し、その値を表示します。

SQLDA構造体(動的パラメタ指定)を使用したアプリケーションの例

#include <stdio.h>

#include <string.h>

#include "qdbnosis.h"

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

VARCHAR str[1024]; /* SQL文変数 */ …(1)

SQLDA *sqlda_in ; /* SQLDA構造体 */

SQLDA *sqlda_out; /* SQLDA構造体 */

EXEC SQL END DECLARE SECTION;

void main()

{

short vartype; /* データ型 */

short varleng; /* 文字数 */

- 120 -

short varolen; /* バイト数 */

short varprec; /* 精度 */

short varscal; /* 位取り SQL記述子域 */

char varname[129]; /* 列の名前 */

short vardcod; /* 日時,時間隔 */

short vardpre; /* 時間隔精度 */

short varicount; /* 動的パラメタ指定の数 */

short varocount; /* 選択リストの数 */

short i; /* SQL記述子域のカウンタ */

char icdata[100][15]; /* CHARACTER型 */

char incdata[100][21]; /* NCHAR型 */

long iidata[100]; /* 真数型 相手指定 */

double ifdata[100]; /* 概数型 */

char iddata[100][22]; /* 日時,時間隔 */

char ocdata[100][15]; /* CHARACTER型 */

char oncdata[100][21]; /* NCHAR型 */

long oidata[100]; /* 真数型 相手指定 */

double ofdata[100]; /* 概数型 */

char oddata[100][22]; /* 日時,時間隔 */

short inddata[100]; /* 標識変数 */

size_t size; /* SQLDAのサイズ */

memset(SQLSTATE, 0x00, 6); …(2)

memset(SQLMSG, 0x00, 256); …(2)

memset(&str, 0x00, sizeof(str)); …(2)

memset(varname, 0x00, sizeof(varname)); …(2)

memset(icdata, 0x00, sizeof(icdata)); …(2)

memset(incdata, 0x00, sizeof(incdata)); …(2)

memset(iddata, 0x00, sizeof(iddata)); …(2)

memset(ocdata, 0x00, sizeof(ocdata)); …(2)

memset(oncdata, 0x00, sizeof(oncdata)); …(2)

memset(oddata, 0x00, sizeof(oddata)); …(2)

size = sizeof(SQLDA) + sizeof(sqlvar) * (100 - 1); …(3)

sqlda_in = (SQLDA *)malloc(size);

sqlda_out = (SQLDA *)malloc(size);

memset( sqlda_in, 0x00, size );

memset( sqlda_out, 0x00, size );

sqlda_in->SQLN = 100; …(4)

sqlda_out->SQLN = 100;

EXEC SQL CONNECT TO DEFAULT; …(5)

EXEC SQL WHENEVER SQLERROR GOTO :ERR; …(6)

printf( "実行する動的SELECT文を指定してください \n" );

gets( str.sqlvar ); …(7)

str.sqllen = strlen( str.sqlvar );

EXEC SQL DECLARE CUR1 CURSOR FOR STMID; …(8)

EXEC SQL PREPARE STMID FROM :str; …(9)

EXEC SQL DESCRIBE INPUT STMID USING SQL DESCRIPTOR :sqlda_in; …(10)

EXEC SQL DESCRIBE OUTPUT STMID USING SQL DESCRIPTOR :sqlda_out; …(11)

/********************/

/* 動的パラメタ指定 */

/********************/

varicount = sqlda_in->SQLD; …(12)

for( i = 0; i < varicount; i++ ) {

vartype = sqlda_in->SQLVAR[i].SQLTYPE; …(13)

varleng = sqlda_in->SQLVAR[i].SQLLEN; …(13)

varprec = sqlda_in->SQLVAR[i].SQLPRECISION.PRECISION; …(13)

varscal = sqlda_in->SQLVAR[i].SQLSCALE; …(13)

vardcod = sqlda_in->SQLVAR[i].SQLSCALE; …(13)

vardpre = sqlda_in->SQLVAR[i].SQLPRECISION.INTERVAL. …(13)

- 121 -

DATETIME_INTERVAL_PRECISION; …(13)

memcpy( varname, sqlda_in->SQLVAR[i].SQLNAME.SQLNAMEC, …(13)

sqlda_in->SQLVAR[i].SQLNAME.SQLNAMEL ); …(13)

varname[sqlda_in->SQLVAR[i].SQLNAME.SQLNAMEL] = 0x00; …(13)

/* CHAR型 */ …(14)

if( vartype == 1 || vartype == 12 ) { …(14)

printf( "%sの値を指定してください \n", varname ); …(14)

scanf( "%s", &icdata[i][0] ); …(14)

sqlda_in->SQLVAR[i].SQLTYPE = 12; …(14)

sqlda_in->SQLVAR[i].SQLLEN = strlen( &icdata[i][0] ); …(14)

sqlda_in->SQLVAR[i].SQLDATA = (char *)&icdata[i][0]; …(14)

} …(14)

else if( vartype == 11 || vartype == 13 ) { …(14)

printf( "%sの値を指定してください \n", varname ); …(14)

scanf( "%s", &incdata[i][0] ); …(14)

sqlda_in->SQLVAR[i].SQLTYPE = 13; …(14)

sqlda_in->SQLVAR[i].SQLLEN = strlen( &incdata[i][0] ); …(14)

sqlda_in->SQLVAR[i].SQLDATA = (char *)&incdata[i][0]; …(14)

} …(14)

/* INTEGER型かSMALLINT型 */ …(14)

else if( vartype == 4 || vartype == 5 ) { …(14)

printf( "%sの値を指定してください \n", varname ); …(14)

scanf( "%ld", &iidata[i] ); …(14)

sqlda_in->SQLVAR[i].SQLTYPE = 4; …(14)

sqlda_in->SQLVAR[i].SQLLEN = 4; …(14)

sqlda_in->SQLVAR[i].SQLPRECISION.PRECISION = 31; …(14)

sqlda_in->SQLVAR[i].SQLSCALE = 0; …(14)

sqlda_in->SQLVAR[i].SQLDATA = (char *)&iidata[i]; …(14)

} …(14)

/* NUMERIC型かDECIMAL型かREAL型かDOUBLE PRECISION型 */ …(14)

else if( vartype == 2 || vartype == 3 || …(14)

vartype == 7 || vartype == 8 ) { …(14)

printf( "%sの値を指定してください \n", varname ); …(14)

scanf( "%lf", &ifdata[i] ); …(14)

sqlda_in->SQLVAR[i].SQLTYPE = 8; …(14)

sqlda_in->SQLVAR[i].SQLLEN = 8; …(14)

sqlda_in->SQLVAR[i].SQLPRECISION.PRECISION = 52; …(14)

sqlda_in->SQLVAR[i].SQLSCALE = 0; …(14)

sqlda_in->SQLVAR[i].SQLDATA = (char *)&ifdata[i]; …(14)

} …(14)

/* 日時型かINTERVAL型 */ …(14)

else if( vartype == 9 || vartype == 10 ) { …(14)

printf( "%sの値を指定してください \n", varname ); …(14)

scanf( "%s", &iddata[i][0] ); …(14)

sqlda_in->SQLVAR[i].SQLTYPE = 12; …(14)

sqlda_in->SQLVAR[i].SQLLEN = strlen( &iddata[i][0] ); …(14)

sqlda_in->SQLVAR[i].SQLDATA = (char *)&iddata[i][0]; …(14)

} …(14)

}

/**************/

/* 選択リスト */

/**************/

varocount = sqlda_out->SQLD; …(15)

for( i = 0; i < varocount; i++ ) { …(16)

vartype = sqlda_out->SQLVAR[i].SQLTYPE; …(16)

varleng = sqlda_out->SQLVAR[i].SQLLEN; …(16)

varprec = sqlda_out->SQLVAR[i].SQLPRECISION.PRECISION; …(16)

varscal = sqlda_out->SQLVAR[i].SQLSCALE; …(16)

vardcod = sqlda_out->SQLVAR[i].SQLSCALE; …(16)

vardpre = sqlda_out->SQLVAR[i].SQLPRECISION.INTERVAL. …(16)

DATETIME_INTERVAL_PRECISION;

/* CHAR型かVCHAR型 */ …(17)

if( vartype == 1 || vartype == 12 ) { …(17)

- 122 -

sqlda_out->SQLVAR[i].SQLTYPE = 1; …(17)

sqlda_out->SQLVAR[i].SQLLEN = 14; …(17)

sqlda_out->SQLVAR[i].SQLDATA = (char *)&ocdata[i][0]; …(17)

} …(17)

/* NCHAR型かNVCHAR型 */ …(17)

else if( vartype == 11 || vartype == 13 ) { …(17)

sqlda_out->SQLVAR[i].SQLTYPE = 11; …(17)

sqlda_out->SQLVAR[i].SQLLEN = 20; …(17)

sqlda_out->SQLVAR[i].SQLDATA = (char *)&oncdata[i][0]; …(17)

} …(17)

/* INTEGER型かSMALLINT型 */ …(17)

else if( vartype == 4 || vartype == 5 ) { …(17)

sqlda_out->SQLVAR[i].SQLTYPE = 4; …(17)

sqlda_out->SQLVAR[i].SQLLEN = 4; …(17)

sqlda_out->SQLVAR[i].SQLPRECISION.PRECISION = 31; …(17)

sqlda_out->SQLVAR[i].SQLSCALE = 0; …(17)

sqlda_out->SQLVAR[i].SQLDATA = (char *)&oidata[i]; …(17)

} …(17)

/* NUMERIC型かDECIMAL型かREAL型かDOUBLE PRECISION型 */ …(17)

else if( vartype == 2 || vartype == 3 || …(17)

vartype == 7 || vartype == 8 ) { …(17)

sqlda_out->SQLVAR[i].SQLTYPE = 8; …(17)

sqlda_out->SQLVAR[i].SQLLEN = 8; …(17)

sqlda_out->SQLVAR[i].SQLPRECISION.PRECISION = 52; …(17)

sqlda_out->SQLVAR[i].SQLSCALE = 0; …(17)

sqlda_out->SQLVAR[i].SQLDATA = (char *)&ofdata[i]; …(17)

} …(17)

/* 日時型かINTERVAL型 */ …(17)

else if( vartype == 9 || vartype == 10 ) { …(17)

sqlda_out->SQLVAR[i].SQLTYPE = 12; …(17)

sqlda_out->SQLVAR[i].SQLLEN = 21; …(17)

sqlda_out->SQLVAR[i].SQLDATA = (char *)&oddata[i][0]; …(17)

} …(17)

}

EXEC SQL OPEN CUR1 USING SQL DESCRIPTOR :sqlda_in; …(18)

EXEC SQL WHENEVER NOT FOUND GOTO :NOTFND; …(19)

for(;;) {

EXEC SQL FETCH CUR1 INTO SQL DESCRIPTOR :sqlda_out; …(20)

/************/

/* 実行結果 */

/************/

for( i = 0; i < varocount; i++ ) {

vartype = sqlda_out->SQLVAR[i].SQLTYPE;

memcpy( varname, sqlda_out->SQLVAR[i].SQLNAME.SQLNAMEC,

sqlda_out->SQLVAR[i].SQLNAME.SQLNAMEL );

varname[sqlda_out->SQLVAR[i].SQLNAME.SQLNAMEL] = 0x00;

/* CHAR型 */

if( vartype == 1 ) {

printf( "%s -> %s ", varname, &ocdata[i][0] );

}

/* NCHAR型 */

else if( vartype == 11 ) {

printf( "%s -> %s ", varname, &oncdata[i][0] );

}

/* 真数型 */

else if( vartype == 4 ) {

printf( "%s -> %d ", varname, oidata[i] );

}

/* 概数型 */

else if( vartype == 8 ) {

printf( "%s -> %lf ", varname, ofdata[i] );

}

- 123 -

/* 日時型かINTERVAL型 */

else if( vartype == 12 ) {

printf( "%s -> %s ", varname, &oddata[i][2] );

}

}

printf( "\n" );

}

NOTFND:

EXEC SQL CLOSE CUR1; …(21)

EXEC SQL DEALLOCATE PREPARE STMID; …(22)

EXEC SQL COMMIT WORK; …(23)

EXEC SQL DISCONNECT DEFAULT; …(24)

free( sqlda_in );

free( sqlda_out );

return;

ERR:

EXEC SQL WHENEVER SQLERROR CONTINUE;

printf( "SQLERROR SQLSTATE = %s SQLMSG = %s\n", SQLSTATE, SQLMSG );

EXEC SQL ROLLBACK WORK;

EXEC SQL DISCONNECT DEFAULT;

free( sqlda_in );

free( sqlda_out );

return;

}

(1) SQL文変数はSQL文を格納する領域です。可変長文字列は、コンパイル時に以下の構造体に展開されます。

struct {

short sqllen; /* 長さ領域の変数 */

char sqlvar[100]; /* 文字列領域の変数 */

}str;

(2) ホスト変数を初期化します。

(3) SQLDA構造体の領域を獲得します。

(4) 配列SQLVARの配列数(SQLNの値)を指定します。

(5) コネクションを接続します。

(6) SQL文の実行でデータなし以外のエラーが生じた場合にERRへ進み、エラー情報を出力してプログラムは終了し

ます。

(7) 端末から入力された動的SELECT文を読み込み、strに格納します。

(8) カーソルCUR1を宣言します。カーソル指定としてSQL文識別子STMIDを指定します。

(9) strのSQL文を実行できるようにするための準備処理を行います。

(10) 入力した動的SELECT文の動的パラメタ指定の情報をSQLDA構造体(sqlda_in)に取り込みます。

(11) 入力した動的SELECT文の選択リストの情報をSQLDA構造体(sqlda_out)に取り込みます。

(12) SQLDA構造体(sqlda_in)に設定されている選択リストの個数(SQLDの値)を取得します。

(13) SQLDA構造体 (sqlda_in)に設定されているおのおのの動的パラメタ指定の情報 (SQLTYPE、SQLLEN、

SQLPRECISION、SQLSCALE、DATETIME_INTERVAL_CODE、DATETIME_INTERVAL_PRECISIONの値)を取得します。

(14) SQLDA構造体(sqlda_in)に設定されている動的パラメタ指定のデータ型を変更し、端末から読み込んだ動的パ

ラメタ指定の値を設定します。

- CHARACTER(n)、CHARACTER VARYING(n)をCHARACTER(14)に変更します。(nは文字列の長さ)

- NATIONAL CHARACTER(n)、NATIONAL CHARACTER VARYING(n)をNATIONAL CHARACTER(10)に変更します。(nは文字列の長さ)

- INTEGER、SMALLINTをINTEGERに変更します。

- 124 -

- NUMERIC(p,q)、DECIMAL(p,q)、REAL、DOUBLE PRECISIONをDOUBLE PRECISIONに変更します。(pは精度、qは位取り)

- DATE、TIME、TIMESTAMPおよびINTERVALをCHARACTER VARYING(19)に変更します。(nは文字列の

長さ)

(15) SQLDA構造体に設定されている選択リストの個数(SQLDの値)を取得します。

(16) SQLDA構造体に設定されているそれぞれの選択リストの情報 (SQLTYPE、SQLLEN、SQLPRECISION、

SQLSCALEの値)を取得します。

(17) SQLDA構造体に実行結果を取り出す相手指定のデータ型や変数アドレスを設定します。

- CHARACTER(n)、CHARACTER VARYING(n)をCHARACTER(14)に変更します。(nは文字列の長さ)

- NATIONAL CHARACTER(n)、NATIONAL CHARACTER VARYING(n)をNATIONAL CHARACTER(10)に変更します。(nは文字列の長さ)

- INTEGER、SMALLINTをINTEGERに変更します。

- NUMERIC(p,q)、DECIMAL(p,q)、REAL、DOUBLE PRECISIONをDOUBLE PRECISIONに変更します。(pは精度、qは位取り)

- DATE、TIME、TIMESTAMPおよびINTERVALをCHARACTER VARYING(19)に変更します。(nは文字列の

長さ)

(18) (14)の値を使用して、カーソルCUR1をオープンします。

(19) 検索の結果データが見つからない場合にNOTFNDに進み、プログラムは終了します。

(20) カーソルCUR1の位置づけおよびデータの読み込みを行います。このとき、SQLDA構造体(sqlda_out)のSQLDATAに設定したアドレスに実行結果の値が設定されます。

(21) カーソルCUR1をクローズします。

(22) SQL文識別子STMIDに対応する被準備文を解放します。

(23) 現行のトランザクションを終了します。

(24) コネクションを切断します。

4.3.1.2 動的単一行SELECT文を準備して実行する(SQLDA構造体の場合)1行のデータの取り出しを行う場合には、動的単一行SELECT文を準備して実行します。動的単一行SELECT文を実行

するには、USING句を指定したEXECUTE文を使用します。

SQLDA構造体を使用して、動的パラメタ指定のある動的単一行SELECT文の指定例を以下に示します。なお、SQLDA構造体を操作するSQL文の詳細については、“図4.3 被準備文の動的パラメタ指定値の設定手順”の例を参照してくだ

さい。

端末から入力した動的単一行SELECT文の例です。端末から入力した動的パラメタ指定の値を探索条件としてデー

タを検索します。

[端末から入力した動的単一行SELECT文をstrに格納]

EXEC SQL PREPARE STMID FROM :str;

size = sizeof(SQLDA) + sizeof(sqlvar) * (100 - 1);

sqlda_in = (SQLDA *)malloc(size);

sqlda_out = (SQLDA *)malloc(size);

EXEC SQL DESCRIBE INPUT STMID USING SQL DESCRIPTOR :sqlda_in;

EXEC SQL DESCRIBE OUTPUT STMID USING SQL DESCRIPTOR :sqlda_out;

icount = sqlda_in->SQLD;

for( i = 0; i < icount; i++ ){

vartype = sqlda_in->SQLVAR[i].SQLTYPE;

varleng = sqlda_in->SQLVAR[i].SQLLEN;

[動的パラメタ指定の情報をSQLDA構造体から取得]

- 125 -

sqlda_in->SQLVAR[i].SQLTYPE = 1;

sqlda_in->SQLVAR[i].SQLLEN = 14;

[端末から入力した動的パラメタ指定の値をSQLDA構造体に設定]

}

ocount = sqlda_in->SQLD;

for( i = 0; i < ocount; i++ ){

vartype = sqlda_out->SQLVAR[i].SQLTYPE;

varleng = sqlda_out->SQLVAR[i].SQLLEN;

[選択リストの情報をSQLDA構造体から取得]

sqlda_out->SQLVAR[i].SQLTYPE = 1;

sqlda_out->SQLVAR[i].SQLLEN = 14;

[SQLDA構造体の選択リストの情報を変更]

}

EXEC SQL EXECUTE STMID INTO SQL DESCRIPTOR :sqlda_out

USING SQL DESCRIPTOR :sqlda_in;

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i

[実行結果の値の取得]

free( sqlda_in );

free( sqlda_out );

EXEC SQL DEALLOCATE PREPARE STMID;

4.3.2 SQL記述子域の操作方法

SQL文の条件だけを動的に変更してデータ操作を行う場合は、動的パラメタ指定を指定します。入力する値をホスト変

数に格納します。ホスト変数の値を設定するためには、動的パラメタ指定の情報をそのホスト変数の属性と一致させるこ

とが必要です。そこで、データベースからSQL記述子域に動的パラメタ指定の情報を取り込んで、属性を変更し、値を設

定します。SQL記述子域の位置づけを以下に示します。

SQL記述子域は、識別子COUNTと0以上の項目記述子域(SQL記述子域の各要素)で構成されています。COUNTは、

SQL記述子域の動的パラメタ指定の数を示し、そのデータ型は2進の精度を持つ真数です。以下の図では、SQL記述子

域の動的パラメタ指定の数をnで表しています。

- 126 -

SQL記述子域の詳細については、“4.2.2 SQL文の準備とSQL記述子域の操作”を参照してください。

動的パラメタ指定値の設定手順

USING記述子を使用して、動的パラメタ指定の値を設定する方法の順序を以下に示します。

図4.4 被準備文の動的パラメタ指定値の設定手順

SQL記述子域を操作するSQL文

“図4.4 被準備文の動的パラメタ指定値の設定手順”で示したように、データベースからSQL記述子域に動的パラメタ指

定の情報を取り込んだり、SQL記述子域に取り込まれた動的パラメタ指定の情報を取得するには、それぞれSQL文を使

用します。SQL記述子域を操作するSQL文とその機能について以下で説明します。

- 127 -

DESCRIBE文

DESCRIBE文では、PREPARE文で準備された被準備文の動的パラメタ指定の情報をSQL記述子域に取り込みま

す。このSQL文を“入力DESCRIBE文”といいます。DESCRIBE文で指定した記述子名が動的OPEN文に指定されて

いる場合、カーソルは閉じられた状態であることが必要です。

SQL文識別子STM1に対応する被準備文の動的パラメタ指定の情報を、SQL記述子域に取り込む入力DESCRIBE文の例を以下に示します。

DESCRIBE INPUT STM1 USING SQL DESCRIPTOR 'DESC1'

(1) (2)

(1) SQL文識別子

(2) 記述子名

SQL文識別子STM1に対する被準備文が以下の場合、SQL記述子域DESC1の内容は次のようになります。

INSERT INTO 在庫管理.在庫表(製品番号, 製品名, 在庫数量) VALUES(?, ?, ?)

(1)

(1) 動的パラメタ指定

- COUNT : 3

動的パラメタ指定の個数3が設定されます。

- 項目記述子域

製品番号、製品名、在庫数量の属性がそれぞれ設定されます。

- 製品番号: SMALLINT(NOT NULL制約あり)

- 製品名 : NATIONAL CHARACTER (10) (NOT NULL制約あり)

- 在庫数量: INTEGER(NOT NULL制約なし)

識別子 製品番号 製品名 在庫数量

TYPE 5 1 4

LENGTH 2 10 4

OCTET_LENGTH 2 20 4

PRECISION 15 0 31

SCALE 0 0 0

NULLABLE 0 0 1

INDICATOR値は設定されな

値は設定されな

い値は設定されない

DATA値は設定されな

値は設定されな

い値は設定されない

NAME 製品番号 (注) 製品名 (注) 在庫数量 (注)

CHARACTER_SET_NAME 38バイトの空白 NCHAR (注) 38バイトの空白

DATETIME_INTERVAL_CODE

0 0 0

DATETIME_INTERVAL_PRECISION

0 0 0

注) 38バイトに満たない場合は、残りの部分に空白が設定されます。

DESCRIPTOR取得文

DESCRIPTOR取得文では、SQL記述子域に設定されている情報をホスト変数に取り出します。ホスト変数のデータ

型は、取得識別子に対応するデータ型と一致していることが必要です。

- 128 -

動的パラメタ指定の個数を、ホスト変数varcountに取得する例を以下に示します。

GET DESCRIPTOR 'DESC1' :varcount = COUNT

(1) (2) (3)

(1) 記述子名

(2) 単純相手指定

(3) 取得識別子

SQL記述子域に設定されている動的パラメタ指定の内容を、それぞれホスト変数vartype、varleng、varoctetに取得す

る例を以下に示します。また、取得する項目記述子域の要素番号はvarwcountに設定されている値とします。

GET DESCRIPTOR 'DESC1' VALUE :varwcount :vartype = TYPE,

(1) (2) (3) (4)

:varleng = LENGTH, :varoctet = OCTET_LENGTH

(3) (4) (3) (4)

(1) 記述子名

(2) SQLVAR取得番号

(3) 単純相手指定

(4) 取得識別子

DESCRIPTOR設定文

DESCRIPTOR設定文では、動的パラメタ指定のデータ型と値をSQL記述子域に設定します。定数またはホスト変数

で指定します。ホスト変数のデータ型は、それぞれ設定識別子のデータ型と一致していることが必要です。また、

DESCRIPTOR設定文で指定した記述子名が動的OPEN文に指定されている場合、カーソルは閉じられた状態であ

ることが必要です。

SQL記述子域の動的パラメタ指定のデータ型を変更し、値を設定する例を以下に示します。ここでは、設定を行う値

が格納されているホスト変数vardataのデータ型が、CHARACTER(11)と宣言されているとします。したがって、動的パ

ラメタ指定のデータ型をCHARACTER(10)に変更します。設定を行う項目記述子域の要素番号はvarwcountに設定

されている値とします。

SET DESCRIPTOR 'DESC1' VALUE :varwcount TYPE = 1,

(1) (2) (3) (4)

LENGTH = 10, OCTET_LENGTH = 10, DATA = :vardata

(3) (4) (3) (4) (3) (4)

(1) 記述子名

(2) SQLVAR設定番号

(3) 設定識別子

(4) 単純値指定

なお、ここでは、動的パラメタ指定の情報を持つSQL記述子域を操作するSQL文のみを説明しています。これ以外のSQL文については、“4.2.2 SQL文の準備とSQL記述子域の操作”を参照してください。

4.3.2.1 動的SELECT文を準備して実行する(SQL記述子域の場合)データの取り出しを連続的に行う場合には、動的SELECT文を準備して実行します。

SQL記述子域を使用して、動的パラメタ指定のある動的SELECT文を実行するアプリケーションの例を以下に示します。

端末から入力した動的SELECT文の例です。端末から入力した動的パラメタ指定の値を探索条件としてデータを検

索し、その値を表示します。

- 129 -

SQL記述子域(動的パラメタ指定)を使用したアプリケーションの例

#include <stdio.h>

#include <string.h>

EXEC SQL BEGIN DECLARE SECTION;

EXEC SQL INCLUDE varfile.h; …(1)

EXEC SQL END DECLARE SECTION;

void main()

{

memset(SQLSTATE, 0x00, 6); …(2)

memset(SQLMSG, 0x00, 256); …(2)

memset(&str, 0x00, sizeof(str)); …(2)

memset(varname, 0x00, 39); …(2)

memset(varchar, 0x00, 39); …(2)

memset(&icdata, 0x00, sizeof(icdata)); …(2)

memset(&incdata, 0x00, sizeof(incdata)); …(2)

memset(&iddata, 0x00, sizeof(iddata)); …(2)

memset(ocdata, 0x00, 15); …(2)

memset(oncdata, 0x00, sizeof(oncdata)); …(2)

memset(&oddata, 0x00, sizeof(oddata)); …(2)

EXEC SQL CONNECT TO DEFAULT; …(3)

EXEC SQL WHENEVER SQLERROR GOTO :ERR; …(4)

printf( "実行する動的SELECT文を指定してください \n" );

gets( str.sqlvar ); …(5)

str.sqllen = strlen( str.sqlvar );

EXEC SQL DECLARE CUR1 CURSOR FOR STMID; …(6)

EXEC SQL PREPARE STMID FROM :str; …(7)

EXEC SQL ALLOCATE DESCRIPTOR 'INDESC' WITH MAX 100; …(8)

EXEC SQL ALLOCATE DESCRIPTOR 'OUTDESC' WITH MAX 100; …(9)

EXEC SQL DESCRIBE INPUT STMID USING SQL DESCRIPTOR 'INDESC'; …(10)

EXEC SQL DESCRIBE OUTPUT STMID USING SQL DESCRIPTOR 'OUTDESC'; …(11)

/********************/

/* 動的パラメタ指定 */

/********************/

EXEC SQL GET DESCRIPTOR 'INDESC' :varicount = COUNT; …(12)

for( i = 1; i <= varicount; i++ ) {

EXEC SQL GET DESCRIPTOR 'INDESC' VALUE :i …(13)

:vartype = TYPE, …(13)

:varleng = LENGTH, …(13)

:varolen = OCTET_LENGTH, …(13)

:varprec = PRECISION, …(13)

:varscal = SCALE, …(13)

:varname = NAME, …(13)

:varchar = CHARACTER_SET_NAME, …(13)

:vardcod = DATETIME_INTERVAL_CODE, …(13)

:vardpre = DATETIME_INTERVAL_PRECISION; …(13)

/* CHAR型かNCHAR型 */ …(14)

if( vartype == 1 || vartype == 12 ) { …(14)

/* 文字列型 */ …(14)

if( strncmp( varchar, "BASIC", 5 ) == 0 ) { …(14)

printf( "%sの値を指定してください \n", varname ); …(14)

scanf( "%s", icdata.sqlvar ); …(14)

icdata.sqllen = strlen( icdata.sqlvar ); …(14)

EXEC SQL SET DESCRIPTOR 'INDESC' VALUE :i …(14)

TYPE = 1, …(14)

LENGTH = 14, …(14)

OCTET_LENGTH = 14, …(14)

CHARACTER_SET_NAME = 'BASIC', …(14)

DATA = :icdata; …(14)

- 130 -

} …(14)

/* 各国語文字列型 */ …(14)

else { …(14)

printf( "%sの値を指定してください \n", varname ); …(14)

scanf( "%s", incdata.sqlvar ); …(14)

incdata.sqllen = strlen( incdata.sqlvar ); …(14)

EXEC SQL SET DESCRIPTOR 'INDESC' VALUE :i …(14)

TYPE = 1, …(14)

LENGTH = 10, …(14)

OCTET_LENGTH = 20, …(14)

CHARACTER_SET_NAME = 'NCHAR', …(14)

DATA = :incdata; …(14)

} …(14)

} …(14)

/* INTEGER型かSMALLINT型 */ …(14)

else if( vartype == 4 || vartype == 5 ) { …(14)

printf( "%sの値を指定してください \n", varname ); …(14)

scanf( "%ld", &iidata ); …(14)

EXEC SQL SET DESCRIPTOR 'INDESC' VALUE :i …(14)

TYPE = 4, …(14)

PRECISION = 31, …(14)

SCALE = 0, …(14)

INDICATOR = 0, …(14)

DATA = :iidata; …(14)

} …(14)

/* NUMERIC型かDECIMAL型かREAL型かDOUBLE PRECISION型 */ …(14)

else if( vartype == 2 || vartype == 3 || …(14)

vartype == 7 || vartype == 8 ) { …(14)

printf( "%sの値を指定してください \n", varname ); …(14)

scanf( "%lf", &ifdata ); …(14)

EXEC SQL SET DESCRIPTOR 'INDESC' VALUE :i …(14)

TYPE = 8, …(14)

PRECISION = 52, …(14)

SCALE = 0, …(14)

DATA = :ifdata; …(14)

} …(14)

/* 日時型かINTERVAL型 */ …(14)

else if( vartype == 9 || vartype == 10 ) { …(14)

printf( "%sの値を指定してください \n", varname ); …(14)

scanf( "%s", iddata.sqlvar ); …(14)

iddata.sqllen = strlen( iddata.sqlvar ); …(14)

EXEC SQL SET DESCRIPTOR 'INDESC' VALUE :i …(14)

TYPE = 12, …(14)

LENGTH = 19, …(14)

OCTET_LENGTH = 19, …(14)

CHARACTER_SET_NAME = 'BASIC', …(14)

DATA = :iddata; …(14)

} …(14)

}

/**************/

/* 選択リスト */

/**************/

EXEC SQL GET DESCRIPTOR 'OUTDESC' :varocount = COUNT; …(15)

for( i = 1; i <= varocount; i++ ) {

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i

:vartype = TYPE, …(16)

:varleng = LENGTH, …(16)

:varolen = OCTET_LENGTH, …(16)

:varprec = PRECISION, …(16)

:varscal = SCALE, …(16)

:varchar = CHARACTER_SET_NAME, …(16)

:vardcod = DATETIME_INTERVAL_CODE, …(16)

:vardpre = DATETIME_INTERVAL_PRECISION; …(16)

- 131 -

/* CHAR型かNCHAR型 */ …(17)

if( vartype == 1 || vartype == 12 ) { …(17)

/* 文字列型 */ …(17)

if( strncmp( varchar, "BASIC", 5 ) == 0 ) { …(17)

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …(17)

TYPE = 1, …(17)

LENGTH = 14, …(17)

OCTET_LENGTH = 14, …(17)

CHARACTER_SET_NAME = 'BASIC'; …(17)

} …(17)

/* 各国語文字列型 */ …(17)

else { …(17)

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …(17)

TYPE = 1, …(17)

LENGTH = 10, …(17)

OCTET_LENGTH = 20, …(17)

CHARACTER_SET_NAME = 'NCHAR'; …(17)

} …(17)

} …(17)

/* INTEGER型かSMALLINT型 */ …(17)

else if( vartype == 4 || vartype == 5 ) { …(17)

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …(17)

TYPE = 4, …(17)

PRECISION = 31, …(17)

SCALE = 0; …(17)

} …(17)

/* NUMERIC型かDECIMAL型かREAL型かDOUBLE PRECISION型 */ …(17)

else if( vartype == 2 || vartype == 3 || …(17)

vartype == 7 || vartype == 8 ) { …(17)

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …(17)

TYPE = 8, …(17)

PRECISION = 52, …(17)

SCALE = 0; …(17)

} …(17)

/* 日時型かINTERVAL型 */ …(17)

else if( vartype == 9 || vartype == 10 ) { …(17)

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …(17)

TYPE = 12, …(17)

LENGTH = 19, …(17)

OCTET_LENGTH = 19, …(17)

CHARACTER_SET_NAME = 'BASIC'; …(17)

} …(17)

}

EXEC SQL OPEN CUR1 USING SQL DESCRIPTOR 'INDESC'; …(18)

EXEC SQL WHENEVER NOT FOUND GOTO :NOTFND; …(19)

for(;;) {

EXEC SQL FETCH CUR1 INTO SQL DESCRIPTOR 'OUTDESC'; …(20)

/************/

/* 実行結果 */

/************/

for( i = 1; i <= varocount; i++ ) {

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(21)

:vartype = TYPE, …(21)

:varchar = CHARACTER_SET_NAME; …(21)

/* CHAR型かNCHAR型 */ …(21)

if( vartype == 1 ) { …(21)

/* 文字列型 */ …(21)

if( strncmp( varchar, "BASIC", 5 ) == 0 ) { …(21)

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(21)

:varname = NAME, …(21)

:ocdata = DATA; …(21)

printf( "%s -> %s ", varname, ocdata ); …(21)

} …(21)

- 132 -

/* 各国語文字列型 */ …(21)

else { …(21)

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(21)

:varname = NAME, …(21)

:oncdata = DATA; …(21)

printf( "%s -> %s ", varname, oncdata ); …(21)

} …(21)

} …(21)

/* 真数型 */ …(21)

else if( vartype == 4 ) { …(21)

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(21)

:varname = NAME, …(21)

:oidata = DATA; …(21)

printf( "%s -> %d ", varname, oidata ); …(21)

} …(21)

/* 概数型 */ …(21)

else if( vartype == 8 ) { …(21)

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(21)

:varname = NAME, …(21)

:ofdata = DATA; …(21)

printf( "%s -> %lf ", varname, ofdata ); …(21)

} …(21)

/* 日時型かINTERVAL型 */ …(21)

else if( vartype == 12 ) { …(21)

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …(21)

:varname = NAME, …(21)

:oddata = DATA; …(21)

oddata.sqlvar[oddata.sqllen] = \0; …(21)

printf( "%s -> %s \n", varname, oddata.sqlvar ); …(21)

} …(21)

}

printf( "\n" );

}

NOTFND:

EXEC SQL CLOSE CUR1; …(22)

EXEC SQL DEALLOCATE DESCRIPTOR 'INDESC'; …(23)

EXEC SQL DEALLOCATE DESCRIPTOR 'OUTDESC'; …(24)

EXEC SQL DEALLOCATE PREPARE STMID; …(25)

EXEC SQL COMMIT WORK; …(26)

EXEC SQL DISCONNECT DEFAULT; …(27)

return;

ERR:

EXEC SQL WHENEVER SQLERROR CONTINUE;

printf( "SQLERROR SQLSTATE = %s SQLMSG = %s\n", SQLSTATE, SQLMSG );

EXEC SQL ROLLBACK WORK;

EXEC SQL DISCONNECT DEFAULT;

return;

}

(1) インクルードファイルvarfile.hのホスト変数を展開します。SQL文変数はSQL文を格納する領域です。可変長文字

列は、コンパイル時に以下の構造体に展開されます。

struct {

short sqllen; /* 長さ領域の変数 */

char sqlvar[100]; /* 文字列領域の変数 */

}str;

(2) ホスト変数を初期化します。

(3) コネクションを接続します。

(4) SQL文の実行でデータなし以外のエラーが生じた場合にERRへ進み、エラー情報を出力してプログラムは終了し

ます。

(5) 端末から入力された動的SELECT文を読み込み、strに格納します。

- 133 -

(6) カーソルCUR1を宣言します。カーソル指定としてSQL文識別子STMIDを指定します。

(7) strのSQL文を実行できるようにするための準備処理を行います。

(8) 動的パラメタ指定のためのSQL記述子域INDESCを割り当てます。

(9) 相手指定のためのSQL記述子域OUTDESCを割り当てます。

(10) 入力した動的SELECT文の動的パラメタ指定の情報をSQL記述子域INDESCに取り込みます。

(11) 入力した動的SELECT文の選択リストの情報をSQL記述子域OUTDESCに取り込みます。

(12) INDESCに設定されている動的パラメタ指定の個数(COUNTの値)を取得します。

(13) INDESCに設定されているおのおのの動的パラメタ指定の情報(TYPE、LENGTH、OCTET_LENGTH、

RECISION 、 SCALE 、 CHARACTER_SET_NAME 、 DATETIME_INTERVAL_CODE、DATETIME_INTERVAL_PRECISIONの値)を取得します。

(14) INDESCに設定されている動的パラメタ指定のデータ型を変更し、端末から読み込んだ動的パラメタ指定の値を

設定します。

- CHARACTER(n)、CHARACTER VARYING(n)をCHARACTER(14)に変更します。(nは文字列の長さ)

- NATIONAL CHARACTER(n)、NATIONAL CHARACTER VARYING(n)をNATIONAL CHARACTER(10)に変更します。(nは文字列の長さ)

- INTEGER、SMALLINTをINTEGERに変更します。

- NUMERIC(p,q)、DECIMAL(p,q)、REAL、DOUBLE PRECISIONをDOUBLE PRECISIONに変更します。(pは精度、qは位取り)

- DATE、TIME、TIMESTAMPおよびINTERVALをCHARACTER VARYING(19)に変更します。(nは文字列の

長さ)

(15) OUTDESCに設定されている選択リストの個数(COUNTの値)を取得します。

(16) OUTDESCに設定されているおのおのの選択リストの情報(TYPE、LENGTH、OCTET_LENGTH、PRECISION、

SCALE、CHARACTER_SET_NAME、DATETIME_INTERVAL_CODE、DATETIME_INTERVAL_PRECISIONの値)を取得します。

(17) OUTDESCに実行結果を取り出す相手指定のデータ型を設定します。

- CHARACTER(n)、CHARACTER VARYING(n)をCHARACTER(14)に変更します。(nは文字列の長さ)

- NATIONAL CHARACTER(n)、NATIONAL CHARACTER VARYING(n)をNATIONAL CHARACTER(10)に変更します。(nは文字列の長さ)

- INTEGER、SMALLINTをINTEGERに変更します。

- NUMERIC(p,q)、DECIMAL(p,q)、REAL、DOUBLE PRECISIONをDOUBLE PRECISIONに変更します。(pは精度、qは位取り)

- DATE、TIME、TIMESTAMPおよびINTERVALをCHARACTER VARYING(19)に変更します。(nは文字列の

長さ)

(18) (14)の値を使用して、カーソルCUR1をオープンします。

(19) 検索の結果データが見つからない場合にNOTFNDに進み、プログラムは終了します。

(20) カーソルCUR1の位置づけおよびデータの読み込みを行います。このとき、OUTDESCのDATAに実行結果の値

が設定されます。

(21) SQL記述子域OUTDESCからNAMEとDATAの値を取得し、それぞれ相手指定のデータ型に一致したホスト変

数に格納します。実行結果を端末に出力します。

(22) カーソルCUR1をクローズします。

(23) SQL記述子域INDESCを解放します。

(24) SQL記述子域OUTDESCを解放します。

(25) SQL文識別子STMIDに対応する被準備文を解放します。

- 134 -

(26) 現行のトランザクションを終了します。

(27) コネクションを切断します。

インクルードファイル“varfile.h”

/************************/

/* ホスト変数の定義開始 */

/************************/

char SQLSTATE[6];

char SQLMSG[256];

VARCHAR str[100]; /* SQL文変数 */

short vartype; /* データ型 */ …(1)

short varleng; /* 文字数 */ …(1)

short varolen; /* バイト数 */ …(1)

short varprec; /* 精度 */ …(1)

short varscal; /* 位取り */ …(1)

char varname[39]; /* 列の名前 */ …(1)

char varchar[39]; /* 文字セット名 */ …(1)

short vardcod; /* 日時,時間隔 */ …(1)

short vardpre; /* 時間隔精度 */ …(1)

short varicount; /* 動的パラメタ指定の数 */

short varocount; /* 選択リストの数 */

short i; /* SQL記述子域のカウンタ */

VARCHAR icdata[15]; /* CHARACTER型 */ …(2)

VARCHAR CHARACTER SET IS NCHAR incdata[21];/* NCHAR型 */ …(2)

long iidata; /* 真数型 */ …(2)

double ifdata; /* 概数型 */ …(2)

VARCHAR iddata[20]; /* 日時,時間隔 */ …(2)

char ocdata[15]; /* CHARACTER型 */ …(3)

char CHARACTER SET IS NCHAR oncdata[21]; /* NCHAR型 */ …(3)

long oidata; /* 真数型 */ …(3)

double ofdata; /* 概数型 */ …(3)

VARCHAR oddata[20]; /* 日時,時間隔 */ …(3)

/************************/

/* ホスト変数の定義終了 */

/************************/

(1) SQL記述子域

(2) 動的パラメタ指定

(3) 相手指定

備考.このアプリケーションの実行が正常に終了したときの出力例のイメージを以下に示します。ゴシック体の文字列

が入力されたものとします。

実行する動的SELECT文を指定してください

SELECT * FROM 在庫管理.在庫表 WHERE 在庫数量 < ?

在庫数量の値を指定してください

10

製品番号 -> 212 製品名 -> テレビ 在庫数量 -> 0 倉庫番号 -> 2

製品番号 -> 215 製品名 -> ビデオ 在庫数量 -> 5 倉庫番号 -> 2

製品番号 -> 226 製品名 -> 冷蔵庫 在庫数量 -> 8 倉庫番号 -> 1

4.3.2.2 動的単一行SELECT文を準備して実行する(SQL記述子域の場合)1行のデータの取り出しを行う場合には、動的単一行SELECT文を準備して実行します。動的単一行SELECT文を実行

するには、USING句を指定したEXECUTE文を使用します。SQL記述子域を使用して、動的パラメタ指定のある動的単

- 135 -

一行SELECT文の指定例を以下に示します。なお、SQL記述子域を操作するSQL文の詳細については、“図4.4 被準備

文の動的パラメタ指定値の設定手順”の例を参照してください。

端末から入力した動的単一行SELECT文の例です。端末から入力した動的パラメタ指定の値を探索条件としてデー

タを検索します。

[端末から入力した動的単一行SELECT文をstrに格納]

EXEC SQL PREPARE STMID FROM :str;

EXEC SQL ALLOCATE DESCRIPTOR 'INDESC' WITH MAX 100;

EXEC SQL ALLOCATE DESCRIPTOR 'OUTDESC' WITH MAX 100;

EXEC SQL DESCRIBE INPUT STMID USING SQL DESCRIPTOR 'INDESC';

EXEC SQL DESCRIBE OUTPUT STMID USING SQL DESCRIPTOR 'OUTDESC';

EXEC SQL GET DESCRIPTOR 'INDESC' :icount = COUNT;

for( i = 1; i <= icount; i++ ) {

EXEC SQL GET DESCRIPTOR 'INDESC' VALUE :i …

[動的パラメタ指定の情報をSQL記述子域から取得]

EXEC SQL SET DESCRIPTOR 'INDESC' VALUE :i …

[端末から入力した動的パラメタ指定の値をSQL記述子域に設定]

}

EXEC SQL GET DESCRIPTOR 'OUTDESC' :ocount = COUNT;

for( i = 1; i <= ocount; i++ ) {

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …

[選択リストの情報をSQL記述子域から取得]

EXEC SQL SET DESCRIPTOR 'OUTDESC' VALUE :i …

[SQL記述子域の選択リストの情報を変更]

}

EXEC SQL EXECUTE STMID INTO SQL DESCRIPTOR 'OUTDESC'

USING SQL DESCRIPTOR 'INDESC';

EXEC SQL GET DESCRIPTOR 'OUTDESC' VALUE :i …

[実行結果の値の取得]

EXEC SQL DEALLOCATE DESCRIPTOR 'INDESC';

EXEC SQL DEALLOCATE DESCRIPTOR 'OUTDESC';

EXEC SQL DEALLOCATE PREPARE STMID;

4.3.3 その他の被準備文を実行する

データの挿入や更新などの操作を動的パラメタ指定を指定して行うには、USING句を指定したEXECUTE文を使用しま

す。EXECUTE文で実行できる被準備文は、動的SELECT文以外の準備可能文です。準備可能文の詳細については、

“4.1 動的SQLの概念”を参照してください。

SQL文変数の内容が準備可能動的UPDATE文:位置づけまたは準備可能動的DELETE文:位置づけの場合は、事前に

対応するカーソルをオープンしておくことが必要です。また、指定したカーソルは動的カーソルであることが必要です。

SQLDA構造体の場合

動的パラメタ指定のあるUPDATE文:探索の指定例を以下に示します。なお、SQLDA構造体を操作するSQL文の詳細

については、“図4.3 被準備文の動的パラメタ指定値の設定手順”の例を参照してください。

- 136 -

端末から入力したUPDATE文:探索の例です。端末から入力した動的パラメタ指定の値を設定句としてデータを更新

します。

[端末から入力したUPDATE文:探索をstrに格納]

EXEC SQL PREPARE STMID FROM :str;

size = sizeof(SQLDA) + sizeof(sqlvar) * (100 - 1);

sqlda_in = (SQLDA *)malloc(size);

EXEC SQL DESCRIBE INPUT STMID USING SQL DESCRIPTOR :sqlda_in;

icount = sqlda_in->SQLD;

for( i = 0; i < icount; i++ ) {

vartype = sqlda_in->SQLVAR[i].SQLTYPE;

varleng = sqlda_in->SQLVAR[i].SQLLEN;

[動的パラメタ指定の情報をSQLDA構造体から取得]

sqlda_in->SQLVAR[i].SQLTYPE = 1;

sqlda_in->SQLVAR[i].SQLLEN = 14;

[端末から入力した動的パラメタ指定の値をSQLDA構造体に設定]

}

EXEC SQL EXECUTE STMID USING SQL DESCRIPTOR :sqlda_in;

free( sqlda_in );

EXEC SQL DEALLOCATE PREPARE STMID;

SQL記述子域の場合

動的パラメタ指定のあるUPDATE文:探索の指定例を以下に示します。なお、SQL記述子域を操作するSQL文の詳細に

ついては、“SQLDA構造体(動的パラメタ指定)を使用したアプリケーションの例”の例を参照してください。

端末から入力したUPDATE文:探索の例です。端末から入力した動的パラメタ指定の値を設定句としてデータを更新

します。

[端末から入力したUPDATE文:探索をstrに格納]

EXEC SQL PREPARE STMID FROM :str; EXEC SQL ALLOCATE DESCRIPTOR 'INDESC' WITH MAX 100;

EXEC SQL DESCRIBE INPUT STMID USING SQL DESCRIPTOR 'INDESC';

EXEC SQL GET DESCRIPTOR 'INDESC' :icount = COUNT;

for( i = 1; i <= icount; i++ ){

EXEC SQL GET DESCRIPTOR 'INDESC' VALUE :i…

[動的パラメタ指定の情報をSQL記述子域から取得]

EXEC SQL SET DESCRIPTOR 'INDESC' VALUE :i …

[端末から入力した動的パラメタ指定の値をSQL記述子域に設定]

}

EXEC SQL EXECUTE STMID USING SQL DESCRIPTOR 'INDESC';

EXEC SQL DEALLOCATE DESCRIPTOR 'INDESC';

EXEC SQL DEALLOCATE PREPARE STMID;

- 137 -

4.3.4 変数の属性がわかっている被準備文を実行する

アプリケーションの作成時に、被準備文の動的パラメタ指定の値の属性や個数、または取り出す選択リストの属性や個数

がわかっている場合は、SQLDA構造体またはSQL記述子域を使用しなくても、USING引数を使用して値の設定や実行

結果の取り出しを行うことができます。

USING引数で被準備文の動的パラメタ指定の値を設定する場合は、引数に設定する値を代入しておくことが必要です。

このとき、被準備文の動的パラメタ指定の個数と引数の数が一致していることが必要です。また、動的パラメタ指定のデー

タ型と引数のデータ型が比較可能であることが必要です。NULL値を指定する場合は、標識変数を使用します。

USING引数で被準備文の実行結果を取り出す場合は、実行結果を受け取る引数を指定します。このとき、被準備文の

選択リストの個数と引数の数が一致していることが必要です。また、選択リストのデータ型と引数のデータ型が比較可能

であることが必要です。

参照

比較可能なデータ型については、“アプリケーション開発ガイド(共通編)”を参照してください。

それぞれの指定例を以下に示します。

EXECUTE文で動的パラメタ指定の値を設定する

EXECUTE文にUSING引数を指定し、動的パラメタ指定の値を設定します。

例1

在庫表に製品番号が“400”、製品名が“ビデオテープ”、在庫数量が“500”の行を追加します。このとき、製品番号、

製品名、在庫数量のデータ型と、その値を設定する3つの引数のデータ型がそれぞれ比較可能であることが必要で

す。

EXECUTE文で実行結果の取り出しを行う

EXECUTE文にUSING引数を指定し、実行結果の取り出しを行います。

例2

在庫表から、製品番号が“110”の製品名、在庫数量を取り出します。このとき、製品名、在庫数量のデータ型と、その

結果を取り出す2つの引数のデータ型がそれぞれ比較可能であることが必要です。

- 138 -

EXECUTE文で動的パラメタ指定の値の設定と実行結果の取り出しを行う

EXECUTE文にUSING引数を指定し、動的パラメタ指定の値の設定と実行結果の取り出しを行います。

例3

在庫表から、製品番号が“240”の製品名、在庫数量を取り出します。このとき、製品番号のデータ型とその値を設定

する引数のデータ型、また、製品名、在庫数量のデータ型とそれらの結果を取り出す2つの引数のデータ型がそれぞ

れ比較可能であることが必要です。

動的FETCH文で実行結果の取り出しを行う

動的FETCH文にUSING引数を指定し、実行結果の取り出しを行います。

例4

在庫表から、製品番号が“200”より大きい製品名、在庫数量を取り出します。このとき、製品名、在庫数量のデータ型

とその結果を取り出す2つの引数のデータ型がそれぞれ比較可能であることが必要です。

- 139 -

動的OPEN文で動的パラメタ指定の値を設定し、動的FETCH文で実行結果の取り出しを行う

動的OPEN文と動的FETCH文にUSING引数を指定し、動的パラメタ指定の値の設定と実行結果の取り出しを行います。

例5

在庫表から、製品番号が“140”以上かつ“240”以下の製品名を取り出します。このとき、製品番号のデータ型とその

値を設定する2つの引数のデータ型、また、製品名のデータ型とその結果を取り出す引数のデータ型がそれぞれ比

較可能であることが必要です。

USING引数を使用したアプリケーションの例を以下に示します。

例6

動的パラメタ指定が2つある動的SELECT文の例です。端末から入力した製品番号と在庫数量の値を探索条件とし

てデータを取り出し、その位置づけられた行に対して、端末から入力した倉庫番号の値に更新します。

USING引数を使用したアプリケーションの例

#include <stdio.h>

#include <string.h>

- 140 -

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

VARCHAR str1[100];

VARCHAR str2[100];

short indata1;

long indata2;

short indata3;

short outdata;

EXEC SQL END DECLARE SECTION;

main()

{

memset(SQLSTATE, 0x00, 6); …(1)

memset(SQLMSG, 0x00, 256); …(1)

memset(&str1, 0x00, sizeof(str1)); …(1)

memset(&str2, 0x00, sizeof(str2)); …(1)

EXEC SQL CONNECT TO DEFAULT; …(2)

EXEC SQL DECLARE CU1 CURSOR FOR STM1;

EXEC SQL WHENEVER SQLERROR GOTO :ERR;

EXEC SQL WHENEVER NOT FOUND GOTO :NOTFND;

strcpy( str1.sqlvar, "SELECT 倉庫番号 FROM 在庫管理.在庫表 " …(3)

"WHERE 製品番号 < ? AND 在庫数量 >= ?" );

str1.sqllen = strlen( str1.sqlvar );

strcpy( str2.sqlvar, "UPDATE 在庫管理.在庫表 SET 倉庫番号 = ? " …(4)

"WHERE CURRENT OF CU1" );

str2.sqllen = strlen( str2.sqlvar );

EXEC SQL PREPARE STM1 FROM :str1; …(5)

printf( "製品番号の値を指定してください \n" );

scanf( "%hd", &indata1 ); …(6)

printf( "在庫数量の値を指定してください \n" );

scanf( "%ld", &indata2 ); …(7)

EXEC SQL OPEN CU1 USING :indata1, :indata2; …(8)

EXEC SQL PREPARE STM2 FROM :str2; …(9)

printf( "倉庫番号の値を指定してください \n" );

scanf( "%hd", &indata3 ); …(10)

for(;;) {

EXEC SQL FETCH CU1 INTO :outdata; …(11)

EXEC SQL EXECUTE STM2 USING :indata3; …(12)

}

NOTFND:

EXEC SQL CLOSE CU1; …(13)

EXEC SQL DEALLOCATE PREPARE STM1; …(14)

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT DEFAULT;

return;

ERR:

EXEC SQL WHENEVER SQLERROR CONTINUE;

printf( "SQLERROR SQLSTATE = %s SQLMSG = %s\n", SQLSTATE, SQLMSG );

EXEC SQL ROLLBACK WORK;

EXEC SQL DISCONNECT DEFAULT;

return;

}

(1) ホスト変数を初期化します。

(2) カーソルCU1を宣言します。カーソル指定としてSQL文識別子STM1を指定します。

(3) SQL文(動的SELECT文)をSQL文変数str1に格納します。

(4) SQL文(準備可能動的UPDATE文:位置づけ)をSQL文変数str2に格納します。

- 141 -

(5) str1のSQL文を実行できるようにするための準備処理を行います。STM1はSQL文識別子です。

(6) 動的パラメタ指定(製品番号)の値を端末から入力し、ホスト変数indata1に格納します。

(7) 動的パラメタ指定(在庫数量)の値を端末から入力し、ホスト変数indata2に格納します。

(8) (6)、(7)の値を使用して、カーソルCU1をオープンします。

(9) str2のSQL文を実行できるようにするための準備処理を行います。STM2はSQL文識別子です。

(10) 動的パラメタ指定(倉庫番号)の値を端末から入力し、ホスト変数indata3に格納します。

(11) カーソルCU1の位置づけおよびデータの読込みを行います。このとき、ホスト変数outdataに実行結果の値が設

定されます。

(12) 動的FETCH文で位置づけられた行に対して、(10)の値で更新処理を行います。

(13) カーソルCU1をクローズします。

(14) SQL文識別子STM1に対応する被準備文(動的SELECT文)を解放します。STM1に対応するカーソルCU1を参

照している被準備文(準備可能動的UPDATE文:位置づけ)も同時に解放されます。

備考. 製品番号に“200”、在庫数量に“100”、倉庫番号に“3”が指定された場合は、以下のような結果になります。

4.4 SQL文を即時実行する

作成したSQL文を、準備処理を行わずに実行する場合に、EXECUTE IMMEDIATE文を使用します。EXECUTEIMMEDIATE文で実行できるSQL文は、動的SELECT文および動的単一行SELECT文以外の準備可能文です。準備

可能文の詳細については、“4.1 動的SQLの概念”を参照してください。準備可能文がINSERT文、UPDATE文:探索、

DELETE文:探索、準備可能動的UPDATE文:位置づけまたは準備可能動的DELETE文:位置づけの場合は、動的パラ

メタ指定がないときだけ使用できます。

SQL文変数の内容が準備可能動的UPDATE文:位置づけ、または準備可能動的DELETE文:位置づけの場合は、事前

に対応するカーソルをオープンしておくことが必要です。また、指定したカーソルは動的カーソルであることが必要です。

EXECUTE IMMEDIATE文の指定例を以下に示します。

在庫表の在庫数量が“0”の行を削除します。

:

(変数strにSQL文を格納)

"DELETE FROM 在庫管理.在庫表 WHERE 在庫数量 = 0"

:

EXECUTE IMMEDIATE :str;

:

4.5 データベース名および省略したスキーマ名を変更する

本節では、動的SQLによって実行される被準備文のデータベース名および省略したスキーマ名を、アプリケーション中

で変更する方法について説明します。

- 142 -

4.5.1 データベース名の変更

動的SQLによって実行される被準備文のデータベース名は、コネクションが持つデータベース名が対象となります。コネ

クションが持つデータベース名とは、CONNECT文で指定したSQLサーバ名を指します。このデータベース名は、アプリ

ケーション中で変更することができます。SET CATALOG文で指定したデータベースの対象は、PREPARE文および

EXECUTE IMMEDIATE文の被準備文です。変更したデータベース名はセション終了まで有効です。

SET CATALOG文の指定例を以下に示します。

データベース名を“RDBDB2”に変更します。

4.5.2 スキーマ名の変更

表宣言を使用したスキーマ名修飾の省略については、“アプリケーション開発ガイド(共通編)”で説明していますが、動

的SQLによって実行される被準備文の表名は、表宣言によるスキーマ名の省略はできません。被準備文の表名にスキー

マ名を省略した場合には、CONNECT文で指定した認可識別子がスキーマ名となります。この省略したスキーマ名をア

プリケーション中で変更することができます。SET SCHEMA文で指定したスキーマの対象は、PREPARE文および

EXECUTE IMMEDIATE文の被準備文です。変更したスキーマ名はセション終了まで有効です。

SET SCHEMA文の指定例を以下に示します。

スキーマ名を“SCH1”に変更します。

- 143 -

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

本章では、ルーチンを利用するアプリケーションの作成方法について説明します。

5.1 プロシジャルーチンを利用する場合

本節では、プロシジャルーチンを利用する場合について、以下の項目を説明します。

・ プロシジャルーチンを利用するアプリケーションの作成の流れ

・ プロシジャルーチンの実行

・ プロシジャルーチンの処理結果

・ プロシジャルーチン利用時のトランザクション

5.1.1 プロシジャルーチンを利用するアプリケーションの作成の流れ

プロシジャルーチンを利用するアプリケーションは、以下の手順で作成します。

1. プロシジャルーチンの定義

2. プロシジャルーチンの実行

参照

プロシジャルーチンの定義方法については、“アプリケーション開発ガイド(共通編)”を参照してください。

5.1.2 プロシジャルーチンの実行

サーバ上のスキーマに登録済のプロシジャルーチンを、クライアント側から呼び出して実行するには、SQL制御文のCALL文を使用します。プロシジャルーチンに引数を指定することで、外部からの入力情報によって処理制御を切り替えること

ができます。CALL文の引数にNULL値を設定または返却する場合には、標識変数を指定します。プロシジャルーチン

を使用したアプリケーションのコンパイルでは、sqlcc、sqlfccまたはsqlcobolコマンドに-W95オプション、-W96オプションま

たは-W2000オプションを指定してください。CALL文の指定方法には以下に示すように2種類があります。

[動的SQL文(PREPARE文/EXECUTE文)での実行]

strcpy(HOST, "CALL 在庫管理.営業所別発注処理(?)");

(1) (2)

EXEC SQL PREPARE STMID FROM :HOST;

EXEC SQL EXECUTE STMID USING :INDATA;

(3)

(1) スキーマ名

(2) ルーチン名

(3) 引数

[静的SQL文での実行]

EXEC SQL CALL 在庫管理.営業所別発注処理 (:INDATA);

(1) (2) (3)

(1) スキーマ名

(2) ルーチン名

(3) 引数

- 144 -

“図5.1 ルーチン実行時のクライアントとサーバの関係”に、プロシジャルーチン定義を実行した場合のクライアントとサー

バの関係の例を示します。

図5.1 ルーチン実行時のクライアントとサーバの関係

一時表を利用してプロシジャルーチンの結果を返却する方法

プロシジャルーチン内の処理で取り出したデータを呼出し側のアプリケーションに返却するには、パラメタ変数を利用し

ます。しかし、表から抽出した大量のデータを返却する場合、パラメタ変数では実現できません。このような場合、一時表

を利用することで実現できます。

以下に、概要を示します。

図5.2 一時表を利用したプロシジャルーチンとのデータの受渡し

(1) アプリケーションからプロシジャルーチン(該当者の過去診断情報)を呼び出します。

(2) プロシジャルーチンで抽出されたデータを、一時表(該当者一時表)に格納します。

- 145 -

(3) プロシジャルーチンが終了します。

(4) 一時表に格納されている、プロシジャルーチン内での抽出結果を、アプリケーションに取り込みます。

プロシジャルーチン内で抽出した結果を一時表に格納する例を以下に示します。

CREATE PROCEDURE SCM2.該当者の過去診断情報(

IN P年齢範囲1 SMALLINT,

IN P年齢範囲2 SMALLINT,

IN P性別 NCHAR(2),

IN P血液型 CHAR(5)

)

BEGIN

DECLARE SQLSTATE CHAR(5);

DECLARE SQLMSG CHAR(256);

DECLARE S管理番号 INTEGER;

-- 入力された条件に該当する、過去の患者の管理番号を抽出する

DECLARE CUR01 CURSOR FOR SELECT 管理番号 FROM SCM1.患者管理表

WHERE 年齢 BETWEEN P年齢範囲1 AND P年齢範囲2

AND 性別 = P性別

AND 血液型 = P血液型;

-- ハンドラ宣言

DECLARE EXIT HANDLER FOR SQLEXCEPTION

BEGIN

ROLLBACK WORK; -- 例外が発生した場合、ROLLBACKして終了する

RESIGNAL; -- 発生した例外事象をCALL文の結果として通知する

END;

DECLARE CONTINUE HANDLER FOR NOT FOUND

BEGIN

END; -- データなし例外発生時は処理を継続する

-- 最初に初期化

DELETE FROM SCM00.該当者一時表;

-- 該当者の管理番号の抽出

OPEN CUR01;

LOOP1:LOOP

FETCH CUR01 INTO S管理番号;

IF (SQLSTATE = '02000') THEN

LEAVE LOOP1;

END IF;

-- 該当者の過去の診察情報を取り出して一時表に格納する

INSERT INTO SCM00.該当者一時表

SELECT 患者名, 診察日, 担当医, 診断結果, 診断詳細, 血圧

FROM SCM1.診察結果管理

WHERE 管理番号 = S管理番号;

END LOOP LOOP1;

CLOSE CUR01;

COMMIT WORK;

END

備考. 一時表“該当者一時表”はON COMMIT PRESERVE ROWS指定とします。

一時表に格納されている、プロシジャルーチン内での抽出結果をアプリケーションで取り出す例を以下に示します。

#include <stdio.h>

EXEC SQL BEGIN DECLARE SECTION;

short AGE1;

short AGE2;

char CHARACTER SET IS NCHAR SEX[5];

char BLOOD[6];

……

- 146 -

EXEC SQL END DECLARE SECTION;

int main( )

{

……

EXEC SQL WHENEVER SQLERROR GOTO :ERR_END;

/* プロシジャルーチンの呼び出し */

AGE1 = 20;

AGE2 = 40;

strcpy(SEX, "男性");

strcpy(BLOOD, "A RH+");

EXEC SQL CALL SCM2.該当者の過去診断情報(:AGE1, :AGE2, :SEX, :BLOOD );

/* 一時表のデータを出力する */

EXEC SQL DECLARE CUR1 CURSOR FOR

SELECT * FROM SCM00.該当者一時表 ORDER BY 患者名, 診察日;

EXEC SQL OPEN CUR1;

EXEC SQL WHENEVER NOT FOUND GOTO :LOOP_END;

for (cnt = 1; ; cnt++) {

EXEC SQL FETCH CUR1 INTO :D_NAME, :D_DATE, :D_DOCTOR,

:D_DIAGNOSE, :D_INFO, :D_BP;

printf("[%d]患者名=%s, 診察日=%s, 担当医=%s, "

"診断結果=%s, 診断詳細=%s, 血圧=%s\n",

cnt, D_NAME, D_DATE, D_DOCTOR, D_DIAGNOSE, D_INFO, D_BP);

}

LOOP_END:

EXEC SQL CLOSE CUR1;

……

5.1.3 プロシジャルーチンの処理結果

ここでは、プロシジャルーチン内での処理結果の確認方法と、プロシジャルーチンの呼出し元のアプリケーションでの処

理結果の確認方法について説明します。

プロシジャルーチン内での処理結果の確認

プロシジャルーチン内のSQL手続き文の実行中に、例外コード40の例外(ロールバック例外)が発生した場合は、トラン

ザクションをロールバックし、呼出し元のアプリケーションに無条件に復帰します。このときの例外事象は呼出し元の

SQLSTATEおよびSQLMSGに通知されます。

プロシジャルーチン内のSQL手続き文の実行中に、例外コード40以外の例外が発生した場合は、処理結果はプロシジャ

ルーチン内のSQLSTATEとSQLMSGに通知されます。利用者は、プロシジャルーチン内にSQLSTATEおよびSQLMSGをSQL変数として宣言しておき、その内容を参照することによって例外事象を知ることができます。

プロシジャルーチン内ではハンドラを使用することができます。ハンドラとは、プロシジャルーチン実行中に例外が発生し

た際に実行されるサブルーチンです。ハンドラ宣言はどのような例外が発生した場合にどのような動作を行うかを指定し

ます。プロシジャルーチン実行中に例外コード40以外の例外が発生した際、該当するハンドラが呼び出され、特定の処

理を行い、プロシジャルーチンの処理を回復することができます。ハンドラ宣言が1つ以上指定されている状態で、かつ、

該当するハンドラが存在しなかった場合は、ハンドラで処理されなかったとして、発生した例外のSQLSTATEおよび

SQLMSGが呼び出し元に返却されます。

注意

ハンドラ宣言が1つも指定されていない状態で、プロシジャルーチン実行中に例外コード40以外の例外が発生した場合

は、発生した例外のSQLSTATEおよびSQLMSGは呼び出し元に返却されません。この場合は、プロシジャルーチン内

のSQLSTATEとSQLMSGに通知された内容を参照することにより、例外事象を確認します。

また、ハンドラ動作内で新たに例外が発生した場合、ハンドラ動作は終了して、新たに発生した例外のSQLSTATEおよ

びSQLMSGが呼び出し元に返却されます。

- 147 -

プロシジャルーチンの呼出し元での処理結果の確認

CALL文を実行して、プロシジャルーチンに記述された一連の処理が中断なく実行された場合、呼出し元のSQLSTATEおよびSQLMSGには正常終了が通知されます。例外によってプロシジャルーチンが実行されない、またはプロシジャルー

チン内で例外が発生して処理が中断された場合は、その例外事象が呼出し元のSQLSTATEおよびSQLMSGに通知さ

れます。プロシジャルーチンが実行されない場合とは、アクセス規則違反や、CALL文引数とプロシジャルーチンのパラ

メタ間の代入エラーが発生した場合などがあります。プロシジャルーチンの処理が中断される場合とは、プロシジャルー

チン内のSQL手続き文で例外コード40の例外(ロールバック例外)が発生した場合、発生した例外がハンドラで処理され

ない場合、またはハンドラ動作中に新たに例外が発生した場合です。

以下に具体例を示します。

#include <stdio.h>

EXEC SQL BEGIN DECLARE SECTION;

VARCHAR BUF[256];

char SQLSTATE[6]; …… (1)

char SQLMSG[256];

long DENPYO;

long DCODE;

char CNAME[41];

EXEC SQL END DECLARE SECTION;

main()

{

memset( SQLSTATE, 0x00, sizeof(SQLSTATE) );

memset( SQLMSG, 0x00, sizeof(SQLMSG) );

strcpy( BUF.sqlvar, "CALL スキーマ00.PCALL000(?,?,?)" );

BUF.sqllen = strlen( BUF.sqlvar );

EXEC SQL WHENEVER SQLERROR GOTO :ERR_SQL;

EXEC SQL PREPARE 識別子 FROM :BUF;

EXEC SQL EXECUTE 識別子 USING :DENPYO,:DCODE,:CNAME; …… (2)

EXEC SQL COMMIT WORK ;

return(0);

ERR_SQL:

printf("プロシジャルーチン実行で異常発生\n"); …… (3)

printf(" エラーコード ===> %s\n", SQLSTATE);

printf(" エラーメッセージ ===> %s\n", SQLMSG);

ERR_EXIT:

EXEC SQL ROLLBACK ;

return(1);

}

(1) SQLSTATE、SQLMSGおよびプロシジャルーチンのパラメタをホスト変数として宣言します。

(2) プロシジャルーチンPCALL000を呼び出します。

(3) CALL文の結果がエラーだった場合、SQLSTATEおよびSQLMSGを表示して終了します。

- 148 -

図5.3 プロシジャルーチン内の処理結果の通知方法

5.1.4 プロシジャルーチン利用時のトランザクション

ここでは、プロシジャルーチン利用時のトランザクションについて説明します。

参照

トランザクションについての詳細は、“アプリケーション開発ガイド(共通編)”の“トランザクションと排他制御”を参照してく

ださい。

また、データベース簡単運用でのトランザクションについての詳細は、“アプリケーション開発ガイド(共通編)”の“トランザ

クションと排他制御(データベース簡単運用の場合)”を参照してください。

プロシジャルーチンは、呼出し元のアプリケーションと同一トランザクションとして動作します。アプリケーションから呼び出

されたプロシジャルーチン内でトランザクション管理文(COMMIT文またはROLLBACK文)が実行された場合、プロシジャ

ルーチンが実行されているトランザクションを終了します。その後、プロシジャルーチン内でトランザクションを開始する

SQL文が実行された場合、プロシジャルーチン内で新しいトランザクションが開始されます。(トランザクションモードは前

トランザクションと同一です。)開始されたトランザクションは、呼出し元のアプリケーションにも継続されます。ただし、以下

のような状態で呼び出されるプロシジャルーチンでは、トランザクション管理文の実行はエラーとなります。

・ 複数コネクションが接続されているアプリケーションから呼び出されるプロシジャルーチン

・ トランザクションモニタ配下のアプリケーションから呼び出されるプロシジャルーチン

プロシジャルーチン内のSQL文の実行でエラーが起きた場合は、エラーを起こしたSQL文が無効となります。ただし、

SQLSTATE値の例外コードが40の場合は、トランザクションをロールバックします。

- 149 -

プロシジャルーチンがSQLSTATE値の例外コードが40以外の状態で終了する場合、プロシジャルーチン内で行われた

すべてのデータベース更新は無効となります。

プロシジャルーチン内でのSQL文の実行時には、動作環境ファイルのTRAN_SPECの指定は無効ですが、アプリケー

ションに復帰した後は、TRAN_SPECの指定に従って制御されます。

5.2 ファンクションルーチンを利用する場合

本節では、ファンクションルーチンを利用する場合について、以下の項目を説明します。

5.2.1 ファンクションルーチンを利用するアプリケーションの作成の流れ

アプリケーションでファンクションルーチンを利用するには、以下の手順が必要です。

1. ファンクションルーチンの定義

2. ライブラリの作成

3. テストドライバの作成・単体テストの実施

4. ファンクションルーチンの実行

それぞれの方法を、次項以降で説明します。

参照

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

5.2.2 ライブラリの作成

Symfoware/RDBでは、ファンクションルーチンは外部ルーチンとして提供しています。したがって、利用者が作成したア

プリケーションは、動的リンクライブラリとしてサーバに登録します。

以下に、ファンクションルーチンのライブラリの作成手順について説明します。

・ ライブラリとして登録するCプログラムの作成方法

・ ライブラリとして登録するCプログラムのコンパイル・リンク

・ ライブラリを作成する場合の注意事項

5.2.2.1 ライブラリとして登録するCプログラムの作成方法

ここでは、ファンクションルーチンのライブラリとして利用者が登録するCプログラムの作成方法について、以下を説明しま

す。

・ Cプログラムの関数インタフェース

・ ファンクションルーチンのライブラリで使用可能な標準関数

Cプログラムの関数インタフェース

Cプログラムの関数の引数は、以下の順に2つの引数を固定で指定します。

1. 引数データのポインタリスト

2. 結果データのポインタリスト

例1

ファンクションルーチンのパラメタが3個の場合の関数宣言の例

/* 引数データのポインタリスト */

typedef struct in_ptr_list_tag {

void *ptr[6]; /*ファンクションのパラメタの個数×2*/

- 150 -

} 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, /* 引数データのポインタリスト */

out_ptr_list_t *out_p) /* 結果データのポインタリスト */

{

・・・

引数データのポインタリスト

ファンクションルーチンの入力パラメタをCプログラムの関数が受け取るには、引数データのポインタリストを利用しま

す。引数データのポインタリストは、CREATE FUNCTION文のパラメタ宣言順に、入力データの格納先アドレスおよ

び対応する標識データの格納先アドレスが並びます。

入力データがNULL値でない場合は、標識データに0が通知されます。入力データがNULL値の場合は、標識デー

タに負の値が通知され、入力データの値は保証されません。

入力データは、ファンクションルーチンのパラメタ宣言で指定したデータ型と対応するC言語のデータ型で表現されま

す。また、標識データは2バイト整数型で表現されます。

参照

ファンクションルーチンのパラメタのデータ型と対応するデータ形式については、“アプリケーション開発ガイド(共通

編)”を参照してください。

- 151 -

結果データのポインタリスト

ファンクションルーチンの結果としてCプログラムの関数から返却する結果データは、結果データのポインタリストを利

用します。結果データのポインタリストには、結果データの格納先アドレスと結果の標識データの格納先アドレスが設

定されています。

Cプログラムの関数は、処理終了までに結果データを指定先の領域に格納する必要があります。結果データは、

CREATE FUNCTION文で指定した戻りデータ型に対応した形式で設定してください。標識データは、2バイト整数型

で0を設定してください。結果をNULL値として返却する場合は、標識データに負の値を設定してください。標識デー

タが負の値の場合は、結果データは返却されません。

参照

パラメタのデータ型とC言語のデータ型の対応については、“アプリケーション開発ガイド(共通編)”の“ファンクション

ルーチンのパラメタのデータ型と対応するデータ形式”を参照してください。

パラメタのデータ型とC言語のデータ型の対応については、“ファンクションルーチンのパラメタのデータ型と対応する

データ形式”を参照してください。

ファンクションルーチンのパラメタとCプログラムの関数の引数のインタフェースについて、具体的な使用例を以下に示し

ます。

ファンクションルーチン“USERFUNC001”の定義文

CREATE FUNCTION SCM1.USERFUNC001(IN CHAR(20),

IN INTEGER,

IN INTEGER )

- 152 -

RETURNS VARCHAR(60)

LANGUAGE C

NAME 'UserFunc001'

LIBRARY '/usr/local/lib/libuserfunc001.so';

ファンクションルーチン“USERFUNC001”の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]; /* 結果のデータ格納先 */

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;

- 153 -

#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間にデバッグ用の処理を追加しています。後述のテストドライバと組み合わせ

ることでSymfoware/RDBを介さない単体テストを行うことができます。ファンクションルーチンではfprintf関数やいくつ

かの関数の使用を制限していますが、単体テストであれば、上記のように使用することができます。コンパイル時にデ

ファイン値DEBUGを指定してください。Symfoware/RDBを介して実行するときは、DEBUGを外して再コンパイルして

ください。

ファンクションルーチン“USERFUNC001”の定義文

CREATE FUNCTION SCM1.USERFUNC001(IN CHAR(20),

IN INTEGER,

IN INTEGER )

RETURNS VARCHAR(60)

LANGUAGE C

NAME 'UserFunc001'

LIBRARY 'D:\FORSYMFO\FUNCLIB\USERFUNC001.DLL';

ファンクションルーチン“USERFUNC001”のCプログラムの作成例

#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;

- 154 -

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:\\FORSYMFO\\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);

#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;

}

- 155 -

上記の例では、#ifdef DEBUG~#endif間にデバッグ用の処理を追加しています。後述のテストドライバと組み合わせ

ることでSymfoware/RDBを介さない単体テストを行うことができます。ファンクションルーチンではfprintf関数やいくつ

かの関数の使用を制限していますが、単体テストであれば、上記のように使用することができます。コンパイル時にデ

ファイン値DEBUGを指定してください。Symfoware/RDBを介して実行するときは、DEBUGを外して再コンパイルして

ください。

ファンクションルーチンのライブラリで使用可能な標準関数

ファンクションルーチンのライブラリで使用可能なC言語の標準関数について、以下に示します。使用不可の関数を使用

した際の動作は保証されません。

また、プログラム中にSQL文を記述することはできません。

表5.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, ... ×

○:使用可能

×:使用不可

5.2.2.2 ライブラリとして登録するCプログラムのコンパイル・リンク

ファンクションルーチンのライブラリは、動的リンクライブラリとして作成します。

動的モードを指定して共有オブジェクトを作成します。

cc -KPIC -G -o <ライブラリ名> <ソースファイル名>...

作成したライブラリは、ファンクションルーチン定義文のLIBRARY句で指定するディレクトリに格納してください。

- 156 -

cc -KPIC -G -o /usr/local/lib/libuserfunc001.so userfunc001.c

SQLSignalMSG関数を使用する場合は、ライブラリlibsqlsigm.soを動的結合する必要があります。また、インクルード

ファイルsqlsigm.hをインクルードする必要があります。

cc -KPIC -G -o /usr/local/lib/libuserfunc001.so

-L/opt/FSUNrdb2b/lib -lsqlsigm -I/opt/FSUNrdb2b/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

SQLSignalMSG関数を使用する場合は、ライブラリlibsqlsigm.soを動的結合する必要があります。また、インクルード

ファイルsqlsigm.hをインクルードする必要があります。

gcc -fPIC -shared -o /usr/local/lib/libuserfunc001.so

-L/opt/FJSVrdb2b/lib -lsqlsigm -I/opt/FJSVrdb2b/include

(1) (2) (3)

userfunc001.c

(1) RDBライブラリパス指定

(2) RDBライブラリ名

(3) RDBインクルードパス指定

Dynamic-Link Library(DLL)を作成します。

DLLの対象プラットフォームは、サーバが動作するプラットフォームと同じにします。x64版の場合はx64、それ以外の場

合はWin32を対象プラットフォームとしてDLLを作成します。

Microsoft(R) Visual Studioでの作成手順の例を以下に示します。

1. [ファイル(F)]メニューから、[新規作成(N)]で[プロジェクト(P)]を選択します。

2. [新しいプロジェクト]ウインドウにて、[プロジェクトの種類(P)]で[Visual C++]の[Win32]を選択し、[テンプレート

(T)]で[Win32 プロジェクト]を選択します。

- 157 -

3. [新しいプロジェクト]ウインドウにて、[プロジェクト名(N)]を指定し、[場所(L)]にライブラリ作成場所を指定します。

[ソリューションのディレクトリを作成(D)]のチェックボックスのチェックを外します。[OK]を選択します。

プロジェクト名 = USERFUNC001

位置 = D:\FORSYMFO\FUNCMAKE\USERFUNC001

指定した位置に、作成したCプログラムファイルを格納しておきます。

ファンクションルーチンのライブラリ内でSQLSignalMSG関数を使用する場合は、インクルードファイルsqlsigm.hをインクルードする必要があります。このインクルードファイルは、<サーバ機能のインストール先>\ESQL\INCLUDEまたは<クライアント機能のインストール先>\ESQL\INCLUDEに格納されています。

4. [Win32 アプリケーション ウィザード]ウインドウの[Win32 アプリケーション ウィザードへようこそ]の画面にて[次へ

>]を選択します。

5. [Win32 アプリケーション ウィザード]ウインドウの[アプリケーションの設定]の画面にて、[アプリケーションの種類]

で[DLL]を選択します。[追加オプション]で[空のプロジェクト(E) ]のチェックボックスをチェックします。[完了]を

選択します。

6. x64版の場合、事前にVisual Studioのプロジェクト設定で64ビットのプロジェクトを作成しておく必要があります。

[ビルド(B)]の[構成マネージャ(O)...]から[構成マネージャ]ウィンドウを開きます。

[プロジェクトのコンテキスト (ビルドまたは配置するプロジェクト構成をチェック)(R):]の[プラットフォーム]のプルダウ

ンから<新規作成...>を選択します。

[新しいプロジェクト プラットフォーム]ウィンドウを開きます。

[新しいプラットフォーム(P):]のプルダウンから“x64”を選択し、[OK]をクリックします。

その際、[構成マネージャ]の[アクティブ ソリューション プラットフォーム(P):]のプルダウンと、[プロジェクトのコンテ

キスト (ビルドまたは配置するプロジェクト構成をチェック)(R):]の[プラットフォーム]で、目的のプラットフォームが選

択されていることを確認します。

確認ができたら[構成マネージャ]の[閉じる]をクリックします。

7. [プロジェクト(P)]の、[既存項目の追加(G)]から、作成したCプログラムファイルをプロジェクトに追加します。

D:\FORSYMFO\FUNCMAKE\USERFUNC001\USERFUNC001.C

8. ファンクションルーチンのライブラリ内でSQLSignalMSG関数を使用する場合は、インクルードディレクトリにSymfowareServerのINCLUDEディレクトリを追加し、サーバのプラットフォームに対応した以下のライブラリをリンクする必要が

あります。

- x64版の場合

リンクするライブラリ … f3cwsqlsigm_x64.lib

- 上記以外の場合

リンクするライブラリ … f3cwsqlsigm.lib

1. インクルードパスを設定します。[プロジェクト(P)]の[プロパティ(P)] から[プロパティ]ウィンドウを開きます。[構成プロパティ]を選択し、[構成(C):]のプルダウンから“すべての構成”、[プラットフォーム(P):]のプルダウンか

ら“すべてのプラットフォーム”を選択します。

[構成プロパティ]の[C/C++]で[全般]の[追加のインクルードディレクトリ]に<サーバ機能のインストール先>\ESQL\INCLUDEまたは<クライアント機能のインストール先>\ESQL\INCLUDEを追加し、[OK]をクリックし

ます。

2. ライブラリを設定します。[プロジェクト(P)]の、[既存項目の追加(G)]から、使用するライブラリをプロジェクト

に追加します。

9. [ビルド(B)]から[ソリューションのビルド(B)]を選択して、ライブラリを作成します。

- 158 -

10. 作成したライブラリを、ファンクションルーチン定義文のLIBRARY句で指定するディレクトリに格納します。

D:\FORSYMFO\FUNCMAKE\USERFUNC001\RELEASE\USERFUNC001.DLL

↓ 複写

D:\FORSYMFO\FUNCLIB\USERFUNC001.DLL

5.2.2.3 ライブラリを作成する場合の注意事項

ファンクションルーチンのライブラリとして作成する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) /* 結果データのポインタリスト */

{

・・・

5.2.3 ファンクションルーチンの実行

関数として定義したファンクションルーチンを実行するには、SQL文の選択リストや値指定などに指定して実行します。

ファンクションルーチンを呼び出すアプリケーションのコンパイル・リンクでは、sqlcc、sqlfcc、sqlpcobコマンドに、-W2000オプションを指定してください。以下に、SQL文の記述例を示します。

スキーマ名およびルーチン名は、それぞれ、“SCM1”、“USERFUNC001”であるとします。

SELECT SCM1.USERFUNC001(NAME, CODE, AGE)

FROM SCM1.CUSTOMER

WHERE AGE BETWEEN :AGE1 AND :AGE2 ;

ファンクションルーチンは、Symfoware/RDBから新たに起動されるプロセスで実行されます。ファンクションルーチンが動

作するプロセスの実効ユーザIDは、RDBシステム内で1つを指定します。実効ユーザIDの指定は、システム用の動作環

境ファイルの実行パラメタEXTERNAL_PROCESS_USERで行います。

参照

実行ユーザIDの指定については、“セットアップガイド”を参照してください。

また、データベース簡単運用の場合は、“データベース簡単運用ガイド”を参照してください。

- 159 -

ファンクションルーチンを実行するプロセスが異常終了した場合の注意事項

ファンクションルーチンを実行するプロセスが何らかの原因で異常終了した場合、以下のエラーメッセージが出力されま

す。

RDBREPORTで指定したメッセージログファイルに、以下のエラーメッセージが出力されます。

Tue Apr 17 17:47:07 2007

rdb: INFO: qdg13783i:ファンクショルーチンを実行したプロセスのコアファイルを採取しました コアファイル名は

/usr/local/rdb1/rdbcore/core_fnc_9356.070417.174709です (システム名=rdb1) (注1)

Tue Apr 17 17:47:07 2007

rdb: INFO: qdg14248i:OSで設定されたコアファイルの出力規約に従いコアファイルを採取しました プロセス名 rdbsfunc

プロセスID 10865 ユーザID 0 グループID 0 (システム名=rdb1) (注1)

Tue Apr 17 17:47:08 2007

rdb: ERROR: qdg13781u:ファンクションルーチンを実行するプロセスが異常終了しました 原因=signal number : 11 (シ

ステム名=rdb1)

Tue Apr 17 17:47:09 2007

rdb: ERROR: qdg13782u:ファンクションルーチンのライブラリ内で異常が発生しました (システム名=rdb1) (注2)

注1) qdg13783iとqdg14248iは以下の条件により、どちらか一方が出力されます。

Solarisの場合

qdg13783iが出力される場合

以下の条件をすべて満たす場合、qdg13783iが出力されます。

- coreadmコマンドを使用して、OSのコアファイルの出力規約にコアファイルの出力先ディレクトリを指定していない

- コアファイル名に“core”を指定している

qdg14248iのメッセージが出力される場合

以下の条件のいずれかを満たす場合、qdg14248iのメッセージが出力されます。

- coreadmコマンドを使用して、OSのコアファイルの出力規約にコアファイルの出力先ディレクトリを指定している

- コアファイル名に“core”以外を指定している

Linuxの場合

qdg13783iが出力される場合

以下の条件をすべて満たす場合、qdg13783iが出力されます。

- カーネルパラメタkernel.core_patternを使用して、OSのコアファイルの出力規約にコアファイルの出力先ディレクト

リを指定していない

- コアファイル名に“core”を指定している

qdg14248iのメッセージが出力される場合

以下の条件のいずれかを満たす場合、qdg14248iのメッセージが出力されます。

- カーネルパラメタkernel.core_patternを使用して、OSのコアファイルの出力規約にコアファイルの出力先ディレクト

リを指定している

- コアファイル名に“core”以外を指定している

注2) qdg13782uのメッセージが出力された場合は、ファンクションルーチンのライブラリ内で、何らかの原因で異常が発

生したことを示します。メッセージに示された原因の情報をもとに、異常終了した原因を調査してください。

イベントログおよびRDBREPORTで指定したメッセージログファイルに、以下のエラーメッセージが出力されます。

- 160 -

qdg13783i:ファンクショルーチンを実行したプロセスのコアファイルを採取しました コアファイル名は

core_fnc_1496.20070417.205903です (システム名=RDB1)

qdg13781u:ファンクションルーチンを実行するプロセスが異常終了しました 原因=exception code : 0xc0000005 (システ

ム名=RDB1)

qdg13782u:ファンクションルーチンのライブラリ内で異常が発生しました (システム名=RDB1) (注)

注) qdg13782uのメッセージが出力された場合は、ファンクションルーチンのライブラリ内で、何らかの原因で異常が発生

したことを示します。メッセージに示された原因の情報をもとに、異常終了した原因を調査してください。

5.2.4 ファンクションルーチンからの異常通知

ここでは、ファンクションルーチンからの異常通知について説明します。

Cプログラムの処理において、入力データの内容が異常だったときなど、ファンクションルーチンの実行結果をエラーに

したい場合があります。このような場合、SQLSignalMSG関数を使用することで、利用者定義の例外をSymfoware/RDBに送信し、ファンクションルーチンを呼び出したSQL文をエラーにすることができます。

[記述形式]

void SQLSignalMSG(char *msg_p)

msg_p:例外メッセージ格納先アドレス

検出した事象を設定したSQLSignalMSG関数を実行後、プログラムからSymfoware/RDBに復帰すると、SQL文の実行結

果はエラーとなり、以下のメッセージが通知されます。通知される例外メッセージの長さは256バイトまでです。それ以上

は切り捨てとなります。

JYP4557E

ファンクションルーチン“@1@”から例外が送信されました.例外メッセージ=“@2@”

[状態コード]

60000

[メッセージの意味]

ファンクションルーチン実行中に例外が発生しました。

[パラメタの意味]

@1@: Cプログラムの関数シンボル名

@2@: 例外メッセージ

SQLSignalMSG関数を使用する場合、以下のファイルをインクルードします。また、ライブラリ作成時に以下のライブラリ

をリンクする必要があります。

インクルードするファイル … /opt/FSUNrdb2b/include/sqlsigm.h

リンクするライブラリ … /opt/FSUNrdb2b/lib/libsqlsigm.so

インクルードするファイル … /opt/FJSVrdb2b/include/sqlsigm.h

リンクするライブラリ … /opt/FJSVrdb2b/lib/libsqlsigm.so

インクルードするファイル … sqlsigm.h

インクルードするファイルは、<サーバ機能のインストール先>\ESQL\INCLUDEまたは<クライアント機能のインストール

先>\ESQL\INCLUDEに格納されています。

- 161 -

リンクするライブラリ

・ x64版の場合

リンクするライブラリ …f3cwsqlsigm_x64.lib

・ 上記以外の場合

リンクするライブラリ … f3cwsqlsigm.lib

リンクするライブラリは、<サーバ機能のインストール先>\ESQL\LIBまたは<クライアント機能のインストール先>\ESQL\LIBに格納されています。

詳細は、“5.2.2.2 ライブラリとして登録するCプログラムのコンパイル・リンク”を参照してください。

ファンクションルーチンから異常通知する場合のプログラミング例および出力されるエラーメッセージの例を以下に示しま

す。ファンクションルーチンはUSERFUNC002、Cプログラムの関数シンボル名はUserFunc002であるとします。

ファンクションルーチンから異常通知する場合のプログラミング例

/*-------------------------------------------------------------*/

/* ファンクションルーチン"USERFUNC002"のCプログラム */

/*-------------------------------------------------------------*/

#include <stdio.h>

#include <string.h>

#include "sqlsigm.h" /* SQLSignalMSG関数宣言 */

/* 引数データのポインタリスト */

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) {

SQLSignalMSG("引数1が負の値です");

return;

}

/* 結果データの作成 */

sprintf(ret, "TEST-CODE=%ld", data1);

- 162 -

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;

}

出力されるエラーメッセージの例

SELECT SCM1.USERFUNC002(CODE) FROM SCM1.CUSTOMER WHERE AGE > 40;

<SQL文の実行結果>

SQLSTATE = 60000

SQLMSG = JYP4557Eファンクションルーチン"UserFunc002"から例外が送信されました.例外メッセージ="引数1が

負の値です"

5.2.5 テストドライバの作成および単体テストの実施

作成したファンクションルーチンは、Symfoware/RDBを介して実行する前に、テストドライバを利用して単体テストを行い、

十分な品質を確保しておく必要があります。

テストドライバが直接ファンクションルーチンのライブラリを呼び出すことで、Symfoware/RDBを介さずに単体テストを行う

ことができます。

また、SQLSignalMSG関数を使用してファンクションルーチンから異常通知するプログラムを作成した場合の単体テスト

は、ダミーのSQLSignalMSG関数を用意し、Symfoware/RDBを介さずにテストを行う必要があります。

UNIX系の場合

(1) ファンクションルーチンのライブラリ作成

(2) テストドライバの実行形式作成

(3) ダミーSQLSignalMSG関数のライブラリ作成

(4) リンクするライブラリの設定

- 163 -

(5) リンクするライブラリの再設定

ファンクションルーチンのライブラリ作成

ファンクションルーチンのライブラリを作成します。

ライブラリ作成についての詳細は“5.2.4 ファンクションルーチンからの異常通知”を参照してください。

以下にファンクションルーチンのライブラリ作成例を示します。

ファンクションルーチンのライブラリ作成例

cc -G -o /usr/local/lib/libuserfunc001.so userfunc001.c -mt

ファンクションルーチンのライブラリ作成例

gcc -shared -o /usr/local/lib/libuserfunc001.so userfunc001.c -D_REENTRANT

テストドライバの実行形式作成

ファンクションルーチンをテストするためのテストドライバの実行形式を作成します。

テストドライバのプログラム例およびテストドライバ実行形式の作成例を以下に示します。

ファンクションルーチン“USERFUNC002”用テストドライバ(ftestdrv001.c)のプログラム例

/*-------------------------------------------------------------*/

/* ファンクションルーチン"USERFUNC002"用テストドライバ */

/*-------------------------------------------------------------*/

#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_PATH "D:\\FORSYMFO\\FUNCLIB\\USERFUNC002.DLL"

#else

#define FUNC_PATH "/export/home/kanda/Function/libuserfunc002.so"

#endif

int main()

{

void *handle_p; /* dlopenのハンドラ */

void (*sym_p)(); /* アドレスベクタ */

int data1; /* 引数1データ格納用 */

- 164 -

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("drv002:LoadLibrary start\n");

/* ファンクションルーチンのライブラリをオープン */

handle_p = LoadLibrary(FUNC_PATH);

#else

printf("drv002:dlopen start\n");

/* ファンクションルーチンのライブラリをオープン */

handle_p = dlopen(FUNC_PATH, RTLD_NOW);

#endif

if (handle_p == NULL) {

return(1);

}

#ifdef NT

printf("drv002:GetProcAddress start\n");

/* ライブラリの入口アドレスの取得 */

sym_p = (void (*)())GetProcAddress(handle_p, FUNC_NAME);

if (sym_p == NULL) {

FreeLibrary(handle_p);

return(2);

}

#else

printf("drv002:dlsym 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("drv002:make indata\n");

/* 入力データの作成 */

data1 = -100; /* 負の値 */

ind1 = 0;

in_ptr_list.ptr[0] = &data1; /* 引数1のデータ */

in_ptr_list.ptr[1] = &ind1; /* 引数1の標識データ */

printf("drv002:make 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("drv002:call func\n");

(*sym_p)(&in_ptr_list, &out_ptr_list);

printf("drv002:call func end\n");

if (r_ind < 0) {

- 165 -

/* NULL値 */

printf("drv002:ret = NULL\n");

}

else {

/* VARCHARデータ長の取り出し */

memcpy(&ret_size, ret, sizeof(short));

printf("drv002:ret_size=%d\n", ret_size);

/* VARCHARデータの取り出し */

memset(buf, 0x00, sizeof(buf));

memcpy(buf, ret + sizeof(short), ret_size);

printf("drv002:return value = %s\n", buf);

}

/* ライブラリのクローズ */

#ifdef NT

FreeLibrary(handle_p);

#else

dlclose(handle_p);

#endif

printf("drv002:end\n");

return(0);

}

テストドライバ実行形式(ftestdrv001)の作成例

cc -o ftestdrv001 ftestdrv001.c -ldl

テストドライバ実行形式(ftestdrv001)の作成例

gcc -o ftestdrv001 ftestdrv001.c -ldl

ダミーSQLSignalMSG関数のライブラリ作成

ファンクションルーチンから異常通知する場合のテストで使用するダミーSQLSignalMSG関数のライブラリを作成しま

す。

ダミーSQLSignalMSG関数のプログラム例およびダミーSQLSignalMSG関数のライブラリ作成例を以下に示します。

ダミーSQLSignalMSG関数“SQLSignalMSG”(fdummymsg.c)のプログラム例

/*-----------------------------------------------------------*/

/* SQLSignalMSG関数のダミープログラム */

/*-----------------------------------------------------------*/

#include <stdio.h>

#include <string.h>

#define MSG1 "JYP4557E ファンクションルーチン“%s”から例外が送信されました.例外メッセージ=“%s”"

void SQLSignalMSG(char *msg_p)

{

char msg_data[1024];

memset(msg_data,0x00,sizeof(msg_data));

sprintf(msg_data,MSG1,"TestFunction",msg_p);

/* SQLSTATE 出力 */

printf("SQLSTATE = 60000\n");

/* SQLMSG 出力 */

printf("SQLMSG = %s\n",msg_data);

return;

}

- 166 -

ダミーSQLSignalMSG関数のライブラリ作成例

cc -G -o /usr/local2/lib/libsqlsigm.so fdummymsg.c

ダミーSQLSignalMSG関数のライブラリ作成例

gcc -shared -o /usr/local/lib/libsqlsigm.so fdummymsg.c

リンクするライブラリの設定

単体テストを実行するために、ダミーSQLSignalMSG関数のライブラリおよびファンクションルーチンのライブラリを

LD_LIBRARY_PATHに設定します。

以下に、2つのライブラリの設定例を示します。

ダミーSQLSignalMSG関数のライブラリおよびファンクションルーチンのライブラリの設定例

setenv LD_LIBRARY_PATH /usr/local2/lib:/usr/local/lib

(1) (2)

(1) ダミーSQLSignalMSG関数のライブラリ

(2) ファンクションルーチンのライブラリ

リンクするライブラリの再設定

単体テストの終了後は、ダミーSQLSignalMSG関数のライブラリをLD_LIBRARY_PATHから外し、Symfoware/RDBのSQLSignalMSG関数のライブラリをLD_LIBRARY_PATHに設定する必要があります。

以下に、ライブラリの再設定例を示します。

ライブラリの再設定例

setenv LD_LIBRARY_PATH /usr/local/lib:/opt/FSUNrdb2b/lib: …

(1) (2)

(1) ファンクションルーチンのライブラリ

(2) Symfoware/RDB のSQLSignalMSG関数ライブラリ

参考

テストドライバの実行例

drv002: dlopen start

drv002: dlsym start

drv002:make indata

drv002:make outdata area

drv002:call func

SQLSTATE = 60000

SQLMSG = JYP4557E ファンクションルーチン“TestFunction”から例外

が送信されました.例外メッセージ=“引数1が負の値です”

drv002:call func end

drv002:ret = NULL

drv002:end

- 167 -

Windows Server(R) 2003、Windows Server(R) 2008、Windows Server(R) 2008 R2、WindowsServer(R) 2012またはWindows Server(R) 2012 R2の場合

(1) ファンクションルーチンのライブラリ作成

(2) テストドライバの実行形式作成

(3) ダミーSQLSignalMSG関数のライブラリ作成

(4) リンクするライブラリの再設定

ファンクションルーチンのライブラリ作成

ファンクションルーチンのライブラリを作成します。

ライブラリ作成についての詳細は“5.2.4 ファンクションルーチンからの異常通知”を参照してください。

テストドライバの実行形式作成

ファンクションルーチンをテストするためのテストドライバの実行形式を作成します。

テストドライバのプログラム例についてはUNIX系の場合を参照してください。

以下にテストドライバ実行形式の作成例を示します。

テストドライバ実行形式(ftestdrv001)の作成例

cl ftestdrv001.c /Feftestdrv001 -DNT

ダミーSQLSignalMSG関数のライブラリ作成

ファンクションルーチンから異常通知する場合のテストで使用するダミーSQLSignalMSG関数のライブラリを作成しま

す。

ダミーSQLSignalMSG関数のプログラム例についてはUNIX系の場合を参照してください。

ダミーSQLSignalMSG関数のライブラリ作成例として、Microsoft(R) Visual StudioにおけるStatic Libraryの作成例を

以下に示します。

1. [ファイル(F)]メニューから、[新規作成(N)]で[プロジェクト(P)]を選択します。

2. [新しいプロジェクト]ウインドウにて、[プロジェクトの種類(P)]で[Visual C++]の[Win32]を選択し、[テンプレー

ト(T)]で[Win32 プロジェクト]を選択します。

- 168 -

3. [新しいプロジェクト]ウインドウにて、[プロジェクト名(N)]を指定し、[場所(L)]にライブラリ作成場所を指定しま

す。[ソリューションのディレクトリを作成(D)]のチェックボックスのチェックを外します。[OK]を選択します。

プロジェクト名 = F3CWSQLSIGM

位置 = D:\FORSYMFO\FUNCMAKE\F3CWSQLSIGM

指定した位置に、作成したCプログラムファイルを格納しておきます。

4. [Win32 アプリケーション ウィザード]ウインドウの[Win32 アプリケーション ウィザードへようこそ]の画面にて[次

へ>]を選択します。

5. [Win32 アプリケーション ウィザード]ウインドウの[アプリケーションの設定]の画面にて[アプリケーションの種

類]で[スタティック ライブラリ(S)]を選択します。[追加オプション]で[プリコンパイル済みヘッダー(P)]のチェッ

クボックスのチェックを外します。[完了]を選択します。

6. [プロジェクト(P)]の、[既存項目の追加(G)]から、作成したCプログラムファイルをプロジェクトに追加します。

D:\FORSYMFO\FUNCMAKE\F3CWSQLSIGM\FDUMMYMSG.C

7. [ビルド(B)]から[ソリューションのビルド(B)]を選択して、ライブラリを作成します。

リンクするライブラリの再設定

単体テストの終了後は、ダミーSQLSignalMSG関数のライブラリの設定を外し、Symfoware/RDBのSQLSignalMSG関

数のライブラリを設定する必要があります。

Microsoft(R) Visual Studioにおけるライブラリの再設定例を以下に示します。

1. [ファイル(F)]メニューから、[開く(O)]で[プロジェクト/ソリューション(P)]を選択しファンクションルーチンのライ

ブラリを指定します。

ファイル場所 = D:\FORSYMFO\FUNCMAKE\USERFUNC001

ファイル名 = USERFUNC001.sln

2. ファンクションルーチンのライブラリ内で使用したダミーSQLSignalMSG関数の設定を外しSymfoware/RDBのSQLSignalMSG関数のライブラリを設定します。

1. [ツール(T)]から[オプション(O)]を選択し、[プロジェクトおよびソリューション]の[VC++ ディレクトリ]を

開きます。

2. [ディレクトリを表示するプロジェクト(S)]に“ライブラリファイル”を選択して、[ディレクトリ]にダミー

SQLSignalMSG関数のライブラリが存在する場合は指定を外し、<サーバ機能のインストール先>\ESQL\LIBまたは<クライアント機能のインストール先>\ESQL\LIBの指定を追加します。

なお、ライブラリの対象プラットフォームは、サーバが動作するプラットフォームと同じにします。

3. [ビルド(B)]から[ソリューションのリビルド(R)]を選択して、ライブラリを再作成します。

4. 作成したライブラリを、ファンクションルーチン定義文のLIBRARY句で指定するディレクトリに格納します。

D:\FORSYMFO\FUNCMAKE\USERFUNC001\RELEASE\USERFUNC001.DLL

↓ 複写

D:\FORSYMFO\FUNCLIB\USERFUNC001.DLL

参考

テストドライバの実行例

drv002: LoadLibrary start

drv002: GetProcAddress start

- 169 -

drv002:make indata

drv002:make outdata area

drv002:call func

SQLSTATE = 60000

SQLMSG = JYP4557E ファンクションルーチン"TestFunction"から例外が送信されました.例外メッセージ="引

数1が負の値です"

drv002:call func end

drv002:ret = NULL

drv002:end

- 170 -

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

本章では、アプリケーションのコンパイル・リンク作業について説明しています。

6.1 UNIX系を使用した場合のアプリケーションのコンパイル・リンク

UNIX系を使用した場合のアプリケーションのコンパイル・リンクについて説明します。

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

アプリケーションのコーディングが完了すると、これをコンパイルおよびリンクしてロードモジュールを作成します。ここで

は、アプリケーションをコンパイルおよびリンクする作業について説明します。

アプリケーションのコンパイル・リンクの概要を以下に示します。

図6.1 アプリケーションのコンパイル・リンクの概要

SQL文を使用するアプリケーションでは、コンパイル・リンクによりアプリケーションのロードモジュールを作成します。

アプリケーションのロードモジュールは、通常のプログラムと同じ形式のロードモジュールです。以後、アプリケーションの

ロードモジュールを、単にロードモジュールと呼びます。

6.1.2 コンパイル・リンクのための環境設定

アプリケーションをコンパイル・リンクするためには、作業に先立って必要な環境を設定しておく必要があります。設定す

べき環境には、以下のものがあります。

・ 環境変数の設定

・ 作業用のディレクトリ構成

環境変数の設定

アプリケーションをコンパイル・リンクするために必要な環境変数を以下に示します。

- 171 -

表6.1 アプリケーションをコンパイル・リンクする場合に必要な環境変数

環境変数名 意味

LANG(必

須項目)

アプリケーションのロケールを指定します。アプリケーションの言

語や文字コード系に何を使いたいかによってロケールを決めま

す。ロケールは具体的には、以下に影響を与えます。

・ アプリケーションのソースコード

・ アプリケーションの入出力ファイル

・ クライアント用の動作環境ファイル

・ SQLメッセージ(SQLMSG)

SQLメッセージは、以下の環境変数の強度にしたがってロケー

ルが決まります。

(強い)LC_ALL > LC_MESSAGE > LANG(弱い)

Symfoware/RDBは、ロケールの言語がjaで始まる場合は日本語

のメッセージを出力し、それ以外のロケール(Cロケールなど)の場合は英語でメッセージを出力します。

環境変数“LANG”の設定の例を以下に示します。

[Cシェルの場合]

setenv LANG ja_JP.eucJP

[bash、Bシェル、Kシェルの場合]

LANG=ja_JP.eucJP; export LANG

[TCシェルの場合]

setenv LANG ja_JP.UTF-8

[bashの場合]

LANG=ja_JP.UTF-8; export LANG

アプリケーションのロケールと文字コード系の関係を示します。

表6.2 アプリケーションのロケールと文字コード系の関係

対象OS 文字コード系 ロケール

Solaris EUCコード ja

ja_JP.eucJP

シフトJISコード ja_JP.PCK

UNICODE ja_JP.UTF-8

Linux UNICODE ja_JP.UTF-8

備考) メッセージを英語で出力したい場合は、ロケールにCを指定してください。その際の文字コード系の指定について

は、“2.3.1 文字コード系の決定”を参照してください。

アプリケーションをコンパイルするときに必要に応じて設定する環境変数を以下に示します。これらの環境変数を設定し

ておくことにより、コンパイル時にsqlcc、sqlfccまたはsqlcobolでオプションを指定する必要がなくなります。

表6.3 アプリケーションをコンパイル・リンクする場合に必要に応じて設定する環境変数

環境変数名 意味

RDBDB

アプリケーションで指定するデータベース名を指定します。

環境変数“RDBDB”の設定の例を以下に示します。

[Cシェルの場合]

- 172 -

環境変数名 意味

setenv RDBDB DB1

[bash、Bシェル、Kシェルの場合]

RDBDB=DB1; export RDBDB

[TCシェルの場合]

setenv RDBDB DB1

[bashの場合]

RDBDB=DB1; export RDBDB

SQLPC

(Cプログラ

ム時)

コンパイル時の起動オプションを指定します。起動オプションに

は、以下のものがあります。

・ -I:インクルードファイルのディレクトリ

・ -d:データベース名

・ -R:SQL文の予約語とSQL機能のレベルをSQL88でコンパイ

ルする場合に指定

・ -W:SQL文の予約語とSQL機能のレベルを指定(注)

・ -C:固定長文字列型のホスト変数に対してアプリケーションの

実行時に、NULL文字(\0)を意識した処理をする場合に指定

・ -v9:64ビットで実行するSQL埋込みCプログラムをコンパイル

する場合に指定

・ -T:マルチスレッド環境で動作するまたはセションを操作する

関数を利用するSQL埋込みCプログラムをコンパイルする場合

に指定

・ -K:選択リストに“*”を指定したカーソル宣言または単一行

SELECT文や、挿入列リストを省略したINSERT文が、アプリ

ケーションに記述されていないかチェックする場合に指定

環境変数“SQLPC”の設定の例を以下に示します。

[Cシェルの場合]

setenv SQLPC '-I /sqlapp/include '

[bash、Bシェル、Kシェルの場合]

SQLPC='-I /sqlapp/include '; export SQLPC

[TCシェルの場合]

setenv SQLPC '-I /sqlapp/include '

[bashの場合]

SQLPC='-I /sqlapp/include '; export SQLPC

SQLPCOB

(COBOLプログラム時)

コンパイル時の起動オプションを指定します。起動オプションに

は、以下のものがあります。

・ -I:インクルードファイルのディレクトリ

・ -d:データベース名

・ -R:SQL文の予約語とSQL機能のレベルをSQL88でコンパイ

ルする場合に指定

・ -W:SQL文の予約語とSQL機能のレベルを指定(注)

- 173 -

環境変数名 意味

・ -Z:COBOLソース単位がクラス定義(オブジェクト指向プログラ

ミング機能)の場合に指定

・ -A:SQL埋込みCOBOLプログラム中に単一の引用符を記述

する場合に指定

・ -f:SQL埋込みCOBOLプログラムが固定形式の場合に指定

・ -n:SQL埋込みCOBOLプログラム中の英小文字を英大文字と

して扱わない場合に指定

・ -G:SQL埋込みCOBOLプログラム中に集団項目を使用する

場合に指定

・ -E1:SQL埋込みCOBOLプログラム中に集団項目繰り返しを

使用する場合に指定

・ -g:エラーメッセージにSQL埋込みプログラムの行番号を出力

する場合に指定

・ -T:マルチスレッド環境で動作するSQL埋込みCOBOLプログ

ラムをコンパイルする場合に指定

・ -K:選択リストに“*”を指定したカーソル宣言または単一行

SELECT文や、挿入列リストを省略したINSERT文が、アプリ

ケーションに記述されていないかチェックする場合に指定

・ -v9:64ビットで実行するSQL埋込みCOBOLプログラムをコン

パイルする場合に指定

[Linuxの場合]

・ -RCS:アプリケーションの文字コード系がUNICODEの場合

に、日本語項目の表現形式を指定

- -RCS BE:日本語項目の表現形式をUCS-2のビッグエン

ディアン形式とする場合に指定

- -RCS LE:日本語項目の表現形式をUCS-2のリトルエン

ディアン形式とする場合に指定

本オプションは、アプリケーションの文字コード系がUNICODEの場合のみ指定できます。本オプションを省略した場合は、UCS-2のリトルエンディアン形式でコンパイルします。

環境変数“SQLPCOB”の設定の例を以下に示します。

[Cシェルの場合]

setenv SQLPCOB '-I /sqlapp/include '

[bash、Bシェル、Kシェルの場合]

SQLPCOB='-I /sqlapp/include '; export SQLPCOB

[TCシェルの場合]

setenv SQLPCOB '-I /sqlapp/include '

[bashの場合]

SQLPCOB='-I /sqlapp/include '; export SQLPCOB

INCDIR

インクルードファイルのディレクトリを指定します。

環境変数“INCDIR”は、アプリケーション中にINCLUDE文を記述

した場合に、Cプログラムの場合は環境変数“SQLPC”と、COBOLプログラムの場合は環境変数“SQLPCOB”と併用して設定できま

- 174 -

環境変数名 意味

す。環境変数の指定がない場合は、Cプログラム時は環境変数

“SQLPC”およびコンパイル時のみ有効となり、COBOLプログラム

時は環境変数“SQLPCOB”およびコンパイル時のみ有効となりま

す。

環境変数“INCDIR”の設定の例を以下に示します。

[Cシェルの場合]

setenv INCDIR /sqlapp/include:/splapp2/include:/use/include

[bash、Bシェル、Kシェルの場合]

INCDIR=/sqlapp/include:/splapp2/include:/use/include;

export INCDIR

[TCシェルの場合]

setenv INCDIR /sqlapp/include:/splapp2/include:/use/include

[bashの場合]

INCDIR=/sqlapp/include:/splapp2/include:/use/include;

export INCDIR

注) -Wオプションに指定する値と、その値で利用可能なSQLの機能の関係は以下のとおりです。

-Wオプション SQLの機能

-W2007 数値関数 ACOS

ASIN

ATAN

ATAN2

COS

EXP

LN

POWER

SIGN

SIN

SQRT

TAN

ASCII

OCTET_POSITION

データ列値関数 LTRIM

RTRIM

OCTET_SUBSTRING

CHR

日時値関数 CNV_TIME

CNV_TIMESTAMP

XMLQUERY関数

述語 XMLEXISTS述語

- 175 -

-Wオプション SQLの機能

ROWNUM

-W2000および-W2007

ファンクションルーチン

ロール

プロシジャ例外事象 条件宣言

ハンドラ宣言

SIGNAL文

RESIGNAL文

-W96、-W2000およ

び-W2007トリガ

行識別子

並列指定

-W95、-W96、-W2000および-W2007

プロシジャルーチン

-W92、-W95、-W96、-W2000および-W2007

定数 日時定数

時間隔定数

データ型 日時型

時間隔型

BLOB型

順序定義

一時表定義

数値関数 POSITION

EXTRACT

CHAR_LENGTH

CHARACTER_LENGTH

OCTET_LENGTH

データ列値関数 SUBSTRING

UPPER

LOWER

TRIM

日時値関数 CURRENT_DATE

CURRENT_TIME

CURRENT_TIMESTAMP

CAST指定

CASE式 NULLIF

COALESCE

CASE

結合表

カーソルのSCROLL指定

ただし、環境変数RDBDBを指定した場合、またはSQLPCおよびSQLPCOBでコンパイル時の起動オプションに-dを指定

した場合、そのアプリケーションからCONNECT文を実行することはできません。

- 176 -

アプリケーションをCOBOLで作成する場合は、COBOLプログラムのコンパイルのための環境変数の定義も必要となりま

す。

参照

COBOLプログラムのコンパイルのために必要な環境変数の定義については、“Sun日本語COBOL使用手引書”、

“NetCOBOL使用手引書”または“COBOL97使用手引書”を参照してください。

作業用のディレクトリ構成

アプリケーションのコンパイル・リンクで参照あるいは作成するファイルを格納するための、作業用のディレクトリ構成を決

めます。ディレクトリ構成は、開発および保守のしやすさを考慮して作成してください。

本章でアプリケーションのコンパイル・リンクの例を示す場合、作業用のディレクトリは以下の構成で作成されているもの

とします。

図6.2 作業用のディレクトリ構成の例

6.1.3 コンパイル・リンクの方法

コンパイル・リンクを行うには、以下の2つの方法があります。

・ コンパイル・リンクを一括して実行する

・ プレコンパイルとコンパイルを分けて実行する

コンパイル・リンクを一括して実行する場合は、標準シェルプロシジャを利用します。プレコンパイルとコンパイルを分けて

実行する場合は、sqlpcコマンドまたはsqlpcobコマンドを利用します。

- 177 -

コンパイル・リンクを一括して実行する場合

アプリケーションをコンパイル・リンクするためのシェルプロシジャが、システムから提供されています。これを、標準シェル

プロシジャと呼びます。標準シェルプロシジャは、以下のファイルに提供されています。

なお、これらのファイル名は標準シェルプロシジャを“/opt”配下のディレクトリにインストールした場合のものです。

OSの種類 ファイル名 備考

Solaris

/opt/FSUNrdb2b/demo/shell/sqlcc または

/opt/FSUNrdb2b/demo/shell/sqlfccC言語用のシェルプロシジャ

/opt/FSUNrdb2b/demo/shell/sqlcobolCOBOL用のシェルプロシ

ジャ

Linux

/opt/FJSVrdb2b/demo/shell/sqlcc C言語用のシェルプロシジャ

/opt/FJSVrdb2b/demo/shell/sqlcobolCOBOL用のシェルプロシ

ジャ

C言語用の標準シェルプロシジャ

C言語用の標準シェルプロシジャはsqlccです。Solarisの場合は、sqlfccも使用できます。sqlccおよびsqlfccの入力ファ

イルは、SQL埋込みCプログラムのソースファイルです。このファイル名には拡張子として“.c”および“.lst”以外を指定

する必要があります。出力ファイルは実行可能プログラムです。また、sqlccおよびsqlfccは作業用のファイルを作成し

ます。作業用のファイルについては、ファイル名が自動的に決定されカレントディレクトリに作成されます。C言語の場

合は、文字コード系に依存しないロードモジュールが作成されます。文字コード系は実行時にクライアント用の動作

環境ファイルまたは環境変数で指定します。sqlccおよびsqlfccの使用例を以下に示します。

例1

sqlccの使用例を示します。“main”を持つSQL埋込みCプログラム(demo01.sc)をコンパイル・リンクします。ロード

モジュールは“demo01”とします。

cd /home/rdb2/application/src

sqlcc -I/home/rdb2/include demo01.sc -o ../bin/demo01

(1) (2) (3)

(1) インクルードファイルを検索するディレクトリを指定するオプション

(2) SQL埋込みCプログラムのファイル名

(3) ccコマンド用のオプション

- 178 -

(3) gccコマンド用のオプション

例2

sqlfccの使用例を示します。“main”を持つSQL埋込みCプログラム(demo01.sc)をコンパイル・リンクします。ロード

モジュールは“demo01”とします。

cd /home/rdb2/application/src

sqlfcc -I/home/rdb2/include demo01.sc -o ../bin/demo01

(1) (2) (3)

(1) インクルードファイルを検索するディレクトリを指定するオプション

(2) SQL埋込みCプログラムのファイル名

(3) fccコマンド用のオプション

オプション

sqlccまたはsqlfccでは、使用するインクルードファイルの配置ディレクトリなどのオプションが指定できます。64ビッ

トで実行するSQL埋込みCプログラムをコンパイル・リンクする場合は、v9オプションを指定してください。また、マ

ルチスレッド環境で動作するまたはセションを操作する関数を利用するSQL埋込みCプログラムをコンパイル・リン

クする場合は、Tオプションを指定してください。

参照

オプションの詳細については、“コマンドリファレンス”を参照してください。

SQL埋込みCプログラムのファイル名

SQL埋込みCプログラムで記述されたアプリケーションの、ソースファイルを指定します。

ccコマンド用のオプション

sqlccはロードモジュールを作成するために、ccコマンドを実行します。このとき、ccコマンドに渡すオプションを指

定します。

gccコマンド用のオプション

sqlccはロードモジュールを作成するために、gccコマンドを実行します。このとき、gccコマンドに渡すオプションを

指定します。

fccコマンド用のオプション

sqlfccはロードモジュールを作成するために、fccコマンドを実行します。このとき、fccコマンドに渡すオプションを

指定します。

COBOL用の標準シェルプロシジャ

COBOL用の標準シェルプロシジャはsqlcobolです。sqlcobolの入力ファイルは、SQL埋込みCOBOLプログラムのソー

スファイルです。このファイル名には拡張子として“.cobol”および“.lst”以外を指定する必要があります。出力ファイル

はロードモジュールです。また、sqlcobolは作業用のファイルを作成します。作業用のファイルについては、ファイル

名が自動的に決定されカレントディレクトリに作成されます。sqlcobolの使用例を以下に示します。

主プログラムであるSQL埋込みCOBOLプログラム(demo02.scob)を、コンパイル・リンクします。ロードモジュール

は“demo02”とします。

cd /home/rdb2/application/src

sqlcobol -I/home/rdb2/include demo02.scob -M -o ../bin/demo02

- 179 -

(1) (2) (3)

(1) インクルードファイルを検索するディレクトリを指定するオプション

(2) SQL埋込みCOBOLプログラムのファイル名

(3) cobolコマンド用のオプション

オプション

sqlcobolでは、使用する登録集原文ファイルの配置ディレクトリなどのオプションが指定できます。64ビットで実行

するSQL埋込みCOBOLプログラムをコンパイル・リンクする場合は、v9オプションを指定してください。また、マル

チスレッド環境で動作するSQL埋込みCOBOLプログラムをコンパイル・リンクする場合は、Tオプションを指定して

ください。

参照

オプションの詳細については、“コマンドリファレンス”を参照してください。

SQL埋込みCOBOLプログラムのファイル名

SQL埋込みCOBOLプログラムで記述されたアプリケーションの、ソースファイルを指定します。

cobolコマンド用のオプション

sqlcobolはロードモジュールを作成するために、cobolコマンドを実行します。このとき、cobolコマンドに渡すオプ

ションを指定します。

- 180 -

プレコンパイルとコンパイルを分けて実行する場合

アプリケーションをコンパイル・リンクするために、まずsqlpcコマンドまたはsqlpcobコマンドを利用してプレコンパイルしま

す。アプリケーションをプレコンパイルすることによって、アプリケーション中のSQL文をコンパイルし、標準のCプログラム

またはCOBOLプログラムに変換します。その後、ccコマンド、gccコマンド、fccコマンドまたはcobolコマンドを利用してロー

ドモジュールを作成します。

注意

プレコンパイルによって作成されたソースファイルは、中身を変更しないでください。

C言語を使用する場合

C言語用のプレコンパイルコマンドは、sqlpcです。sqlpcコマンドの入力ファイルは、SQL埋込みCプログラムのソース

ファイルです。このファイル名には拡張子として“.c”および“.lst”以外を指定する必要があります。出力ファイルはCプログラムのソースファイルで、ファイル名に拡張子として“.c”が付きます。

参照

sqlpcコマンドの詳細については、“コマンドリファレンス”を参照してください。

プレコンパイルが終了したら、ロードモジュールを作成します。ロードモジュールを作成するためには、ccコマンド、gccコマンドまたはfccコマンドを実行します。C言語の場合は、文字コード系に依存しないロードモジュールが作成されま

す。文字コード系は実行時にクライアント用の動作環境ファイルまたは環境変数で指定します。

- 181 -

C言語を使用した、コンパイル・リンクの例を以下に示します。

例1

主プログラムであるSQL埋込みCプログラム(demo03.sc)を、コンパイル・リンクします。ロードモジュールは“demo03”とします。

cd /home/rdb2/application/src

sqlpc demo03.sc

(1)

cc -o ../bin/demo03 -lsqldrv -L/opt/FSUNrdb2b/lib demo03.c

(2) (3) (4)

(1) SQL埋込みCプログラムのファイル名

(2) RDBライブラリを指定するオプション

(3) RDBライブラリのパスを指定するオプション

(4) プレコンパイル後のSQL埋込みCプログラムのファイル名

例2

RHEL5(x86)またはRHEL6(x86)の場合

主プログラムであるSQL埋込みCプログラム(demo03.sc)を、コンパイル・リンクします。ロードモジュールは

“demo03”とします。

cd /home/rdb2/application/src

sqlpc demo03.sc

(1)

gcc -o ../bin/demo03 -lsqldrv -L/opt/FJSVrdb2b/lib demo03.c

(2) (3) (4)

(1) SQL埋込みCプログラムのファイル名

(2) RDBライブラリを指定するオプション

(3) RDBライブラリのパスを指定するオプション

(4) プレコンパイル後のSQL埋込みCプログラムのファイル名

例3

RHEL5(Intel64)、RHEL6(Intel64)またはRHEL7の場合

32ビットで動作するアプリケーションの場合

主プログラムであるSQL埋込みCプログラム(demo03.sc)を、コンパイル・リンクします。ロードモジュールは

“demo03”とします。

cd /home/rdb2/application/src

sqlpc demo03.sc

(1)

gcc -o ../bin/demo03 -m32 -mtune=i386 -lsqldrv -L/opt/FJSVrdb2b/lib demo03.c

(2) (3) (4) (5)

(1) SQL埋込みCプログラムのファイル名

(2) 32ビットアプリケーションのコンパイル・リンクを指定するオプション

(3) RDBライブラリを指定するオプション

- 182 -

(4) RDBライブラリのパスを指定するオプション

(5) プレコンパイル後のSQL埋込みCプログラムのファイル名

64ビットで動作するアプリケーションの場合

主プログラムであるSQL埋込みCプログラム(demo03.sc)を、コンパイル・リンクします。ロードモジュールは

“demo03”とします。

cd /home/rdb2/application/src

sqlpc -v9 demo03.sc

(1)

gcc -o ../bin/demo03 -lsql64drv -L/opt/FJSVrdb2b/lib demo03.c

(2) (3) (4)

(1) SQL埋込みCプログラムのファイル名

(2) RDBライブラリを指定するオプション

(3) RDBライブラリのパスを指定するオプション

(4) プレコンパイル後のSQL埋込みCプログラムのファイル名

COBOLを使用する場合

COBOL用のプレコンパイルコマンドは、sqlpcobです。sqlpcobコマンドの入力ファイルは、SQL埋込みCOBOLプログ

ラムのソースファイルです。このファイル名には拡張子として“.cobol”および“.lst”以外を指定する必要があります。出

力ファイルはCOBOLプログラムのソースファイルで、ファイル名に拡張子として“.cobol”が付きます。

参照

sqlpcobコマンドの詳細については、“コマンドリファレンス”を参照してください。

プレコンパイルが終了したら、ロードモジュールを作成します。ロードモジュールを作成するためには、cobolコマンド

を実行します。

COBOLを使用した、コンパイル・リンクの例を以下に示します。

主プログラムであるSQL埋込みCOBOLプログラム(demo04.scob)を、コンパイル・リンクします。ロードモジュール

は“demo04”とします。

cd /home/rdb2/application/src

sqlpcob demo04.scob

(1)

cobol -M -o ../bin/demo04 -lsqldrv -L/opt/FSUNrdb2b/lib demo04.cobol

(2) (3) (4)

(1) SQL埋込みCOBOLプログラムのファイル名

(2) RDBライブラリを指定するオプション

(3) RDBライブラリのパスを指定するオプション

(4) プレコンパイル後のSQL埋込みCOBOLプログラムのファイル名

コンパイル・リンクする場合に必要なオプション

ccコマンド、gccコマンド、fccコマンドおよびcobolコマンドの実行時には、必要に応じてオプションを指定します。アプ

リケーションをコンパイル・リンクする場合に必要なオプションを以下に示します。

- 183 -

表6.4 アプリケーションをコンパイル・リンクする場合に必要なオプション

指定するオプション オプションの役割

-M COBOLの場合に指定

-L/opt/FSUNrdb2b/lib(Solaris)

RDBライブラリパス指定

-L/opt/FJSVrdb2b/lib(Linux)

RDBライブラリパス指定

-lsqldrvmRDBライブラリ名(32ビットでかつ、マルチスレッド

で実行するアプリケーションをコンパイル・リンク

する場合に指定)

-lsqldrvRDBライブラリ名(32ビットで実行するアプリケー

ションをコンパイル・リンクする場合に指定)

-lsql64drvmRDBライブラリ名(64ビットでかつ、マルチスレッド

で実行するアプリケーションをコンパイル・リンク

する場合に指定)

-lsql64drvRDBライブラリ名(64ビットで実行するアプリケー

ションをコンパイル・リンクする場合に指定)

-xarch=v9(Solaris)

64ビットで実行するSQL埋込みCプログラムをコ

ンパイル・リンクする場合に指定

-mt(Solaris)

マルチスレッドで実行するアプリケーションをコン

パイル・リンクする場合に指定

-D_REENTRANT -lpthread(Linux)

マルチスレッドで実行するアプリケーションをコン

パイル・リンクする場合に指定

-m32 -mtune=i386(Linux)

RHEL5(Intel64)、RHEL6(Intel64)またはRHEL7で32ビットで実行するアプリケーションをコンパイ

ル・リンクする場合に指定

6.1.4 複数のコンパイル単位から構成されるアプリケーションのコンパイル・リンクの方法

前項では、SQL文を使用するアプリケーションが1つのコンパイル単位である場合の、コンパイル・リンクの方法について

説明しました。一方、大規模なアプリケーションの開発においては、複数のコンパイル単位から構成されるアプリケーショ

ンを作成し、これらをコンパイル・リンクするような開発方法が必要となります。本項では、このようなアプリケーションがSQL文を使用する場合の、コンパイル・リンクの方法について説明します。

複数のコンパイル単位から構成されるアプリケーションでは、ロードモジュールはアプリケーションの開発や保守の形態、

および実行環境を考慮して、それぞれのコンパイル単位を静的リンクするか、または動的リンクするかを選択します。

注意

複数のファイルで構成されるアプリケーションを実行する場合は、同名のSQL文識別子名は使用できません。

6.1.4.1 静的リンクする場合のコンパイル・リンク

複数のコンパイル単位を静的リンクする場合のコンパイル・リンクの方法を以下に示します。

- 184 -

図6.3 複数のコンパイル単位を静的リンクする場合のコンパイル・リンクの方法

SQL文を使用するコンパイル単位は、sqlcc、sqlfccまたはsqlcobolを使用してコンパイル・リンクを行います。

参照

sqlcc、sqlfccおよびsqlcobolのオプションの指定方法については、“コマンドリファレンス”を参照してください。

アプリケーションによっては、SQL文を使用しないコンパイル単位が存在する場合があります。SQL文を使用しないコンパ

イル単位は、ccコマンド、gccコマンド、fccコマンドまたはcobolコマンドを使用してコンパイル・リンクを行います。

また、ロードモジュールを静的リンクして作成するには、副プログラムのオブジェクトファイルを作成し、主プログラムに静

的にリンクする必要があります。

アプリケーションを静的リンクする場合に必要なオプションを以下に示します。

表6.5 アプリケーションを静的リンクする場合に必要なオプション

コンパイル対象の性質 指定するオプション 備考

SQL文を含む

コンパイル単位

主プロ

グラム

副プログラムのオブジェク

トファイル名リンクする副プログラム

-M COBOLの場合に指定

副プロ

グラム-c オブジェクトファイルの作成

SQL文を含ま

ないコンパイル

単位

主プロ

グラム

副プログラムのオブジェク

トファイル名リンクする副プログラム

-M COBOLの場合に指定

-L/opt/FSUNrdb2b/libRDBライブラリパス指定

(Solaris)

-L/opt/FJSVrdb2b/libRDBライブラリパス指定

(Linux)

-lsqldrvm

RDBライブラリ名(32ビットでか

つ、マルチスレッドで動作する

アプリケーションを静的リンクす

る場合に使用)

- 185 -

コンパイル対象の性質 指定するオプション 備考

-lsqldrvRDBライブラリ名(32ビットで実

行するアプリケーションを静的

リンクする場合に使用)

-lsql64drvm

RDBライブラリ名(64ビットでか

つ、マルチスレッドで実行する

アプリケーションを静的リンクす

る場合に使用)

-lsql64drvRDBライブラリ名(64ビットで実

行するアプリケーションを静的

リンクする場合に使用)

副プロ

グラム-c オブジェクトファイルの作成

C言語使用時の例

以下の例において、sqlfccを利用する場合は、sqlccをsqlfccに、またccをfccに置き換えたものになります。

例1

SQL文を使用する主プログラム (demo04main.sc)と、SQL文を使用する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

SQL文を使用しない主プログラム(demo05main.c)と、SQL文を使用する副プログラム(demo05sub1.sc)、およびSQL文を使用しない副プログラム(demo05sub2.c)を静的リンクします。ロードモジュール名は“demo05”とします。

なお、Linuxの場合は、Lオプションに指定するパス名を読み替えてください。

cd /home/rdb2/application/src

sqlcc demo05sub1.sc -c

cc -c demo05sub2.c

cc -o ../bin/demo05 -L/opt/FSUNrdb2b/lib -lsqldrv demo05main.c demo05sub1.o demo05sub2.o

例3

64ビットで実行するアプリケーションを静的リンクする場合の例を示します。SQL文を使用しない主プログラム

(demo08main.c)と、SQL文を使用する副プログラム(demo08sub1.sc)、およびSQL文を使用しない副プログラム

(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/FSUNrdb2b/lib -lsql64drv demo08main.c demo08sub1.o demo08sub2.o

例4

64ビットで実行するアプリケーションを静的リンクする場合の例を示します。SQL文を使用しない主プログラム

(demo09main.c)と、SQL文を使用する副プログラム(demo09sub1.sc)、およびSQL文を使用しない副プログラム

(demo09sub2.c)を静的リンクします。ロードモジュール名は“demo09”とします。

cd /home/rdb2/application/src

sqlcc -v9 demo09sub1.sc -c

- 186 -

cc -c demo09sub2.c

cc -o ../bin/demo09 -L/opt/FJSVrdb2b/lib -lsql64drv demo09main.c demo09sub1.o demo09sub2.o

COBOL使用時の例

例1

SQL文を使用する主プログラム(demo06main.scob)と、SQL文を使用する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

SQL文を使用しない主プログラム(demo07main.cobol)と、SQL文を使用する副プログラム(demo07sub1.scob)、および

SQL文を使用しない副プログラム(demo07sub2.cobol)を静的リンクします。ロードモジュール名は“demo07”とします。

cd /home/rdb2/application/src

sqlcobol demo07sub1.scob -c

cobol -c demo07sub2.cobol

cobol -M -o ../bin/demo07 -L/opt/FSUNrdb2b/lib -lsqldrv demo07main.cobol demo07sub1.o demo07sub2.o

例3

64ビットで実行するアプリケーションを静的リンクする場合の例を示します。SQL文を使用しない主プログラム

(demo08main.cobol)と、SQL文を使用する副プログラム(demo08sub1.scob)、およびSQL文を使用しない副プログラム

(demo08sub2.cobol)を静的リンクします。ロードモジュール名は“demo08”とします。

cd /home/rdb2/application/src

sqlcobol -v9 demo08sub1.scob -c

cobol -c demo08sub2.cobol

cobol -M -o ../bin/demo08 -L/opt/FSUNrdb2b/lib -lsql64drv demo08main.cobol demo08sub1.o demo08sub2.o

例4

64ビットで実行するアプリケーションを静的リンクする場合の例を示します。SQL文を使用しない主プログラム

(demo09main.cobol)と、SQL文を使用する副プログラム(demo09sub1.scob)、およびSQL文を使用しない副プログラム

(demo09sub2.cobol)を静的リンクします。ロードモジュール名は“demo09”とします。

cd /home/rdb2/application/src

sqlcobol -v9 demo09sub1.scob -c

cobol -c demo09sub2.cobol

cobol -M -o ../bin/demo09 -L/opt/FJSVrdb2b/lib -lsql64drv demo09main.cobol demo09sub1.o demo09sub2.o

6.1.4.2 動的リンクする場合のコンパイル・リンク

複数のコンパイル単位を動的リンクする場合のコンパイル・リンクの方法を以下に示します。

- 187 -

図6.4 複数のコンパイル単位を動的リンクする場合のコンパイル・リンクの方法

SQL文を使用するコンパイル単位は、sqlcc、sqlfccまたはsqlcobolを使用してコンパイル・リンクを行います。

参照

sqlcc、sqlfccおよびsqlcobolのオプションの指定方法については、“コマンドリファレンス”を参照してください。

アプリケーションによっては、SQL文を使用しないコンパイル単位が存在する場合があります。

SQL文を使用しないコンパイル単位は、ccコマンド、gccコマンド、fccコマンドまたはcobolコマンドを使用してコンパイル・

リンクを行います。

また、ロードモジュールを動的リンクして作成するためには、副プログラムは共用ライブラリにロードモジュールとして作成

し、主プログラムのコンパイル・リンク時にリンクする副プログラムのロードモジュール名を指定する必要があります。

アプリケーションを動的リンクする場合に必要なオプションを以下に示します。

表6.6 アプリケーションを動的リンクする場合に必要なオプション

コンパイル対象の性質 指定するオプション 備考

SQL文を

含むコン

パイル単

主プロ

グラム

-l 副プログラムのロードモジュール名 リンクする副プログラム

-M COBOLの場合に指定

副プロ

グラム

-KPIC

C言語で共有ライブラ

リを作成する場合に指

(Solaris)

-G動的リンクの指定

(Solaris)

-fPIC

C言語で共有ライブラ

リを作成する場合に指

(Linux)

- 188 -

コンパイル対象の性質 指定するオプション 備考

-shared動的リンクの指定

(Linux)

SQL文を

含まないコ

ンパイル

単位

主プロ

グラム

-l 副プログラムのロードモジュール名 リンクする副プログラム

-M COBOLの場合に指定

副プロ

グラム

-KPIC

C言語で共有ライブラ

リを作成する場合に指

(Solaris)

-G動的リンクの指定

(Solaris)

-fPIC

C言語で共有ライブラ

リを作成する場合に指

(Linux)

-shared動的リンクの指定

(Linux)

C言語使用時の例

以下の例において、sqlfccを利用する場合は、sqlccをsqlfccに、またccをfccに置き換えたものになります。

例1

SQL文を使用する主プログラム(demo10main.sc)と、SQL文を使用する2個の副プログラム(libsub1.sc、libsub2.sc)を動

的リンクします。ロードモジュール名は、副プログラムを“libsub1.so”および“libsub2.so”、主プログラムを“demo10main”とします。

なお、Linuxの場合は、KPICオプションとGオプションの代わりにfPICオプションとsharedオプションを指定します。

cd /home/rdb2/application/src

setenv LD_LIBRARY_PATH /home/rdb2/application/lib:$LD_LIBRARY_PATH

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

SQL文を使用しない主プログラム(demo11main.c)と、SQL文を使用する副プログラム(libsub3.sc)、およびSQL文を使

用しない副プログラム(libsub4.c)を動的リンクします。ロードモジュール名は、副プログラムを“libsub3.so”および

“libsub4.so”、主プログラムを“demo11main”とします。

なお、Linuxの場合は、KPICオプションとGオプションの代わりにfPICオプションとsharedオプションを指定します。

cd /home/rdb2/application/src

setenv LD_LIBRARY_PATH /home/rdb2/application/lib:$LD_LIBRARY_PATH

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ビットで実行するアプリケーションを動的リンクする場合の例を示します。SQL文を使用する主プログラム

(demo09main.sc)と、SQL文を使用する2個の副プログラム(libsub11.sc、libsub12.sc)を動的リンクします。ロードモジュー

ル名は、副プログラムを“libsub11.so”および“libsub12.so”、主プログラムを“demo09main”とします。

- 189 -

cd /home/rdb2/application/src

setenv LD_LIBRARY_PATH_64 /home/rdb2/application/lib:$LD_LIBRARY_PATH_64

setenv LD_LIBRARY_PATH /home/rdb2/application/lib:$LD_LIBRARY_PATH

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ビットで実行するアプリケーションを動的リンクする場合の例を示します。SQL文を使用する主プログラム

(demo09main.sc)と、SQL文を使用する2個の副プログラム(libsub11.sc、libsub12.sc)を動的リンクします。ロードモジュー

ル名は、副プログラムを“libsub11.so”および“libsub12.so”、主プログラムを“demo09main”とします。

cd /home/rdb2/application/src

setenv LD_LIBRARY_PATH /home/rdb2/application/lib:$LD_LIBRARY_PATH

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

SQL文を使用する主プログラム(demo12main.scob)と、SQL文を使用する2個の副プログラム(libsub5.scob、libsub6.scob)を動的リンクします。ロードモジュール名は、副プログラムを“libsub5.so”および“libsub6.so”、主プログラムを

“demo12main”とします。

cd /home/rdb2/application/src

setenv LD_LIBRARY_PATH /home/rdb2/application/lib:$LD_LIBRARY_PATH

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

SQL文を使用しない主プログラム(demo13main.cobol)と、SQL文を使用する副プログラム(libsub7.scob)、およびSQL文を使用しない副プログラム(libsub8.cobol)を動的リンクします。ロードモジュール名は、副プログラムを“libsub7.so”および“libsub8.so”、主プログラムを“demo13main”とします。

cd /home/rdb2/application/src

setenv LD_LIBRARY_PATH /home/rdb2/application/lib:$LD_LIBRARY_PATH

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ビットで実行するアプリケーションを動的リンクする場合の例を示します。SQL文を使用する主プログラム

(demo14main.scob)と、SQL文を使用する2個の副プログラム(libsub11.scob、libsub12.scob)を動的リンクします。ロー

ドモジュール名は、副プログラムを“libsub11.so”および“libsub12.so”、主プログラムを“demo14main”とします。

cd /home/rdb2/application/src

setenv LD_LIBRARY_PATH /home/rdb2/application/lib:$LD_LIBRARY_PATH

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 -lsub12

- 190 -

6.1.4.3 動的プログラム構造のコンパイル・リンク

動的プログラム構造のアプリケーションは、以下に示す方法でコンパイル・リンクします。動的プログラム構造は、COBOLのアプリケーションだけ利用できます。

図6.5 動的プログラム構造の場合のコンパイル・リンクの方法

SQL文を使用するコンパイル単位は、sqlcobolを使用してコンパイル・リンクを行います。

参照

sqlcobolのオプションの指定方法については、“コマンドリファレンス”を参照してください。

動的プログラム構造のロードモジュールを動的リンクして作成するためには、主プログラムのコンパイル・リンク時に、コン

パイルオプション“DLOAD”を指定します。副プログラムは共用ライブラリにロードモジュールとして作成しておきます。

アプリケーションを動的リンクする場合に必要なオプションを以下に示します。

表6.7 アプリケーションを動的リンクする場合に必要なオプション

コンパイル対象の性質 指定するオプション 備考

SQL文を

含むコン

パイル単

主プログラム-WC, "DLOAD" 動的プログラム構造の指定

-M COBOLの場合に指定

副プログラム 動的リンクオプション 動的リンクの指定

例1

動的プログラム構造のSQL文を使用する主プログラム(demo14main.scob)と、SQL文を使用する2個の副プログラム

(libsub9.scob、 libsub10.scob)を動的リンクします。ロードモジュール名は、副プログラムを“ libsub9.so”および

“libsub10.so”、主プログラムを“demo14main”とします。

cd /home/rdb2/application/src

setenv LD_LIBRARY_PATH /home/rdb2/application/lib:$LD_LIBRARY_PATH

sqlcobol libsub9.scob -o ../lib/libsub9.so

sqlcobol libsub10.scob -o ../lib/libsub10.so

sqlcobol demo14main.scob -M -o ../bin/demo14main -WC,"DLOAD"

- 191 -

例2

64ビットで実行するアプリケーションを動的リンクする場合の例を示します。動的プログラム構造のSQL文を使用する

主プログラム(demo15main.scob)と、SQL文を使用する2個の副プログラム(libsub13.scob、libsub14.scob)を動的リンク

します。ロードモジュール名は、副プログラムを“libsub13.so”および“libsub14.so”、主プログラムを“demo15main”とします。

cd /home/rdb2/application/src

setenv LD_LIBRARY_PATH /home/rdb2/application/lib:$LD_LIBRARY_PATH

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"

6.1.5 コンパイル時のコネクション先の指定

アプリケーションは、一般的にはアプリケーションでコネクションを操作して、データベースをアクセスしますが、以下の方

法により、アプリケーションにコネクション操作を記述しなくても動作することが可能となります。この場合、以下の注意が

必要です。

・ アプリケーションからローカルのデータベースを利用します

・ アプリケーション内に、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

データベース名を指定する

6.2 Windows(R)を使用した場合のアプリケーションのコンパイル・リンク

Windows(R)を使用した場合のアプリケーションのコンパイル・リンクについて説明します。

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

アプリケーションのコーディングが完了すると、これをコンパイルおよびリンクしてロードモジュールを作成します。ここで

は、アプリケーションをコンパイルおよびリンクする作業について説明します。

アプリケーションのコンパイル・リンクの概要を以下に示します。

- 192 -

クライアント(Windows(R))でコンパイル・リンクを行う場合は、SQLランタイムライブラリを使用します。また、サーバ(WindowsServer(R) 2003、Windows Server(R) 2008、Windows Server(R) 2008 R2、Windows Server(R) 2012またはWindowsServer(R) 2012 R2)でコンパイル・リンクを行う場合は、RDBライブラリを使用します。

図6.6 アプリケーションのコンパイル・リンクの概要

SQL文を使用するアプリケーションでは、コンパイル・リンクによりアプリケーションのロードモジュールを作成します。

アプリケーションのロードモジュールは、通常のプログラムと同じ形式のロードモジュールです。以後、アプリケーションの

ロードモジュールを、単にロードモジュールと呼びます。

6.2.2 コンパイル・リンクのための環境設定

アプリケーションをコンパイル・リンクするためには、作業に先立って必要な環境を設定しておく必要があります。設定す

べき環境には、以下のものがあります。

・ 環境変数の設定

・ 作業用のディレクトリ構成

環境変数の設定

アプリケーションをコンパイルするときに必要に応じて設定する環境変数を以下に示します。これらの環境変数を設定し

ておくことにより、コンパイル時にsqlccまたはsqlcobolでオプションを指定する必要がなくなります。

表6.8 アプリケーションをコンパイル・リンクする場合に必要に応じて設定する環境変数

環境変数名 意味

RDBDB

アプリケーションで指定するデータベース名を指定します。

環境変数“RDBDB”の設定の例を以下に示します。

set RDBDB=DB1

SQLPC

(Cプログラ

ム時)

コンパイル時の起動オプションを指定します。起動オプションに

は、以下のものがあります。

・ -I:インクルードファイルのディレクトリ

・ -d:データベース名

・ -R:SQL文の予約語とSQL機能のレベルをSQL88でコンパイ

ルする場合に指定

- 193 -

環境変数名 意味

・ -W:SQL文の予約語とSQL機能のレベルを指定(注)

・ -C:固定長文字列型のホスト変数に対してアプリケーションの

実行時に、NULL文字(\0)を意識した処理をする場合に指定

・ -v9:64ビットで実行するSQL埋込みCプログラムをコンパイル

する場合に指定

・ -T:マルチスレッド環境で動作するまたはセションを操作する

関数を利用するSQL埋込みCプログラムをコンパイルする場合

に指定

環境変数“SQLPC”の設定の例を以下に示します。

set SQLPC=-I C:\USERS\DEFAULT\INCLUDE

SQLPCOB

(COBOLプログラム時)

コンパイル時の起動オプションを指定します。起動オプションに

は、以下のものがあります。

・ -I:インクルードファイルのディレクトリ

・ -d:データベース名

・ -R:SQL文の予約語とSQL機能のレベルをSQL88でコンパイ

ルする場合に指定

・ -W:SQL文の予約語とSQL機能のレベルを指定(注)

・ -Z:COBOLソース単位がクラス定義(オブジェクト指向プログラ

ミング機能)の場合に指定

・ -A:SQL埋込みCOBOLプログラム中に単一の引用符を記述

する場合に指定

・ -f:SQL埋込みCOBOLプログラムが固定形式の場合に指定

・ -n:SQL埋込みCOBOLプログラム中の英小文字を英大文字と

して扱わない場合に指定

・ -G:SQL埋込みCOBOLプログラム中に集団項目を使用する

場合に指定

・ -E1:SQL埋込みCOBOLプログラム中に集団項目繰り返しを

使用する場合に指定

・ -g:エラーメッセージにSQL埋込みプログラムの行番号を出力

する場合に指定

・ -un:アプリケーションの文字コード系としてUNICODEを使用

する場合に指定

・ -RCS:UNICODE環境で動作するアプリケーションの各国語文

字列型ホスト変数のコード系を設定します。

- -RCS UTF32_BE:日本語項目の表現形式をUTF-32のビッ

グエンディアン形式とする場合に指定

- -RCS UTF32_LE:日本語項目の表現形式をUTF-32のリト

ルエンディアン形式とする場合に指定

・ -T:マルチスレッド環境で動作するSQL埋込みCOBOLプログ

ラムをコンパイルする場合に指定

・ -v9:64ビットで実行するSQL埋込みCOBOLプログラムをコン

パイルする場合に指定

環境変数“SQLPCOB”の設定の例を以下に示します。

- 194 -

環境変数名 意味

set SQLPCOB=-I C:\USERS\DEFAULT\INCLUDE

INCLUDE

インクルードファイルのディレクトリを指定します。

環境変数“INCLUDE”は、アプリケーション中にINCLUDE文を記

述した場合に、Cプログラムの場合は環境変数“SQLPC”と、COBOLプログラムの場合は、環境変数“SQLPCOB”と併用して設

定できます。

環境変数の指定がない場合は、Cプログラム時は環境変数

“SQLPC”およびコンパイル時だけ有効となり、COBOLプログラム

時は環境変数“SQLPCOB”およびコンパイル時だけ有効となりま

す。

環境変数“INCLUDE”の設定の例を以下に示します。

set INCLUDE=C:\USERS\DEFAULT\INCLUDE;C:\USERS\DEFAULT\INCLUDE2

注) -Wオプションに指定する値と、その値で利用可能なSQLの機能の関係は以下のとおりです。

-Wオプション SQLの機能

-W2007 数値関数 ACOS

ASIN

ATAN

ATAN2

COS

EXP

LN

POWER

SIGN

SIN

SQRT

TAN

ASCII

OCTET_POSITION

データ列値関数 LTRIM

RTRIM

OCTET_SUBSTRING

CHR

日時値関数 CNV_TIME

CNV_TIMESTAMP

XMLQUERY関数

述語 XMLEXISTS述語

ROWNUM

-W2000および-W2007

ファンクションルーチン

ロール

プロシジャ例外事象 条件宣言

- 195 -

-Wオプション SQLの機能

ハンドラ宣言

SIGNAL文

RESIGNAL文

-W96、-W2000およ

び-W2007トリガ

行識別子

並列指定

-W95、-W96、-W2000および-W2007

プロシジャルーチン

-W92、-W95、-W96、-W2000および-W2007

定数 日時定数

時間隔定数

データ型 日時型

時間隔型

BLOB型

順序定義

一時表定義

数値関数 POSITION

EXTRACT

CHAR_LENGTH

CHARACTER_LENGTH

OCTET_LENGTH

データ列値関数 SUBSTRING

UPPER

LOWER

TRIM

日時値関数 CURRENT_DATE

CURRENT_TIME

CURRENT_TIMESTAMP

CAST指定

CASE式 NULLIF

COALESCE

CASE

結合表

カーソルのSCROLL指定

ただし、環境変数RDBDBを指定した場合、またはSQLPCおよびSQLPCOBのコンパイル時の起動オプションに-dを指定

した場合、そのアプリケーションからCONNECT文を実行することはできません。

アプリケーションをCOBOLで作成する場合

COBOLプログラムのコンパイルのための環境変数の定義が必要となります。

- 196 -

参照

COBOLプログラムのコンパイルのために必要な環境変数の定義については、“NetCOBOL使用手引書”または

“COBOL97使用手引書”を参照してください。

アプリケーションをC言語で作成する場合

アプリケーションの対象プラットフォーム用のVisual C++ツールセットが動作するように環境を設定してください。

Microsoft(R) Visual Studio 2008での作成手順の例を以下に示します。

1. [スタート]メニューから、[プログラム(P)]で[Microsoft Visual Studio 2008]の[Visual Studio Tools]を選択しま

す。

2. 表示されたメニューから、対象プラットフォームに対応した項目を選択します。

- Visual Studio 2008 コマンド プロンプト

- Visual Studio 2008 x64 Cross Tools コマンド プロンプト

参照

Visual C++ツールセットの設定方法については、“Microsoft(R)Visual C++のドキュメント”を参照してください。

注意

Windows(R)において、Symfoware/RDBまたはEsqlのインストールにより、アプリケーションのコンパイル・リンクに必要

な環境変数“INCLUDE”および“LIB”が、自動的にシステム環境変数に設定されます。

ユーザ環境変数に“INCLUDE”および“LIB”を設定する場合、それぞれのユーザ環境変数の 後に“;%INCLUDE%”および“;%LIB%”を設定しシステム環境変数が継承されるようにしてください。

ユーザ環境変数“INCLUDE”の場合 : ~;%INCLUDE%

ユーザ環境変数“LIB”の場合 : ~;%LIB%

作業用のディレクトリ構成

アプリケーションのコンパイル・リンクで参照あるいは作成するファイルを格納するための、作業用のディレクトリ構成を決

めます。ディレクトリ構成は、開発および保守のしやすさを考慮して作成してください。

本章でアプリケーションのコンパイル・リンクの例を示す場合、作業用のディレクトリは以下の構成で作成されているもの

とします。

図6.7 作業用のディレクトリ構成の例

6.2.3 コンパイル・リンクの方法

コンパイル・リンクを行うには、以下の2つの方法があります。

- 197 -

・ コンパイル・リンクを一括して実行する

・ プレコンパイルとコンパイルを分けて実行する

コンパイル・リンクを一括して実行する場合

コンパイル・リンクを一括して実行する場合は、sqlccコマンドまたはsqlcobolコマンドを利用します。

C言語を使用する場合

C言語用のコマンドはsqlccです。sqlccの入力ファイルは、SQL埋込みCプログラムのソースファイルです。このファイル

名には拡張子として“.C”および“.LST”以外を指定する必要があります。出力ファイルは実行可能プログラムです。ま

た、sqlccは作業用のファイルを作成します。作業用のファイルについては、ファイル名が自動的に決定されカレント

ディレクトリに作成されます。C言語の場合は、文字コード系に依存しないロードモジュールが作成されます。文字コー

ド系は実行時にクライアント用の動作環境ファイルまたは環境変数で指定します。

sqlccの使用例を以下に示します。

“main”をもつSQL埋込みCプログラム (DEMO01.SC)をコンパイル・リンクします。ロードモジュールは

“DEMO01.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcc -I C:\USERS\DEFAULT\APPLICATION\INCLUDE DEMO01.SC /Fe..\BIN\DEMO01.EXE

(1) (2) (3)

(1) インクルードファイルを検索するディレクトリを指定するオプション

(2) SQL埋込みCプログラムのファイル名

(3) clコマンド用のオプション

オプション

sqlccでは、使用するインクルードファイルの配置ディレクトリなどのオプションが指定できます。64ビットで実行する

SQL埋込みCプログラムをコンパイル・リンクする場合は、v9オプションを指定してください。また、マルチスレッド環

境で動作するまたはセションを操作する関数を利用するSQL埋込みCプログラムをコンパイル・リンクする場合は、

Tオプションを指定してください。

- 198 -

参照

オプションの詳細については、“コマンドリファレンス”を参照してください。

SQL埋込みCプログラムのファイル名

SQL埋込みCプログラムで記述されたアプリケーションの、ソースファイルを指定します。

clコマンド用のオプション

sqlccはロードモジュールを作成するために、clコマンドを実行します。このとき、clコマンドに渡すオプションを指定

します。

COBOLを使用する場合

COBOL言語用のコマンドはsqlcobolです。sqlcobolの入力ファイルは、SQL埋込みCOBOLプログラムのソースファイ

ルです。このファイル名には拡張子として“.COB”および“.LST”以外を指定する必要があります。出力ファイルはロー

ドモジュールです。また、sqlcobolは作業用のファイルを作成します。作業用のファイルについては、ファイル名が自

動的に決定されカレントディレクトリに作成されます。COBOL言語の場合は、コンパイル時に文字コード系を指定しま

す。sqlcobolの使用例を以下に示します。

主プログラムであるSQL埋込みCOBOLプログラム(DEMO02.SCOB)を、コンパイル・リンクします。ロードモジュー

ルは“DEMO02.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcobol -I C:\USERS\DEFAULT\APPLICATION\INCLUDE -L"/OUT:..\BIN\DEMO02.EXE" DEMO02.SCOB -M

(1) (2) (3) (4)

(1) インクルードファイルを検索するディレクトリを指定するオプション

(2) リンカ用のオプション

(3) SQL埋込みCOBOLプログラムのファイル名

(4) cobolコマンドまたはcobol32コマンド用のオプション

オプション

sqlcobolでは、使用する登録集原文ファイルの配置ディレクトリなどのオプションが指定できます。文字コード系と

してUNICODEを使用する場合は、unオプションを指定してください。64ビットで実行するSQL埋込みCOBOLプロ

グラムをコンパイル・リンクする場合は、v9オプションを指定してください。また、マルチスレッド環境で動作するSQL埋込みCOBOLプログラムをコンパイル・リンクする場合は、Tオプションを指定してください。

参照

オプションの詳細については、“コマンドリファレンス”を参照してください。

リンカ用のオプション

sqlcobolはロードモジュールを作成するために、リンカを実行します。このとき、リンカに渡すオプションを指定しま

す。

SQL埋込みCOBOLプログラムのファイル名

SQL埋込みCOBOLプログラムで記述されたアプリケーションの、ソースファイルを指定します。

cobolコマンドまたはcobol32コマンド用のオプション

sqlcobolはロードモジュールを作成するために、cobolコマンドまたはcobol32コマンドを実行します。このとき、cobolコマンドまたはcobol32コマンドに渡すオプションを指定します。

- 199 -

プレコンパイルとコンパイルを分けて実行する場合

アプリケーションをコンパイル・リンクするために、まずsqlpcコマンドまたはsqlpcobコマンドを利用してプレコンパイルしま

す。アプリケーションをプレコンパイルすることによって、アプリケーション中のSQL文をコンパイルし、標準のCプログラム

またはCOBOLプログラムに変換します。その後、clコマンド、cobolコマンドまたはcobol32コマンドを利用してロードモジュー

ルを作成します。

注意

プレコンパイルによって作成されたソースファイルは、中身を変更しないでください。

C言語を使用する場合

C言語用のプレコンパイルコマンドは、sqlpcです。sqlpcコマンドの入力ファイルは、SQL埋込みCプログラムのソース

ファイルです。このファイル名には拡張子として“.C”および“.LST”以外を指定する必要があります。出力ファイルはCプログラムのソースファイルで、ファイル名に拡張子として“.C”が付きます。

参照

sqlpcコマンドの詳細については、“コマンドリファレンス”を参照してください。

プレコンパイルが終了したら、ロードモジュールを作成します。ロードモジュールを作成するためには、clコマンドを実

行します。C言語の場合は、文字コード系に依存しないロードモジュールが作成されます。文字コード系は実行時に

クライアント用の動作環境ファイルまたは環境変数で指定します。

- 200 -

C言語を使用した、コンパイル・リンクの例を以下に示します。

主プログラムであるSQL埋込みCプログラム(DEMO03.SC)を、コンパイル・リンクします。ロードモジュールは

“DEMO03.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlpc DEMO03.SC

(1)

cl /Fe..\BIN\DEMO03.EXE F3CWDRV.LIB DEMO03.C

(2) (3)

(1) SQL埋込みCプログラムのファイル名

(2) RDBライブラリを指定するオプション

(3)プレコンパイル後のSQL埋込みCプログラムのファイル名

COBOLを使用する場合

COBOL用のプレコンパイルコマンドは、sqlpcobです。sqlpcobコマンドの入力ファイルは、SQL埋込みCOBOLプログ

ラムのソースファイルです。このファイル名には拡張子として“.COB”および“.LST”以外を指定する必要があります。

出力ファイルはCOBOLプログラムのソースファイルで、ファイル名に拡張子として“.COB”が付きます。

参照

sqlpcobコマンドの詳細については、“コマンドリファレンス”を参照してください。

プレコンパイルが終了したら、ロードモジュールを作成します。

COBOLを使用した、コンパイル・リンクの例を以下に示します。

32ビットで実行するアプリケーション:

ロードモジュールを作成するためには、cobol32コマンドを実行します。

主プログラムであるSQL埋込みCOBOLプログラム(DEMO04.COBOL)を、コンパイル・リンクします。ロードモ

ジュールは“DEMO04.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlpcob DEMO04.COBOL

(1)

cobol32 -M DEMO04.COB

(2)

link /out:..\BIN\DEMO04.EXE F3CWDRV.LIB DEMO04.OBJ F3BICIMP.LIB LIBC.LIB KERNEL32.LIB USER32.LIB

(3)

(1) SQL埋込みCOBOLプログラムのファイル名

(2) プレコンパイル後のSQL埋込みCOBOLプログラムのファイル名

(3) RDBライブラリを指定するオプション

64ビットで実行するアプリケーション:

ロードモジュールを作成するためには、cobolコマンドを実行します。

主プログラムであるSQL埋込みCOBOLプログラム(DEMO05.COBOL)を、コンパイル・リンクします。ロードモ

ジュールは“DEMO05.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlpcob -v9 DEMO05.COBOL

(1)

cobol -M DEMO05.COB

- 201 -

(2)

link /out:..\BIN\DEMO05.EXE F3CWDRV_x64.LIB DEMO05.OBJ F4AGCIMP.LIB LIBCMT.LIB KERNEL32.LIB

USER32.LIB

(3)

(1) SQL埋込みCOBOLプログラムのファイル名

(2) プレコンパイル後のSQL埋込みCOBOLプログラムのファイル名

(3) RDBライブラリを指定するオプション

コンパイル・リンクする場合に必要なオプション

clコマンド、cobolコマンドおよびcobol32コマンドの実行時には、必要に応じてオプションを指定します。アプリケーショ

ンをコンパイル・リンクする場合に必要なオプションを以下に示します。

表6.9 アプリケーションをコンパイル・リンクする場合に必要なオプション

指定するオプション オプションの役割

-M COBOLの場合に指定

F3CWDRV.LIBRDBライブラリの指定(32ビットのシングルス

レッドで動作するアプリケーションをコンパイ

ル・リンクする場合に使用)

F3CWDRVM.LIBRDBライブラリの指定(32ビットのマルチス

レッドで動作するアプリケーションをコンパイ

ル・リンクする場合に使用)

-MTマルチスレッドで動作するアプリケーション

をコンパイル・リンクする場合に指定

F3CWDRV_x64.LIBRDBライブラリの指定(64ビットのシングルス

レッドで動作するアプリケーションをコンパイ

ル・リンクする場合に使用)

F3CWDRVM_x64.LIBRDBライブラリの指定(64ビットのマルチス

レッドで動作するアプリケーションをコンパイ

ル・リンクする場合に使用)

6.2.4 複数のコンパイル単位から構成されるアプリケーションのコンパイル・リンクの方法

前項では、SQL文を使用するアプリケーションが1つのコンパイル単位である場合の、コンパイル・リンクの方法について

説明しました。一方、大規模なアプリケーションの開発においては、複数のコンパイル単位から構成されるアプリケーショ

ンを作成し、これらをコンパイル・リンクするような開発方法が必要となります。本項では、このようなアプリケーションがSQL文を使用する場合の、コンパイル・リンクの方法について説明します。

複数のコンパイル単位から構成されるアプリケーションでは、ロードモジュールはアプリケーションの開発や保守の形態、

および実行環境を考慮して、それぞれのコンパイル単位を静的リンクするか、または動的リンクするかを選択します。

COBOL言語を使用した場合、コンパイル単位にコード系を指定できますが、1つのロードモジュール内では、コード系を

統一しなければなりません。

6.2.4.1 静的リンクする場合のコンパイル・リンク

複数のコンパイル単位を静的リンクする場合のコンパイル・リンクの方法を以下に示します。

- 202 -

図6.8 複数のコンパイル単位を静的リンクする場合のコンパイル・リンクの方法

SQL文を使用するコンパイル単位は、sqlccまたはsqlcobolを使用してコンパイル・リンクを行います。

参照

sqlccおよびsqlcobolのオプションの指定方法については、“コマンドリファレンス”を参照してください。

アプリケーションによっては、SQL文を使用しないコンパイル単位が存在する場合があります。

SQL文を使用しないコンパイル単位は、clコマンド、cobolコマンドまたはcobol32コマンドを使用してコンパイル・リンクを行

います。

また、ロードモジュールを静的リンクして作成するには、副プログラムのオブジェクトファイルを作成し、主プログラムに静

的にリンクする必要があります。

アプリケーションを静的リンクする場合に必要なオプションを以下に示します。

表6.10 アプリケーションを静的リンクする場合に必要なオプション

コンパイル対象の性質 指定するオプション 備考

SQL文を

含むコンパ

イル単位

主プログラム

副プログラムのオブジェ

クトファイル名リンクする副プログラム

-M COBOLの場合に指定

副プログラム /c オブジェクトファイルの作成

SQL文を

含まないコ

ンパイル単

主プログラム

副プログラムのオブジェ

クトファイル名リンクする副プログラム

-M COBOLの場合に指定

F3CWDRV.LIB

RDBライブラリの指定(32ビットの

シングルスレッドで動作するアプ

リケーションを静的リンクする場合

に使用)

F3CWDRVM.LIB

RDBライブラリの指定(32ビットの

マルチスレッドで動作するアプリ

ケーションを静的リンクする場合

に使用)

- 203 -

コンパイル対象の性質 指定するオプション 備考

F3CWDRV_x64.LIB

RDBライブラリの指定(64ビットの

シングルスレッドで動作するアプ

リケーションを静的リンクする場合

に使用)

F3CWDRVM_x64.LIB

RDBライブラリの指定(64ビットの

マルチスレッドで動作するアプリ

ケーションを静的リンクする場合

に使用)

副プログラム /c オブジェクトファイルの作成

C言語使用時の例

例1

SQL文を使用する主プログラム(DEMO04MAIN.SC)と、SQL文を使用する2個の副プログラム(DEMO04SUB1.SC、DEMO04SUB2.SC)を静的リンクします。ロードモジュール名は“DEMO04.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcc DEMO04SUB1.SC /c

sqlcc DEMO04SUB2.SC /c

sqlcc -L"/out:..\BIN\DEMO04.EXE DEMO04SUB1.OBJ DEMO04SUB2.OBJ" DEMO04MAIN.SC

例2

SQL文を使用しない主プログラム(DEMO05MAIN.C)と、SQL文を使用する副プログラム(DEMO05SUB1.SC)、およ

びSQL文を使用しない副プログラム(DEMO05SUB2.C)を静的リンクします。ロードモジュール名は“DEMO05.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcc DEMO05SUB1.SC /c

cl /c DEMO05SUB2.C

cl DEMO05MAIN.C /Fe..\BIN\DEMO05.EXE DEMO05SUB1.OBJ DEMO05SUB2.OBJ F3CWDRV.LIB

例3

SQL文を使用しない主プログラム(DEMO08MAIN.C)と、SQL文を使用する副プログラム(DEMO08SUB1.SC)、およ

びSQL文を使用しない副プログラム(DEMO08SUB2.C)を静的リンクします。ロードモジュール名は“DEMO08.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcc -v9 DEMO08SUB1.SC /c

cl /c DEMO08SUB2.C

cl DEMO08MAIN.C /Fe..\BIN\DEMO08.EXE DEMO08SUB1.OBJ DEMO08SUB2.OBJ F3CWDRV_x64.LIB

COBOL使用時の例

例1

SQL 文 を 使 用 す る 主 プ ロ グ ラ ム (DEMO06MAIN.SCOB) と 、 SQL 文 を 使 用 す る 2 個 の 副 プ ロ グ ラ ム

(DEMO06SUB1.SCOB、DEMO06SUB2.SCOB)を静的リンクします。ロードモジュール名は“DEMO06.EXE”としま

す。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcobol DEMO06SUB1.SCOB

sqlcobol DEMO06SUB2.SCOB

sqlcobol -L"/out:..\BIN\DEMO06.EXE DEMO06SUB1.OBJ DEMO06SUB2.OBJ" DEMO06MAIN.SCOB -M

- 204 -

例2

SQL 文 を 使 用 し な い 主 プ ロ グ ラ ム (DEMO07MAIN.COBOL) と 、 SQL 文 を 使 用 す る 副 プ ロ グ ラ ム

(DEMO07SUB1.SCOB)、およびSQL文を使用しない副プログラム(DEMO07SUB2.COBOL)を静的リンクします。ロー

ドモジュール名は“DEMO07.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcobol DEMO07SUB1.SCOB

cobol32 DEMO07SUB2.COBOL

cobol32 -M DEMO07MAIN.COBOL

link /out:..\BIN\DEMO07.EXE F3CWDRV.LIB DEMO07MAIN.OBJ DEMO07SUB1.OBJ DEMO07SUB2.OBJ F3BICIMP.LIB

LIBC.LIB KERNEL32.LIB USER32.LIB

6.2.4.2 動的リンクする場合のコンパイル・リンク

複数のコンパイル単位を動的リンクする場合のコンパイル・リンクの方法を以下に示します。

図6.9 複数のコンパイル単位を動的リンクする場合のコンパイル・リンクの方法

SQL文を使用するコンパイル単位は、sqlccまたはsqlcobolを使用してコンパイル・リンクを行ます。

参照

sqlccおよびsqlcobolのオプションの指定方法については、“コマンドリファレンス”を参照してください。

アプリケーションによっては、SQL文を使用しないコンパイル単位が存在する場合があります。

SQL文を使用しないコンパイル単位は、clコマンド、cobolコマンドまたはcobol32コマンドを使用してコンパイル・リンクを行

います。

また、ロードモジュールを動的リンクして作成するためには、副プログラムは共用ライブラリにロードモジュールとして作成

し、主プログラムのコンパイル・リンク時にリンクする副プログラムのロードモジュール名を指定する必要があります。

アプリケーションを動的リンクする場合に必要なオプションを以下に示します。

- 205 -

表6.11 アプリケーションを動的リンクする場合に必要なオプション

コンパイル対象の性質 指定するオプション 備考

SQL文を含

むコンパイ

ル単位

主プログラム副プログラムのDLL名 リンクする副プログラム

-M COBOLの場合に指定

副プログラム 動的リンクオプション 動的リンクの指定

SQL文を含

まないコン

パイル単位

主プログラム副プログラムのDLL名 リンクする副プログラム

-M COBOLの場合に指定

副プログラム 動的リンクオプション 動的リンクの指定

C言語使用時の例

例1

SQL文を使用する主プログラム(DEMO10MAIN.SC)と、SQL文を使用する2個の副プログラム(SUB1.SC、SUB2.SC)を動的リンクします。DLL名は、副プログラムを“SUB1.LIB”および“SUB2.LIB”とします。主プログラムのロードモジュー

ル名は、“DEMO10MAIN.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcc -L"/DLL /EXPORT:SUB1" SUB1.SC

sqlcc -L"/DLL /EXPORT:SUB2" SUB2.SC

sqlcc -L"/out:..\BIN\DEMO10MAIN.EXE SUB1.LIB SUB2.LIB" DEMO10MAIN.SC

例2

64ビットで実行するアプリケーションを動的リンクする場合の例を示します。SQL文を使用する主プログラム

(DEMO15MAIN.SC)と、SQL文を使用する2個の副プログラム(SUB11.SC、SUB12.SC)を動的リンクします。DLL名は、副プログラムを“SUB11.LIB ”および“SUB12.LIB ”とします。主プログラムのロードモジュール名は、

“DEMO15MAIN.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcc -v9 -L"/DLL /EXPORT:SUB11" SUB11.SC

sqlcc -v9 -L"/DLL /EXPORT:SUB12" SUB12.SC

sqlcc -v9 -L"/out:..\BIN\DEMO15MAIN.EXE SUB11.LIB SUB12.LIB" DEMO15MAIN.SC

例3

SQL文を使用しない主プログラム(DEMO11MAIN.C)と、SQL文を使用する副プログラム(SUB3.SC)、およびSQL文を

使用しない副プログラム(SUB4.C)を動的リンクします。副プログラムのライブラリ名は、“SUB3.LIB”および“SUB4.LIB”、主プログラムのロードモジュール名を“DEMO11MAIN.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcc -L"/DLL /EXPORT:SUB3" SUB3.SC

cl /c SUB4.C

link /DLL /EXPORT:SUB4 SUB4.OBJ

cl /Fe..\BIN\DEMO11MAIN.EXE DEMO11MAIN.C SUB3.LIB SUB4.LIB

COBOL使用時の例

例1

SQL文を使用する主プログラム(DEMO12MAIN.SCOB)と、SQL文を使用する2個の副プログラム(SUB5.SCOB、SUB6.SCOB)を動的リンクします。DLL名は、副プログラムを“SUB5.LIB”および“SUB6.LIB”とします。主プログラム

のロードモジュール名は、“DEMO12MAIN.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcobol -L"/DLL /EXPORT:SUB5" SUB5.SCOB

- 206 -

sqlcobol -L"/DLL /EXPORT:SUB6" SUB6.SCOB

sqlcobol -L"/out:..\BIN\DEMO12MAIN.EXE SUB5.LIB SUB6.LIB" DEMO12MAIN.SCOB -M

例2

64ビットで実行するアプリケーションを動的リンクする場合の例を示します。SQL文を使用する主プログラム

(DEMO16MAIN.SCOB)と、SQL文を使用する2個の副プログラム(SUB13.SCOB、SUB14.SCOB)を動的リンクします。

DLL名は、副プログラムを“SUB13.LIB”および“SUB14.LIB”とします。主プログラムのロードモジュール名は、

“DEMO16MAIN.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcobol -v9 -L"/DLL /EXPORT:SUB13" SUB13.SCOB

sqlcobol -v9 -L"/DLL /EXPORT:SUB14" SUB14.SCOB

sqlcobol -v9 -L"/out:..\BIN\DEMO16MAIN.EXE SUB13.LIB SUB14.LIB" DEMO16MAIN.SCOB -M

例3

SQL文を使用しない主プログラム(DEMO13MAIN.COBOL)と、SQL文を使用する副プログラム(SUB7.SCOB)、およ

びSQL文を使用しない副プログラム(SUB8.COBOL)を動的リンクします。副プログラムのDLL名は、“SUB7.LIB”およ

び“SUB8.LIB”、主プログラムのロードモジュール名を“DEMO13MAIN.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcobol -L"/DLL /EXPORT:SUB7" SUB7.SCOB

cobol32 SUB8.COBOL

link /DLL /EXPORT:SUB8 SUB8.OBJ F3BICIMP.LIB LIBC.LIB KERNEL32.LIB

USER32.LIB

cobol32 -M DEMO13MAIN.COBOL

link /out:..\BIN\DEMO13MAIN.EXE DEMO13MAIN.OBJ SUB7.LIB SUB8.LIB F3BICIMP.LIB LIBC.LIB KERNEL32.LIB

USER32.LIB

例4

64ビットで実行するアプリケーションを動的リンクする場合の例を示します。SQL文を使用しない主プログラム

(DEMO17MAIN.COBOL)と、SQL文を使用する副プログラム(SUB15.SCOB)、およびSQL文を使用しない副プログラ

ム(SUB16.COBOL)を動的リンクします。副プログラムのDLL名は、“SUB15.LIB”および“SUB16.LIB”、主プログラム

のロードモジュール名を“DEMO17MAIN.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcobol -v9 -L"/DLL /EXPORT:SUB15" SUB15.SCOB

cobol SUB16.COBOL

link /DLL /EXPORT:SUB16 SUB16.OBJ F6AGCIMP.LIB LIBCMT.LIB BUFFEROVERFLOW.LIB KERNEL32.LIB USER32.LIB

cobol -M DEMO17MAIN.COBOL

link /out:..\BIN\DEMO17MAIN.EXE DEMO17MAIN.OBJ SUB15.LIB SUB16.LIB F6AGCIMP.LIB LIBCMT.LIB

BUFFEROVERFLOW.LIB KERNEL32.LIB USER32.LIB

6.2.4.3 動的プログラム構造のコンパイル・リンク

動的プログラム構造のアプリケーションは、以下に示す方法でコンパイル・リンクします。動的プログラム構造は、COBOLのアプリケーションだけ利用できます。

- 207 -

図6.10 動的プログラム構造の場合のコンパイル・リンクの方法

SQL文を使用するコンパイル単位は、sqlcobolを使用してコンパイル・リンクを行います。

参照

sqlcobolのオプションの指定方法については、“コマンドリファレンス”を参照してください。

動的プログラム構造のロードモジュールを動的リンクして作成するためには、主プログラムのコンパイル・リンク時に、コン

パイルオプション“DLOAD”を指定します。副プログラムは共用ライブラリにロードモジュールとして作成しておきます。

アプリケーションを動的リンクする場合に必要なオプションを以下に示します。

表6.12 アプリケーションを動的リンクする場合に必要なオプション

コンパイル対象の性質 指定するオプション 備考

SQL文を含

むコンパイ

ル単位

主プログラム-WC, "DLOAD" 動的プログラム構造の指定

-M COBOLの場合に指定

副プログラム 動的リンクオプション 動的リンクの指定

例1

動的プログラム構造のSQL文を使用する主プログラム(DEMO14MAIN.SCOB)と、SQL文を使用する2個の副プログ

ラム(SUB9.SCOB、SUB10.SCOB)を動的リンクします。DLL名は、副プログラムを“SUB9.LIB”および“SUB10.LIB”、主プログラムのロードモジュール名は、“DEMO14MAIN.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcobol -L"/DLL /EXPORT:SUB9" SUB9.SCOB

sqlcobol -L"/DLL /EXPORT:SUB10" SUB10.SCOB

sqlcobol -L"/out:..\BIN\DEMO14MAIN.EXE SUB9.LIB SUB10.LIB" DEMO14MAIN.SCOB -M -WC,"DLOAD"

例2

64ビットで実行するアプリケーションを動的リンクする場合の例を示します。動的プログラム構造のSQL文を使用する

主プログラム(DEMO18MAIN.SCOB)と、SQL文を使用する2個の副プログラム(SUB17.SCOB、SUB18.SCOB)を動的

- 208 -

リンクします。DLL名は、副プログラムを“SUB17.LIB”および“SUB18.LIB”、主プログラムのロードモジュール名は、

“DEMO18MAIN.EXE”とします。

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcobol -v9 -L"/DLL /EXPORT:SUB17" SUB17.SCOB

sqlcobol -v9 -L"/DLL /EXPORT:SUB18" SUB18.SCOB

sqlcobol -v9 -L"/out:..\BIN\DEMO18MAIN.EXE SUB17.LIB SUB18.LIB" DEMO18MAIN.SCOB -M -WC,"DLOAD"

6.2.5 コンパイル時のコネクション先の指定

アプリケーションは、一般的にはアプリケーションでコネクションを操作して、データベースをアクセスしますが、以下の方

法により、アプリケーションにコネクション操作を記述しなくても動作することが可能となります。この場合、以下の注意が

必要です。

・ アプリケーションからローカルのデータベースを利用します

・ アプリケーション内に、CONNECT文は記述しません

コンパイル時にデータベースを指定する

アプリケーションをコンパイル(sqlccまたは、sqlcobol)するときに、アプリケーションで利用するデータベース名を指定しま

す。このオプションを指定すると、アプリケーションの実行時に自動的に指定したデータベースと結合されます。このた

め、アプリケーションからのCONNECT文は実行できません。

例1

データベース名を“DB01”とした場合の指定方法(Cプログラムの場合)

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcc -d DB01 -L/out:..\BIN\DEMO08.EXE DEMO08.SC

データベース名を指定する

例2

データベース名を“DB01”とした場合の指定方法(COBOLプログラムの場合)

cd C:\USERS\DEFAULT\APPLICATION\SRC

sqlcobol -d DB01 -L"/out:..\BIN\DEMO09.EXE DEMO09SUB.OBJ"

データベース名を指定する

DEMO09MAIN.SCOB -M

- 209 -

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

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

します。また、アプリケーションの実行によって、Symfoware/RDBがどのようにデータベースにアクセスしているかを知る

ため、アクセスプランを取得し、解析します。アクセスプランを解析することによって、データベースを適切にチューニング

することができます。アクセスプランの取得および解析の詳細については、“SQLTOOLユーザーズガイド”を参照してく

ださい。

本章では、アプリケーションを実行するために必要な作業と、アプリケーションのデバッグ方法について説明します。

7.1 アプリケーションの実行

アプリケーションの実行作業の流れを以下に示します。

図7.1 アプリケーションの起動操作の流れ

注) ネットワーク構成の設定は、Windows(R)の場合に必要です。

- 210 -

7.1.1 SERVER_SPECの指定

リモートのデータベースにアクセスする場合、アプリケーションを起動するには、クライアント用の動作環境ファイルに

SERVER_SPECを指定します。SERVER_SPECは、サーバと通信するために必要な情報を設定するパラメタです。リモー

トのデータベースにアクセスしない場合、SERVER_SPECは指定しません。

[クライアント用の動作環境ファイル]

SERVER_SPEC = (RDB2_TCP,SV1,DB1,HOST1,26551)

参考

通信データを暗号化する場合は、通信方法として、“RDB2_TCPS”を指定します。

データベース簡単運用では、通信データの暗号化はできません。

クライアント用の動作環境ファイルには、そのほかにも動作環境をチューニングするためのパラメタがあります。しかし、

Symfoware/RDBでは、システムの標準的な実行環境を用意しているので、SERVER_SPEC以外のパラメタを設定しなく

ても、アプリケーションを実行できるようになっています。

動作環境のチューニングについては、“7.4.1 クライアント用の動作環境ファイルによる定義”を参照してください。

7.1.2 アプリケーションの起動(UNIX系の場合)ここでは、UNIX系を使用している場合に、アプリケーションを実行するうえで必要な作業を説明します。

・ Symfoware/RDBの起動操作

・ アプリケーションの起動操作

Symfoware/RDBの起動操作

Symfoware/RDBを起動します。

参照

Symfoware/RDBを起動する方法については、“セットアップガイド”を参照してください。

データベース簡単運用の場合は、“データベース簡単運用ガイド”を参照してください。

リモートのデータベースにアクセスする場合、サーバ側に、ポート番号の設定が必要です。ポート番号の指定について

は、“サービス名とポート番号の指定について”を参照してください。

また、データベース簡単運用を行わない場合は、システム用の動作環境ファイルのパラメタの設定により、データベース

アクセスに関する動作環境のチューニングを行うことができます。

参照

システム用の動作環境ファイルについては、“セットアップガイド”を参照してください。

アプリケーションの起動操作

アプリケーションを起動するためには、以下の作業を順番に行います。

1. 環境変数を設定する

2. 使用する動作環境ファイルを指定する

3. アプリケーションを起動する

- 211 -

1)環境変数を設定する

アプリケーションを実行する前に、以下の環境変数を設定します。

環境変数“LD_LIBRARY_PATH_64”の設定

アプリケーションのコンパイル・リンク時に64ビット用のオプションでコンパイル・リンクした場合、環境変数

“LD_LIBRARY_PATH_64”に、RDBライブラリの格納ディレクトリを設定します。

RDBライブラリの格納ディレクトリ:

/opt/FSUNrdb2b/lib

例1

C言語を使用する場合で、環境変数“LD_LIBRARY_PATH_64”の設定をCシェルのsetenvコマンドで行う場

合の例を示します。

setenv LD_LIBRARY_PATH_64 /opt/FSUNrdb2b/lib:$LD_LIBRARY_PATH_64

例2

C言語を使用する場合で、環境変数“LD_LIBRARY_PATH_64”の設定をbash、Bシェル、Kシェルで行う場

合の例を示します。

LD_LIBRARY_PATH_64=/opt/FSUNrdb2b/lib:$LD_LIBRARY_PATH_64; export LD_LIBRARY_PATH_64

環境変数“LD_LIBRARY_PATH”の設定

環境変数“LD_LIBRARY_PATH”に、RDBライブラリの格納ディレクトリを設定します。

RDBライブラリの格納ディレクトリ:

/opt/FSUNrdb2b/lib

例1

C言語を使用する場合で、環境変数“LD_LIBRARY_PATH”の設定をCシェルのsetenvコマンドで行う場合の

例を示します。

setenv LD_LIBRARY_PATH /opt/FSUNrdb2b/lib:$LD_LIBRARY_PATH

例2

C言語を使用する場合で、環境変数“LD_LIBRARY_PATH”の設定をbash、Bシェル、Kシェルで行う場合の

例を示します。

LD_LIBRARY_PATH=/opt/FSUNrdb2b/lib: $LD_LIBRARY_PATH; export LD_LIBRARY_PATH

環境変数“LD_LIBRARY_PATH”の設定

環境変数“LD_LIBRARY_PATH”に、RDBライブラリの格納ディレクトリを設定します。また、アプリケーションのコ

ンパイル・リンク時に64ビット用のオプションでコンパイル・リンクした場合、環境変数“LD_LIBRARY_PATH”に、

64ビット RDBライブラリの格納ディレクトリを設定します。

RDBライブラリの格納ディレクトリ:

/opt/FJSVrdb2b/lib

64ビット RDBライブラリの格納ディレクトリ:

/opt/FJSVrdb2b/lib/lib64

- 212 -

例1

C言語を使用する場合で、環境変数“LD_LIBRARY_PATH”の設定をTCシェルのsetenvコマンドで行う場合

の例を示します。

setenv LD_LIBRARY_PATH /opt/FJSVrdb2b/lib:$LD_LIBRARY_PATH

例2

C言語を使用する場合で、環境変数“LD_LIBRARY_PATH”の設定をbashで行う場合の例を示します。

LD_LIBRARY_PATH=/opt/FJSVrdb2b/lib:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH

動的プログラム構造のアプリケーション実行時の注意事項

動的プログラム構造のアプリケーションを実行する場合は、環境変数“LD_LIBRARY_PATH”に、以下の格納ディ

レクトリを設定します。

- RDBライブラリ

- 64ビット RDBライブラリ

- 利用者が作成したロードモジュール

環境変数“RDBNAME”の設定(マルチRDB運用の場合)

マルチRDB運用を行う場合は、アプリケーションで処理を行う対象となるSymfoware/RDB環境のシステム名を、

環境変数“RDBNAME”に設定します。この環境変数は、ローカルアクセスの場合のみ有効となります。

注意

データベース簡単運用の場合は、マルチRDB運用はできません。

参照

マルチRDB運用についての詳細は、“セットアップガイド”を参照してください。

例1

C言語を使用する場合で、環境変数“RDBNAME”の設定をCシェルのsetenvコマンドで行う場合の例を示しま

す。(RDBシステム名をrdbsys1とした場合)

setenv RDBNAME rdbsys1

例2

C言語を使用する場合で、環境変数“RDBNAME”の設定をbash、Bシェル、Kシェルで行う場合の例を示しま

す。(RDBシステム名をrdbsys1とした場合)

RDBNAME=rdbsys1; export RDBNAME

例1

C言語を使用する場合で、環境変数“RDBNAME”の設定をTCシェルのsetenvコマンドで行う場合の例を示し

ます。(RDBシステム名をrdbsys1とした場合)

setenv RDBNAME rdbsys1

- 213 -

例2

C言語を使用する場合で、環境変数“RDBNAME”の設定をbashで行う場合の例を示します。(RDBシステム

名をrdbsys1とした場合)

RDBNAME=rdbsys1; export RDBNAME

2)使用する動作環境ファイルを指定する

アプリケーションの動作環境のチューニングを行う場合、使用するクライアント用の動作環境ファイルを作成します。

通常Symfoware/RDBは、アプリケーション実行時のカレントディレクトリにある動作環境ファイルのひな型と同名の以

下の動作環境ファイルを使用します。

fssqlenvc

他のファイル名または格納ディレクトリの動作環境ファイルを使用する場合は、環境変数“SQLRTENV”に動作環境

ファイルのパス名を指定してください。

例1

C言語を使用する場合で、環境変数“SQLRTENV”の設定をCシェルのsetenvコマンドで行う場合の例を示しま

す。(動作環境ファイルのパス名を/home/user1/sqlenv1とした場合)

setenv SQLRTENV /home/user1/sqlenv1

例2

C言語を使用する場合で、環境変数“SQLRTENV”の設定をbash、Bシェル、Kシェルで行う場合の例を示します。

(動作環境ファイルのパス名を/home/user1/sqlenv1とした場合)

SQLRTENV=/home/user1/sqlenv1; export SQLRTENV

例1

C言語を使用する場合で、環境変数“SQLRTENV”の設定をTCシェルのsetenvコマンドで行う場合の例を示しま

す。(動作環境ファイルのパス名を/home/user1/sqlenv1とした場合)

setenv SQLRTENV /home/user1/sqlenv1

例2

C言語を使用する場合で、環境変数“SQLRTENV”の設定をbashで行う場合の例を示します。(動作環境ファイル

のパス名を/home/user1/sqlenv1とした場合)

SQLRTENV=/home/user1/sqlenv1; export SQLRTENV

3)アプリケーションを起動する

以上の操作がすべて完了したら、アプリケーションの起動を行います。

アプリケーション“sample”を起動するコマンド入力例を以下に示します。

Sample

7.1.3 アプリケーションの起動(Windows(R)の場合)ここでは、Windows(R)を使用している場合に、アプリケーションを実行するうえで必要な作業を説明します。

・ Symfoware/RDBの起動操作

- 214 -

・ アプリケーションの起動操作

・ アプリケーションを起動するときの注意事項

Symfoware/RDBの起動操作

Symfoware/RDBを起動します。

参照

Symfoware/RDBを起動する方法については、“セットアップガイド”を参照してください。

データベース簡単運用の場合は、“データベース簡単運用ガイド”を参照してください。

リモートのデータベースにアクセスする場合、サーバ側に、ポート番号の設定が必要です。ポート番号の指定について

は、サービス名とポート番号の指定についてを参照してください。

また、データベース簡単運用を行わない場合は、システム用の動作環境ファイルのパラメタの設定により、データベース

アクセスに関する動作環境のチューニングを行うことができます。

参照

システム用の動作環境ファイルについては、“セットアップガイド”を参照してください。

アプリケーションの起動操作

アプリケーションを起動するためには、以下の作業を順番に行います。

1. ネットワーク構成を設定する

2. 環境変数を設定する

3. 使用する動作環境ファイルを指定する

4. アプリケーションを起動する

1)ネットワーク構成を設定する

リモートのデータベースにアクセスする場合、Symfoware/RDBは、TCP/IPプロトコルを利用して、アプリケーションと

サーバとの通信を行います。このため、アプリケーションが動作するコンピュータのネットワーク構成(hostsファイル)に、

TCP/IPプロトコルの情報を設定しておく必要があります。TCP/IPプロトコルの設定では、アプリケーションがコネクショ

ンを接続するサーバのIPアドレスとホスト名を設定します。ホスト名は、動作環境ファイルの“SERVER_SPEC”のホス

ト名と同じ名前を指定してください。

2)環境変数を設定する

アプリケーションを実行する前に、以下の環境変数を設定します。

環境変数“PATH”の設定

Symfoware/RDBまたはEsqlのインストールにより、アプリケーションの実行に必要な環境変数“PATH”が自動的

に設定されます。環境変数“PATH”には、RDBライブラリ(サーバ(Windows Server(R) 2003、Windows Server(R)2008、Windows Server(R) 2008 R2、Windows Server(R) 2012またはWindows Server(R) 2012 R2)でアプリケー

ションを実行する場合)またはSQLランタイムライブラリ(クライアント(Windows(R)でアプリケーションを実行する場

合)のDLLが格納されているディレクトリ名が設定されます。“PATH”は、システムに対して必要な環境変数です。

したがって、“PATH”の変更が必要な場合は、以下の方法で行ってください。

1. 以下の方法で、[環境変数]ダイアログボックスを表示します。

Windows Server(R) 2003の場合

1.[コントロールパネル]で[システム]をクリックします。

2.[詳細設定]タブの[環境変数]ボタンをクリックします。

Windows Vista(R)の場合

- 215 -

1.[コントロールパネル]で[システムとメンテナンス]をクリックします。

2.[システム]をクリックし、[設定と変更]をクリックします。

3.[詳細設定]タブの[環境変数]ボタンをクリックします。

Windows(R) 7、Windows(R) 8またはWindows(R) 8.1の場合

1.[コントロールパネル]で[システムとセキュリティ]をクリックします。

2.[システム]をクリックし、[システムの詳細設定]をクリックします。

3.[詳細設定]タブの[環境変数]ボタンをクリックします。

Windows Server(R) 2008の場合

1.[コントロールパネル]で[システムとメンテナンス]をクリックします。

2.[システム]をクリックし、[システムの詳細設定]をクリックします。

3.[詳細設定]タブの[環境変数]ボタンをクリックします。

Windows Server(R) 2008 R2、Windows Server(R) 2012またはWindows Server(R) 2012 R2の場合

1.[コントロールパネル]で[システムとセキュリティ]をクリックします。

2.[システム]をクリックし、[システムの詳細設定]をクリックします。

3.[詳細設定]タブの[環境変数]ボタンをクリックします。

2. システム環境変数のPATHを選択して[編集]ボタンをクリックします。

- 216 -

3. [システム変数の編集]ダイアログボックスでディレクトリ名を設定します。

環境変数“PATH”の設定の例(Symfoware Serverのインストール先ディレクトリがC:\SFWSVの場合)を示し

ます。

環境変数“RDBNAME”の設定(マルチRDB運用の場合)

マルチRDB運用を行う場合は、アプリケーションで処理を行う対象となるSymfoware/RDB環境のシステム名を、

環境変数“RDBNAME”に設定します。この環境変数は、ローカルアクセスの場合のみ有効となります。

“RDBNAME”を設定するには、各OSにおけるコマンド入力画面で、setコマンドを実行します。

注意

データベース簡単運用の場合は、マルチRDB運用はできません。

参照

マルチRDB運用についての詳細は、“セットアップガイド”を参照してください。

例1

環境変数“RDBNAME”の設定例を示します。(RDBシステム名をrdbsys1とした場合)

set RDBNAME=rdbsys1

3)使用する動作環境ファイルを指定する

アプリケーションの動作環境のチューニングを行う場合、使用するクライアント用の動作環境ファイルを作成します。

通常は、アプリケーション実行時のカレントディレクトリにある動作環境ファイルのひな型と同名の以下の動作環境ファ

イルを使用します。

- SQLRT.ENV

他のファイル名または格納ディレクトリの動作環境ファイルを使用する場合は、環境変数“SQLRTENV”に動作環境

ファイルのパス名を指定してください。“SQLRTENV”を設定するには、各OSにおけるコマンド入力画面で、setコマン

ドを実行します。

例1

環境変数“SQLRTENV”の設定の例を示します。

set SQLRTENV=C:\USERS\DEFAULT\SQLENV1.ENV

4)アプリケーションを起動する

以上の操作がすべて完了したら、アプリケーションの起動を行います。

アプリケーションを起動するときの注意事項

アプリケーションを起動するときの注意事項を説明します。

- 217 -

動的プログラム構造(DLOAD)オプションを利用する場合

COBOLのコンパイルで動的プログラム構造(DLOAD)オプションを指定した場合、アプリケーションの実行時に、以下

の作業が必要です。

- 実行環境情報にENTRY情報を作成します。

Symfoware/RDBまたはEsqlの以下のインストールディレクトリにENTRY情報のひな型ファイルがインストールされるの

で、複写・編集して使用してください。

インストールディレクトリ:

- Symfoware Serverをインストールした場合

ドライブ名:\SFWSV\ESQL\ETC

- Symfoware Server クライアント機能をインストールした場合

ドライブ名:\SFWCLNT\ESQL\ETC

ファイル名:

- 32ビットアプリケーションの場合

COBOL85.CBR(シングルスレッド動作用)COBOL85M.CBR(マルチスレッド動作用)

- 64ビットアプリケーションの場合

COBOL85_64.CBR(シングルスレッド動作用)COBOL85M_64.CBR(マルチスレッド動作用)

なお、ENTRY情報ファイル名は環境変数“@CBR_ENTRYFILE”に指定します。

ENTRY情報ファイルの例

[ENTRY]

B=B.DLL …… (1)

F3CWDRV=F3CWDRV.DLL …… (2)

SQLADDR=F3CWDRV …… (3)

SQLBCNVI=F3CWDRV …… (4)

SQLBCNVO=F3CWDRV …… (5)

sqlvfcnv=F3CWDRV …… (6)

(1) 利用者が、メインプログラムからCALL“定数”で指定した副プログラムのDLLファイル名などを定義します。

参照

詳細は“NetCOBOL使用手引書”または“COBOL97使用手引書”を参照してください。

(2)~(6) 必ず指定してください。

7.2 アプリケーションのデバッグ

アプリケーションをデバッグするには、以下の方法があります。

・ 状態変数およびメッセージ変数を利用する

・ SQL SNAP機能を利用する

・ ROUTINE SNAP機能を利用する

- 218 -

本章では、それぞれのデバッグ方法について説明します。

7.2.1 状態変数およびメッセージ変数の利用方法

アプリケーションでエラーが発生した場合、SQL文の実行結果から、エラーの内容を確認することができます。SQL文の

実行結果は、SQLSTATE値およびメッセージを取得することで参照できます。

参照

取得したSQLSTATEの詳細は、“アプリケーション開発ガイド(共通編)”の“SQLSTATE値”を参照してください。エラー

メッセージは“メッセージ集”を参照して、対処してください。

SQLSTATE値およびメッセージの取得方法

アプリケーションに通知された状態変数(SQLSTATE)およびメッセージ変数(SQLMSG)を参照します。変数の参照方法

については、SQL埋込みCプログラムを使用する場合は、“付録A C言語のサンプルプログラム”を参照してください。ま

た、SQL埋込みCOBOLプログラムを使用する場合は、“付録B COBOL言語のサンプルプログラム”を参照してください。

7.2.2 SQL_SNAP機能の利用方法

SQL_SNAP機能は、アプリケーションが実行したSQL文の情報を、ファイルに出力します。このファイルをスナップファイ

ルといいます。この情報により、アプリケーションのデバッグ時に、SQL文が正しく動いているかどうかを確認することがで

きます。

SQL_SNAP機能を利用するには、クライアント用の動作環境ファイルにSQL_SNAPパラメタを設定します。

指定形式については、“7.4.1 クライアント用の動作環境ファイルによる定義”を参照してください。

注意

本機能の利用は性能に影響を与えるため、デバッグ作業が終了したら、SQL_SNAPパラメタの設定をOFFにしてくださ

い。

また、格納データを暗号化している場合でも、スナップファイル内の情報は暗号化されません。そのため、デバッグ作業

が終了したら、SQL_SNAPパラメタの設定をOFFにしてください。

次にSQL_SNAPパラメタの指定の例を示します。

例1

出力レベル1のデバッグ情報を、SQLSNAP.LSTに出力します。

SQL_SNAP = (ON,SQLSNAP.LST,1)

例2

繰り返し幅を指定して、デバッグ情報をSQLSNAP.LSTに出力します。

SQL_SNAP = ( ON,SQLSNAP.LST,1,100 )

繰り返し幅 (1)

(1) 繰り返し幅を指定すると、実行したSQL文の情報を、指定した繰り返し幅でファイルに出力できます。これにより、

必要な分だけの情報が取得できます。繰り返し幅の量を超えた時点で出力ファイルを再作成します。

たとえば、100を指定した場合は、100個のSQL文情報をファイルに出力した時点で、次のSQL文情報をファイルの先

頭に出力します。

- 219 -

SQL_SNAP機能の出力形式

SQL_SNAP機能で出力される情報は、出力レベルの指定によって異なります。

1および2はシステム単位でスナップファイルを出力する場合に指定します。PRC1およびPRC2はプロセス単位でスナッ

プファイルを出力する場合に指定します。

なお、出力されるSQL文は、アプリケーションに記述したものと同一ではありません。コンパイル・リンク時に加工したもの

が出力されます。

また、複数のアプリケーションが動作する場合は、クライアント用の動作環境ファイルの実行パラメタ(DIV_TRACE_FILE)の指定により、出力ファイル名の後にプロセスIDなどの情報を付加して、個別のトレース情報を出力します。

アプリケーションがマルチスレッド環境で動作する場合は、DIV_TRACE_FILEの指定に関係なく、出力ファイル名の後

にプロセスIDやセションIDなどの情報を自動的に付加して、個別のトレース情報を出力します。

出力レベルの指定と出力情報の対応を以下に示します。

表7.1 出力レベルの指定と出力情報の対応

出力する情報 出力レベル

1 2 PRC1 PRC2

アプリケーショ

ン名○ ○ ○ ○

SQL文 (注1) ○ ○ ○ ○

カーソル情報 ○ ○ ○ ○

ホスト変数情

報(注2)- ○ - ○

SQLSTATE ○ ○ ○ ○

SQL文の処

理時間○ ○ ○ ○

メッセージ ○ ○ ○ ○

注1)SQL文名のみ出力します。

注2)ホスト変数の属性(ATTRIBUTE)とデータ(VALUES)を出力します。ホスト変数の属性(ATTRIBUTE)は次のよう

に表示されます。

表7.2 ATTRIBUTEとホスト変数のデータ型の対応表

ホスト変数の属性

(ATTRIBUTE)

ホスト変数のデータ型

CHAR(n) 固定長で長さn文字の文字列型

VCHAR(n) 可変長で長さ 大n文字の文字列型

NCHAR(n) 固定長で長さn文字の日本語文字列型

NVCHAR(n)可変長で長さ 大n文字までの日本語文

字列型

NUMERIC桁数p、小数点以下q桁のゾーン形式10進数型( NUMERIC(p,q) )

DECIMAL桁数p、小数点以下q桁のパック形式10進数型 ( DECIMAL(p,q) )

SMALLINT -215~215-1の整数型

INTEGER -231~231-1の整数型

LONG -263~263-1の整数型

FLOAT 4バイトの浮動小数点数型

- 220 -

ホスト変数の属性

(ATTRIBUTE)

ホスト変数のデータ型

DOUBLE 8バイトの浮動小数点数型

BLOBバイナリ属性のデータ型 (SQL TYPE ISBLOB)

ROW_ID ROW_ID型

レベル1を指定した場合

出力レベルに1を指定した場合は、以下の情報が出力されます。

SQL-SNAP START 14:01:13 (1) 04/18 (2) APPLICATION : sample1 (3)

STATEMENT : CONNECT (4)

SQLSTATE : 00000 (5)

SQLMSG : JYP2001I 正常に終了しました. (6)

SQL-SNAP END 14:01:16 (7) (00:00:03.204000) (8)

SQL-SNAP START 14:01:16 04/18 APPLICATION : sample1

STATEMENT : OPEN (9)

CURSOR NAME : 会社名取出 (10)

CURSOR : SELECT DISTINCT 会社名 FROM BUSINESS.取引先会社,BUSINESS.発注,BUS

INESS.在庫 WHERE 取引先会社.取引先番号=発注.取引先番号 AND 取引製

品番号=製品番号 AND 製品名=? (11)

SQLSTATE : 00000

SQLMSG : JYP2001I 正常に終了しました.

SQL-SNAP END 14:01:17 (00:00:00.867000)

SQL-SNAP START 14:01:17 04/18 APPLICATION : sample1

STATEMENT : FETCH (12)

CURSOR NAME : 会社名取出 (13)

SQLSTATE : 00000

SQLMSG : JYP2001I 正常に終了しました.

SQL-SNAP END 14:01:17 (00:00:00.055000)

(1) SQL文の実行を開始した時刻(時:分:秒)を示します。

(2) SQL文の実行を開始した日付(月/日)を示します。

(3) 実行したアプリケーションの名前を示します。

(4) 実行したSQL文の種類を示します。ここでは、CONNECT文を実行したことを示します。

(5) SQL文の実行後にSQLSTATEに通知された状態コードを示します。ここでは、CONNECT文の実行結果として、状態

コード“00000”がSQLSTATEに通知されたことを示します。

(6) SQL文の実行後にSQLMSGに通知されたメッセージ内容を示します。ここでは、CONNECT文の実行結果として、メッ

セージ“JYP2001I 正常に終了しました.”がSQLMSGに通知されたことを示します。

(4)~(6)は、1つのSQL文の実行情報です。1つのSQL文の実行情報は、SQL-SNAP START と SQL-SNAP ENDの間に

表示されます。

(7) SQL文の実行を終了した時刻(時:分:秒)を示します。

(8) SQL文の開始から終了までの経過時間(時:分:秒)を示します。

(9) カーソルのOPEN文を実行したことを示します。

(10) オープンしたカーソル名を示します。ここでは“会社名取出”を示します。

(11) カーソルの探索条件を示します。

(12) FETCH文を実行したことを示します。

(13) FETCH文を実行したカーソル名を示します。ここでは“会社名取出”を示します。

- 221 -

レベル2を指定した場合

出力レベルに2を指定した場合は、以下の情報が出力されます。

Solaris/Linuxの場合

SQL-SNAP START 14:01:13 (1) 04/18 (2) APPLICATION : sample1 (3)

STATEMENT : CONNECT (4)

CONNECTION INFORMATION (5)

001 : <SQL-SERVER> : SV1

002 : <USER-NAME> : USER1/PASS1

SQLSTATE : 00000 (6)

SQLMSG : JYP2001I 正常に終了しました. (7)

SQL-SNAP END 14:01:16 (8) (00:00:03.204000) (9)

SQL-SNAP START 14:01:16 04/18 APPLICATION : sample1

STATEMENT : OPEN (10)

CURSOR NAME : 会社名取出 (11)

CURSOR : SELECT DISTINCT 会社名 FROM BUSINESS.取引先会社,BUSINESS.発注,BUS

INESS.在庫 WHERE 取引先会社.取引先番号=発注.取引先番号 AND 取引製

品番号=製品番号 AND 製品名=? (12)

INPUT VARIABLE (13)

001 : ATTRIBUTE NCHAR(10) (14)

0000(00000) a5c6a5ec a5d3a1a1 a1a1a1a1 a1a1a1a1 * テレビ * (14)

0010(00016) a1a1a1a1 * * (14)

SQLSTATE : 00000

SQLMSG : JYP2001I 正常に終了しました.

SQL-SNAP END 14:01:17 (00:00:00.867000)

SQL-SNAP START 14:01:17 04/18 APPLICATION : sample1

STATEMENT : FETCH (15)

CURSOR NAME : 会社名取出 (16)

OUTPUT VARIABLE (17)

001 : ATTRIBUTE NCHAR(10) (18)

0000(00000) a5a2a5a4 a5c7a5a2 bea6bbf6 a1a1a1a1 * アイデア商事 * (18)

0010(00016) a1a1a1a1 * * (18)

SQLSTATE : 00000

SQLMSG : JYP2001I 正常に終了しました.

SQL-SNAP END 14:01:17 (00:00:00.055000)

(1) SQL文の実行を開始した時刻(時:分:秒)を示します。

(2) SQL文の実行を開始した日付(月/日)を示します。

(3) 実行したアプリケーションの名前を示します。

(4) 実行したSQL文の種類を示します。ここでは、CONNECT文を実行したことを示します。

(5) 実行したCONNECT文のコネクション情報を示します。ここでは、コネクション情報として、SQLサーバ名“SV1”および

ユーザ指定“USER1/PASS1”を示します。

(6) SQL文の実行後にSQLSTATEに通知された状態コードを示します。ここでは、CONNECT文の実行結果として、状態

コード“00000”がSQLSTATEに通知されたことを示します。

(7) SQL文の実行後にSQLMSGに通知されたメッセージ内容を示します。ここでは、CONNECT文の実行結果として、メッ

セージ“JYP2001I 正常に終了しました.”がSQLMSGに通知されたことを示します。

(4)~(7)は、1つのSQL文の実行情報です。1つのSQL文の実行情報は、SQL-SNAP START と SQL-SNAP ENDの間に

表示されます。

- 222 -

(8) SQL文の実行を終了した時刻(時:分:秒)を示します。

(9) SQL文の開始から終了までの経過時間(時:分:秒)を示します。

(10) カーソルのOPEN文を実行したことを示します。

(11) オープンしたカーソル名を示します。ここでは“会社名取出”を示します。

(12) カーソルの探索条件を示します。

(13) カーソルに対する入力のホスト変数を示します。

(14) カーソルに対する入力のホスト変数の属性とデータの内容を16進数で示します。ここでは、ホスト変数“製品名”の属

性とデータを示します。

(15) FETCH文を実行したことを示します。

(16) FETCH文を実行したカーソル名を示します。ここでは“会社名取出”を示します。

(17) FETCH文により位置づけた行に対する出力のホスト変数を示します。

(18) FETCH文に指定した出力のホスト変数の属性とデータの内容を16進数で示します。ここでは、ホスト変数“会社名”

の属性と内容を示します。

7.2.3 ROUTINE_SNAP機能の利用方法

プロシジャを利用するアプリケーションの場合は、サーバ側で動作するプロシジャのデバッグに、ROUTINE_SNAP機能

を利用することができます。ROUTINE_SNAP機能は、プロシジャルーチンが実行したSQL文の情報を、サーバ上のファ

イルに出力します。このファイルをルーチンスナップファイルといいます。

ROUTINE_SNAP機能を利用するには、クライアント用の動作環境ファイルにROUTINE_SNAPパラメタを設定します。

指定形式については、“7.4.1 クライアント用の動作環境ファイルによる定義”を参照してください。

次に指定の例を示します。この例では、出力レベル1のデバッグ情報を、サーバ上のROUTINE1.LSTに出力します。

Solaris/Linuxの場合

ROUTINE_SNAP = (ON,/var/tmp/ROUTINE1.LST,1)

Windows(R)の場合

ROUTINE_SNAP = (ON,E:\VAR\TMP\ROUTINE1.LST,1)

ROUTINE_SNAP機能の出力形式

ROUTINE_SNAP機能で出力される情報は、出力レベルの指定によって異なります。出力レベルの指定と出力情報の対

応を以下に示します。

表7.3 出力レベルの指定と出力情報の対応

出力する情報出力レベル

1 2

プロシジャルーチン名 ○ ○

SQL文(注) ○ ○

カーソル情報 ○ ○

ホスト変数情報 - ○

プロシジャルーチンの引数の値 ○ ○

- 223 -

出力する情報出力レベル

1 2

SQLSTATE ○ ○

メッセージ ○ ○

プロシジャルーチンの処理時間 ○ ○

注)SQL文名のみ出力します。

複数のアプリケーションが動作する場合は、クライアント用の動作環境ファイルの実行パラメタ(DIV_TRACE_FILE)の指

定により、出力ファイル名の後にプロセスIDなどの情報を付加して、個別のトレース情報を出力します。

アプリケーションがマルチスレッド環境で動作する場合は、DIV_TRACE_FILEの指定に関係なく、出力ファイル名の後

にプロセスIDやセションIDなどの情報を自動的に付加して、個別のトレース情報を出力します。

レベル1を指定した場合

出力レベルに1を指定した場合は、以下の情報が出力されます。

ROUTINE-SNAP START 14:01:13 (1) 04/18 (2) ROUTINE-NAME : sample (3)

STATEMENT : BEGIN (4)

ROUTINE-SNAP END 14:01:13 (5) (00:00:00.000000) (6)

ROUTINE-SNAP START 14:01:13 04/18 ROUTINE-NAME : sample

STATEMENT : IF (7)

ROUTINE-SNAP END 14:01:13 (00:00:00.000000)

ROUTINE-SNAP START 14:01:13 04/18 ROUTINE-NAME : sample

STATEMENT : OPEN (8)

CURSOR NAME : 会社名取出 (9)

SQLSTATE : 00000 (10)

SQLMSG : JYP2001I 正常に終了しました. (11)

ROUTINE-SNAP END 14:01:14 (00:00:00.867000)

ROUTINE-SNAP START 14:01:14 04/18 ROUTINE-NAME : sample

STATEMENT : FETCH (12)

CURSOR NAME : 会社名取出 (13)

SQLSTATE : 00000

SQLMSG : JYP2001I 正常に終了しました.

ROUTINE-SNAP END 14:01:14 (00:00:00.055000)

(1) SQL文の実行の開始時刻(時:分:秒)を示します。

(2) SQL文の実行の日付(月/日)を示します。

(3) 実行したルーチンの名前を示します。

(4) 実行したSQL文の種類を示します。ここでは、SQL制御文の複合文(BEGIN)を実行したことを示します。

(5) SQL文の実行を終了した時刻(時:分:秒)を示します。

(6) SQL文の開始から終了までの経過時間(時:分:秒)を示します。

(7) 実行したSQL文の種類を示します。 ここでは、SQL制御文のIF文を実行したことを示します。

(8) カーソルのOPEN文を実行したことを示します。

(9) オープンしたカーソル名を示します。

(10) SQL文の実行後にSQLSTATEに通知された状態コードを示します。

(11) SQL文の実行後にSQLMSGに通知されたメッセージ内容を示します。

(12) FETCH文を実行したことを示します。

(13) FETCH文を実行したカーソル名を示します。

- 224 -

レベル2を指定した場合

出力レベルに2を指定した場合は、以下の情報が出力されます。

Solaris/Linuxの場合

ROUTINE-SNAP START 14:01:13 04/18 ROUTINE-NAME : sample

STATEMENT : BEGIN

ROUTINE-SNAP END 14:01:13 (00:00:00.000000)

ROUTINE-SNAP START 14:01:13 (1) 04/18 (2) ROUTINE-NAME : sample (3)

STATEMENT : IF (4)

PARAMETER VALIABLE : (5)

P1 NCHAR(10)

0000(00000) a5c6a5ec a5d3a1a1 a1a1a1a1 a1a1a1a1 * テレビ * (6)

0010(00016) a1a1a1a1 * *

SQL VALIABLE : (7)

V1 NCHAR(10)

0000(00000) a5c6a5ec a5d3a1a1 a1a1a1a1 a1a1a1a1 * テレビ * (8)

0010(00016) a1a1a1a1 * *

ROUTINE-SNAP END 14:01:13 (9) (00:00:00.000000) (10)

ROUTINE-SNAP START 14:01:13 04/18 ROUTINE-NAME : sample

STATEMENT : OPEN

CURSOR NAME : 会社名取出

PARAMETER VALIABLE (11)

P1 NCHAR(10)

0000(00000) a5c6a5ec a5d3a1a1 a1a1a1a1 a1a1a1a1 * テレビ * (12)

0010(00016) a1a1a1a1 * *

SQLSTATE : 00000 (13)

SQLMSG : JYP2001I 正常に終了しました. (14)

ROUTINE-SNAP END 14:01:14 (00:00:00.867000)

ROUTINE-SNAP START 14:01:14 04/18 ROUTINE-NAME : sample

STATEMENT : FETCH

CURSOR NAME : 会社名取出

SQL VALIABLE : (15)

V2 NCHAR(10)

0000(00000) a5a2a5a4 a5c7a5a2 bea6bbf6 a1a1a1a1 * アイデア商事 * (16)

0010(00016) a1a1a1a1 * *

SQLSTATE : 00000

SQLMSG : JYP2001I 正常に終了しました.

ROUTINE-SNAP END 14:01:14 (00:00:00.055000)

(1) SQL文の実行の開始時刻(時:分:秒)を示します。

(2) SQL文の実行の日付(月/日)を示します。

(3) 実行したルーチンの名前を示します。

(4) 実行したSQL文の種類を示します。 ここでは、SQL制御文のIF文を実行したことを示します。

(5) IF文で使用されたパラメタ変数のデータを表示します。ここでは、P1がパラメタ名で、NCHAR(10)がデータ型を示しま

す。

(6) IF文に指定したパラメタ変数のデータの内容を16進数で表示します。

(7) IF文で使用されたSQL変数のデータを表示します。ここでは、V1がSQL変数名で、NCHAR(10)がデータ型を示しま

す。

(8) IF文に指定したSQL変数のデータの内容を16進数で表示します。

- 225 -

(9) SQL文の実行を終了した時刻(時:分:秒)を示します。

(10) SQL文の開始から終了までの経過時間(時:分:秒)を示します。

(11) OPEN文で使用されたパラメタ変数のデータを表示します。ここでは、P1がパラメタ名で、NCHAR(10)がデータ型を

示します。

(12) OPEN文で使用したパラメタ変数のデータの内容を16進数で表示します。

(13) SQL文の実行後にSQLSTATEに通知された状態コードを示します。

(14) SQL文の実行後にSQLMSGに通知されたメッセージ内容を示します。

(15) FETCH文で使用されたSQL変数のデータを表示します。ここでは、V2がSQL変数名で、NCHAR(10)がデータ型を

示します。

(16) FETCH文に指定したSQL変数のデータの内容を16進数で表示します。

7.3 最適化情報の更新

適化情報は、通常は、データベース定義時にrdbddlexコマンドを使用してSET STATISTICS文で設定しますが、デー

タベースにデータが格納された後にアクセス性能が悪くなった場合に更新することもできます。

最適化情報の更新契機

適化情報は、アクセスプランをチューニングしていない場合に設定できます。

通常は、データベースの定義時に、データベースに格納するデータの件数やインデックスキーのバリエーションを想定し

て、表のDSIおよびインデックスのDSIに対して設定します。また、運用しているうちに、データベースのアクセス性能が遅

くなった場合、または、定義時に設定したデータ量に対して2倍程度になった場合に、 適化情報を更新します。これら

の 適化情報の設定および更新は、rdbddlexコマンドを使用してSET STATISTICS文で行います。

データベース定義時に 適化情報を設定せずに表のDSIに対して初期創成を行ったとき、または、インデックスの定義

を追加し、rdbsloaderコマンドでインデックスの創成を行ったときに 適化情報を設定することもできます。この場合も、

rdbddlexコマンドを使用してSET STATISTICS文で行います。

参照

設定方法の詳細については、“RDB運用ガイド(データベース定義編)”を参照してください。

注意

・ データベース簡単運用では、SET STATISTICS文による 適化情報の更新はできません。

rdbupsコマンドによる 適化情報の設定を行ってください。

・ すでにアクセスプランのチューニングをしている場合は、それ以降にデータの状態に変更があっても、 適化情報

の設定および更新は必要ありません。

・ 適化情報の設定および変更を行うと、すでにチューニング済のアクセスプランが利用できなくなり、性能が保証さ

れません。

rdbupsコマンドによる最適化情報の更新

現在データベースに格納されているデータ量がわからない場合は、データベース情報をもとにrdbupsコマンドによって

適化情報を更新します。 適化情報の更新は、実表やインデックスの個々のデータの更新のたびに自動的に行われる

のではなく、rdbupsコマンドによって一括して更新されます。実際にデータベースをアクセスして設定する情報を採取す

るためデータベースの規模に応じて処理時間が長くなります。

- 226 -

なお、rdbupsコマンドによって更新された 適化情報は、 大3回前までリカバリすることが可能です。

注意

適化情報をリカバリすると、リカバリ前の 適化情報には戻すことができないので注意してください。

参照

rdbupsコマンドの指定方法の詳細については、“コマンドリファレンス”を参照してください。

rdbupsコマンドによる 適化情報の更新には、以下の指定があります。

データベース簡単運用の場合は、実表のみ指定できます。

・ 実表の指定

・ DSOの指定

・ DSIの指定

以下に、それぞれの指定について説明します。

実表の指定

実表または実表に対するすべてのDSIに 適化情報を設定するには、rdbupsコマンドのtオプションで該当の実表名

を指定します。

以下に指定例を示します。

rdbups -t 在庫管理DB.STOCKS.在庫表 -u PRINT

(1) (2)

(1) データベース名

(2) 実表名

DSOの指定

DSOに関するすべてのDSIに 適化情報を設定するには、rdbupsコマンドのgオプションで該当のDSO名を指定しま

す。

以下に指定例を示します。

rdbups -g 在庫管理DB.発注表DSO -u PRINT

(1) (2)

(1) データベース名

(2) DSO名

DSIの指定

特定のDSIに対する 適化情報を設定するには、rdbupsコマンドのiオプションで該当のDSI名を指定します。

以下に指定例を示します。

rdbups -I 在庫管理DB.関西発注表DSI -u PRINT

(1) (2)

(1) データベース名

(2) DSI名

設定される最適化情報の内容

rdbupsコマンドで実表を指定した場合には、表に含まれるすべてのDSIに対して、 適化情報が設定されます。また、

データベース簡単運用の場合は、表またはインデックスに対して 適化情報が設定されます。

- 227 -

DSOを指定した場合には、DSOに含まれるすべてのDSIに対して、 適化情報が設定されます。DSIを指定した場合

には、該当するDSIに対して、 適化情報が設定されます。設定される 適化情報の内容を、以下に示します。な

お、設定される 適化情報は、格納構造またはデータベースの運用形態によって異なります。

- 格納構造がSEQUENTIALおよびOBJECT、またはデータベース簡単運用で使用する表の場合

SEQUENTIAL構造、OBJECT構造およびデータベース簡単運用で使用する表は、データをその挿入順に、先

頭の格納ページから順に格納する構造になっています。データはデータ部と呼ばれる領域のページに格納され

ます。

SEQUENTIAL構造、OBJECT構造およびデータベース簡単運用で使用する表に対しては、以下の情報が設定

されます。

- 格納レコード数

- データ部の使用ページ数

- 格納構造がRANDOMの場合

RANDOM構造は、データに対してそのキーとなる列の組の値から格納ページの集まり(この集まりをバケットと呼

びます)を計算し、そのバケットにデータを格納する構造になっています。計算に使用する関数をハッシュ関数と

呼びます。データは通常はプライム部と呼ばれる領域のバケットに格納されますが、データがそのバケットに収ま

りきれないとき、オーバフロー部と呼ばれる領域のバケットに格納します。

RANDOM構造に対しては、以下の情報が設定されます。

- 格納レコード数

- プライム部の使用ページ数

- オーバフロー部の使用ページ数

- オーバフロー部の平均ページ数

- オーバフロー部の 大ページ数

- 格納構造がBTREEの場合

BTREE構造は、インデックスに対する格納構造です。内部的には、インデックスのキーとなる列の組の値からな

る木構造のインデックス部を持ち、データを格納するページをインデックス部で管理します。データを格納する

ページからなる部分をインデックス部に対してデータ部と呼びます。

BTREE構造に対しては、以下の情報が設定されます。

- データ部の使用ページ数

- インデックス部の高さ

- 異なるキー値数

参照

データベース簡単運用を行わない場合、各格納構造の詳細については、“RDB運用ガイド(データベース定義

編)”を参照してください。

最適化情報の出力

rdbupsコマンドで“-u PRINT”を指定すると、設定した 適化情報を出力することができます。以下に指定例と出力例を

示します。

例1

実表の指定をした場合の出力例(tオプション)

rdbups -t 在庫管理DB.STOCKS.関西発注表 -u PRINT

Update statistics information

Target name information

Database name ...... (1)

Schema name ...... (2)

Table name ...... (3)

- 228 -

No. 1 DSO name : (4)

DSO statistics information

Usage type : (5)

Data structure type : (6)

Related DSI information

No. 1 DSI name : (7)

DSI statistics information

Updated date ...... (8)

Usage type : (9)

Records ...... (10) (Record) (注1)

Pages( (11) ) ...... (12) (Page)

Pages( (11) ) ...... (12) (Page)

Avg-pointers(OVERFLOW) ...... (13) (Page) (注2)

Max-pointers(OVERFLOW) ...... (14) (Page) (注2)

Ix_height ...... (15) (注3)

Different number of key value (注3)

Column name (from) : (16) (注3)

Column name (to) Different key (注3)

No. 1 (17) ...... (18) (注3)

No. 2 (17) ...... (18) (注3)

No. 2 DSI name : (7)

No. 2 DSO name : (4)

注1) 表のDSIの場合にだけ表示されます。

注2) 表のデータ構造がRANDOM構造のDSIの場合にだけ表示されます。

注3) インデックスのDSIの場合にだけ表示されます。

(1) 表が所属するデータベース名

(2) 表が所属するスキーマ名

(3) 表名

(4) 表に定義されたDSO名

(5) 表に定義されたDSOの種別

BASE : 表のDSO INDEX: インデックスのDSO

(6) 表またはインデックスのデータ構造

(7) DSOに定義されたDSI名

(8) 適化情報の設定日時(“曜日 月 日 時:分:秒 西暦”)

例: “Tue Apr 17 17:06:25 2007” 備考. 適化情報が未設定の場合は、"Not updated" と出力します。

(9) DSOに定義されたDSIの種別 BASE : 表のDSI INDEX: インデックスのDSI

(10) DSIの格納レコード(行)数

(11) ぺージ数の表示(12)が対象とする割付け部

(12) DSIが使用するぺージ数(割付け部ごとに表示)

- 229 -

(13) DSIのオーバフロー部の平均ポインタ長(単位はページ数)

(14) DSIのオーバフロー部の 大ポインタ長(単位はページ数)

(15) インデックス部の高さ

(16) 異なるキー値数の表示(18)が対象とする構成列の先頭の列名

(17) 異なるキー値数の表示(18)が対象とする構成列の終端の列名

(18) DSIの異なるキー値数

注意

適化情報として、DSOおよびDSIの情報が表示されますが、データベース簡単運用の場合は、Symfoware/RDBの内

部情報ですので、無視してください。

例2

DSOの指定をした場合の出力例(gオプション)

rdbups -g 在庫管理DB.関西発注表DSO -u PRINT

Update statistics information

Target name information

Database name ...... (1)

DSO name ...... (2)

No. 1 DSO name : (2)

DSO statistics information

Usage type : (3)

Data structure type : (4)

Related DSI information

No. 1 DSI name : (5)

DSI statistics information

Updated date ...... (6)

Usage type : (7)

Records ...... (8) (Record) (注1)

Pages( (9) ) ...... (10) (Page)

Pages( (9) ) ...... (10) (Page)

Avg-pointers(OVERFLOW) ...... (11) (Page) (注2)

Max-pointers(OVERFLOW) ...... (12) (Page) (注2)

Ix_height ...... (13) (注3)

Different number of key value

Column name (from) : (14) (注3)

Column name (to) Different key

No. 1 (15) ...... (16) (注3)

No. 2 (15) ...... (16) (注3)

No. 2 DSI name : (5)

注1) 表のDSIの場合にだけ表示されます。

- 230 -

注2) 表のデータ構造がRANDOM構造のDSIの場合にだけ表示されます。

注3) インデックスのDSIの場合にだけ表示されます。

(1) DSOが所属するデータベース名

(2) DSO名

(3) DSOの種別

BASE : 表のDSO INDEX: インデックスのDSO

(4) 表またはインデックスのデータ構造

(5) DSOに定義されたDSI名

(6) 適化情報の設定日時(“曜日 月 日 時:分:秒 西暦”)

例: “Tue Apr 17 17:06:25 2007” 備考. 適化情報が未設定の場合は、"Not updated" と出力します。

(7) DSOに定義されたDSIの種別

BASE : 表のDSI INDEX: インデックスのDSI

(8) DSIの格納レコード(行)数

(9) ぺージ数の表示(10)が対象とする割付け部

(10) DSIが使用するぺージ数(割付け部ごとに表示)

(11) DSIのオーバフロー部の平均ポインタ長(単位はページ数)

(12) DSIのオーバフロー部の 大ポインタ長(単位はページ数)

(13) インデックス部の高さ

(14) 異なるキー値数の表示(16)が対象とする構成列の先頭の列名

(15) 異なるキー値数の表示(16)が対象とする構成列の終端の列名

(16) DSIの異なるキー値数

例3

DSIの指定をした場合の出力例(iオプション)

rdbups -i 在庫管理DB.関西発注表DSI -u PRINT

Update statistics information

Target name information

Database name ...... (1)

DSI name ...... (2)

No. 1 DSI name : (2)

DSI statistics information

Updated date ...... (3)

Usage type : (4)

Records ...... (5) (Record) (注1)

Pages( (6) ) ...... (7) (Page)

Pages( (6) ) ...... (7) (Page)

Avg-pointers(OVERFLOW) ...... (8) (Page) (注2)

Max-pointers(OVERFLOW) ...... (9) (Page) (注2)

Ix_height ...... (10) (注3)

Different number of key value

Column name (from) : (11) (注3)

- 231 -

Column name (to) Different key

No. 1 (12) ...... (13) (注3)

No. 2 (12) ...... (13) (注3)

Related DSO information

No. 1 DSO name : (14)

DSO statistics information

Usage type : (15)

Data structure type : (16)

注1) 表のDSIの場合にだけ表示されます。

注2) 表のデータ構造がRANDO構造のDSIの場合にだけ表示されます。

注3) インデックスのDSIの場合にだけ表示されます。

(1) DSIが所属するデータベース名

(2) DSI名

(3) 適化情報の設定日時(“曜日 月 日 時:分:秒 西暦”)

例 : “Tue Apr 17 17:06:25 2007” 備考. 適化情報が未設定の場合は、"Not updated" と出力します。

(4) DSIの種別

BASE : 表のDSI INDEX : インデックスのDSI

(5) DSIの格納レコード(行)数

(6) ぺージ数の表示(7)が対象とする割付け部

(7) DSIが使用するぺージ数(割付け部ごとに表示)

(8) DSIのオーバフロー部の平均ポインタ長(単位はページ数)

(9) DSIのオーバフロー部の 大ポインタ長(単位はページ数)

(10) インデックス部の高さ

(11) 異なるキー値数の表示(13)が対象とする構成列の先頭の列名

(12) 異なるキー値数の表示(13)が対象とする構成列の終端の列名

(13) DSIの異なるキー値数

(14) DSIが属するDSO名

(15) DSIが属するDSOの種別

BASE : 表のDSO INDEX : インデックスのDSO

(16) 表またはインデックスのデータ構造

7.4 アプリケーションのチューニング

アプリケーションの実行に必要な環境情報として、クライアント用の動作環境ファイルに実行パラメタを指定します。

7.4.1 クライアント用の動作環境ファイルによる定義

クライアント用の動作環境ファイルに、アプリケーションの動作環境を指定します。

- 232 -

動作環境パラメタの指定の優先順位

動作環境の設定項目の中には、システム用の動作環境ファイル、クライアント用の動作環境ファイルおよびサーバ用の

動作環境ファイルで重複して指定できるパラメタがあります。優先順位は、以下のとおりです。

参考

データベース簡単運用の場合には、Symfoware Severのインストール時に、システム用の動作環境として 適な環境が

設定されるため、チューニングの必要がありません。よって、システム用の動作環境ファイルは、作成不要です。

1. サーバ用の動作環境ファイル

2. クライアント用の動作環境ファイル

3. システム用の動作環境ファイル

動作環境ファイルの記述形式

動作環境ファイルを記述する文法の一般形式を以下に示します。

KEYWORD=(値1,値2,・・・,値n)

詳細形式および注意事項は以下のとおりです。

・ 実行パラメタのキーワードは英大文字で記述します。

・ 1行には、実行パラメタを1つだけ記述します。

1行内に複数の実行パラメタを記述した誤った記述例

BUFFER_SIZE = 10 TRAN_SPEC = TRANSACTION_ROLLBACK

・ 実行パラメタのカッコ“()”は省略可能です。

・ 実行パラメタの右カッコ“)”以降の記述は、コメントとみなします。

実行パラメタにコメントを記述した記述例

WAIT_TIME = (15) 待ち時間15秒

・ 行頭にセミコロン“;”のある行は、コメントとみなします。

・ キーワード、等号“=”、カッコ“()”、コンマ“,”およびセミコロン“;”の前後には、空白またはタブを記述することができま

す。

BUFFER_SIZE = (10) バッファサイズ10KB

TRAN_SPEC = (TRANSACTION_ROLLBACK) 暗黙のROLLBACK

・ 複数指定が不可能な実行パラメタを複数記述した場合には、 後に指定された記述が有効となります。

・ 1行は、227バイト以内で記述する必要があります。

・ コンマ“,”の前後で改行することができます。ただし、その場合、カッコ“()”を省略することはできません。

INCLUSION_DSI = (DB01.DSI01, ・・・・・DB08.DSI08,↓

DB0n.DSI0n )↓

↓:改行

・ 値の並びで途中の値を省略する場合には、コンマ“,”だけを記述します。

BUFFER_SIZE = ,64 ← 値1を省略した例

- 233 -

・ 後に指定した値のうしろのコンマ“,”は省略することができます。

DEFAULT_TABLE_SIZE = (4,512) ← 値3以降を省略した例

参照

クライアント用の動作環境ファイルの作成については“アプリケーション開発ガイド(共通編)”の“クライアント用の動作環

境ファイルの作成”を参照してください。

実行パラメタは、以下に示す種類があります。

表7.4 クライアント用の動作環境ファイルの実行パラメタの種類

分類 実行パラメタ 概要記述

記述の省

優先順位

1 2 3

SV CL SY

通信

BUFFER_SIZE通信に利用するバッ

ファ(クライアント側)

のサイズ

省略可

- ○ -

CLUSTER_SERVICE_NAME

アプリケーションを

フェイルオーバ運用

で実行する場合に必

要な情報

省略可

- ○

(注2)

DEFAULT_CONNECTION

サーバとの結合情報

のデフォルト

CONNECT文に

DEFAULTを指

定する

場合は

省略不

可。

- ○ -

SERVER_ENV_FILE使用するサーバ用の

動作環境ファイル名

省略可

- ○ -

SERVER_SPECリモートのサーバと通

信するための情報

リモート

のデー

タベース

にアクセ

スする場

合省略

不可。

ローカル

の場合

は指定

できな

い。

- ○ -

TRAN_SPECSQLエラー発生時の

トランザクション

省略可

- ○ -

TRAN_TIME_LIMIT1つのトランザクション

の 大使用可能時間

省略可

○ ○ ○

WAIT_TIME 通信時の待ち時間単

省略可

- ○ -

- 234 -

分類 実行パラメタ 概要記述

記述の省

優先順位

1 2 3

SV CL SY

通信デー

タの暗号

SSL_CLI_CA_CERT_FILE

サーバ認証で使用す

るCA証明書ファイル

の配置先

サーバ

認証を

行う場合

は省略

不可。

(注2)

作業領域

など

DESCRIPTOR_SPEC動的SQLのSQL記述

子の情報

省略可

- ○ -

MAX_SQL同時に操作できる

SQL文の数

省略可

- ○ -

OPL_BUFFER_SIZESQL文の実行手順を

格納しておくバッファ

のサイズ

省略可

- ○ -

RESULT_BUFFER一括FETCHを行う場

合のバッファの数とサ

イズ

省略可

- ○ -

SORT_MEM_SIZE作業用ソート領域とし

て使うメモリサイズ

省略可

○ ○ ○

WORK_ALLOC_SPACESIZE

作業用テーブルおよ

び作業用ソート領域

として使用するファイ

ルサイズ

省略可

○ ○ -

WORK_MEM_SIZE作業用テーブルとし

て使うメモリのサイズ

省略可

○ ○ ○

WORK_PATH作業用テーブルおよ

び作業用ソート領域

のパス

省略可

(注1)

○ ○ ○

データ処

CAL_ERROR代入処理でオーバフ

ローが起きた場合の

処理

省略可

- ○ -

CHARACTER_TRANSLATE

文字コードの変換を

クライアントで行うか否

省略可

- ○ -

CHAR_SETアプリケーション中の

文字のコード

省略可

- ○ -

NCHAR_CODEアプリケーション中の

日本語文字のコード

省略可

- ○ -

SURROGATE_PAIR_NUMBER

UNICODEの補助文

字(1~16面の4バイト

文字)の文字数

省略可

○ ○ ○

表・イン

デックスDEFAULT_DSI_TYPE

格納構造定義を行わ

ない表を作成する場

合、Symfoware/RDBが自動的に生成する

表のDSOの格納構造

の選択

省略可

- ○

(注2)

- 235 -

分類 実行パラメタ 概要記述

記述の省

優先順位

1 2 3

SV CL SY

DEFAULT_INDEX_SIZE

格納構造定義を行わ

ないインデックスを作

成する場合のイン

デックスのデータ格納

域の初期量、拡張量、

ページ長など

省略可

(注2)

(注2)

DEFAULT_OBJECT_TABLE_SIZE

格納構造定義を行わ

ない表を作成する場

合のOBJECT構造の

表のデータ格納域の

初期量、拡張量、

ページ長など

省略可

(注2)

(注2)

DEFAULT_TABLE_SIZE

格納構造定義を行わ

ない表を作成する場

合の表のデータ格納

域の初期量、拡張量、

ページ長など

省略可

(注2)

(注2)

DSI_EXPAND_POINTDSIの容量拡張を起

動するか否か

省略可

- ○

(注2)

INCLUSION_DSIアプリケーションで使

用するDSIを限定す

省略可

(注2)

(注2)

TEMPORARY_INDEX_SIZE

一時表にインデックス

を定義する場合のイ

ンデックスのデータ格

納域の初期量、拡張

量など

省略可

(注2)

(注2)

TEMPORARY_TABLE_SIZE

一時表を定義する場

合の表のデータ格納

域の初期量、拡張量

など

省略可

(注2)

(注2)

排他

DSO_LOCK使用するDSOの占有

の単位、占有モード

省略可

(注2)

(注2)

ISOLATION_WAIT 占有待ちの方式単

省略可

- ○ -

R_LOCK占有の単位を行とす

省略可

- ○ ○

トランザク

ション

DEFAULT_ACCESS_MODE

トランザクションアクセ

スモードの初期値を

指定する

省略可

- ○ ○

DEFAULT_ISOLATION

独立性水準の初期値

を指定する

省略可

(注1)

- ○ ○

デバッグCOREFILE_PATH

アプリケーションで異

常が発生した場合の

ダンプ出力先

省略可

- ○ -

- 236 -

分類 実行パラメタ 概要記述

記述の省

優先順位

1 2 3

SV CL SY

DIV_TRACE_FILE

複数プロセス配下で

アプリケーションが動

作している場合、個別

のトレース情報を出力

するか否か

省略可

- ○ -

ROUTINE_SNAPROUTINE_SNAP機能を利用するか否か

省略可

- ○ -

SET_CALLBACKコールバック関数の

動的登録機能を利用

するか否か

省略可

- ○ -

SQL_SNAPSQL_SNAP機能を利

用するか否か

省略可

- ○ -

アクセスプ

ランおよび

性能情報

ACCESS_PLAN

アプリケーション単位

でアクセスプランを取

得するか否かおよび

SQL文に対するアド

バイスを出力するか

否か

省略可

- ○ -

CHOOSE_TID_UNION

WHERE句にブール

演算子”OR”、また

は、行値構成子を指

定した場合、TIDユニ

オンマージのアクセス

プランのみを作成す

るか否か

省略可

○ ○ ○

GROUP_COL_COND_MOVE

導出表を絞り込む探

索条件を指定した場

合、その探索条件を

導出表のWHERE句に移動するか否か

省略可

○ ○ ○

IGNORE_INDEXインデックスを使用し

ないアクセスプランを

選択するか否か

省略可

○ ○ -

INACTIVE_INDEX_SCAN

非活性状態のイン

デックスDSIを含むイ

ンデックスを使用した

アクセスプランを選択

するか否か

省略可

○ ○ ○

JOIN_ORDER結合表と他の表のジョ

イン順

省略可

(注1)

○ ○ ○

JOIN_RULE ジョインする方法単

省略可

○ ○ ○

MAX_SCAN_RANGE

インデックス、クラスタ

キー、または分割

キーの検索範囲の

大数

省略可

○ ○ ○

- 237 -

分類 実行パラメタ 概要記述

記述の省

優先順位

1 2 3

SV CL SY

SAME_COST_JOIN_ORDER

適化情報を設定し

ていない場合、ジョイ

ン順をV5以前と同じ

にするか否か

省略可

○ ○ ○

SCAN_KEY_ARITHMETIC_RANGE

四則演算の検索範囲

について、インデック

スの範囲検索または

クラスタキーの検索を

行うか否か

省略可

○ ○ ○

SCAN_KEY_CAST

探索条件のCASTオペランドに指定した列

でインデックスの範囲

検索、または、クラス

タキー検索を行うか否

省略可

○ ○ ○

SORT_HASHAREA_SIZE

ソート処理がレコード

をハッシングして格納

するための領域サイ

省略可

○ ○ ○

SQL_TRACEアプリケーション単位

でSQL性能情報を取

得するか否か

省略可

- ○ -

SS_RATE述語ごとの検索範囲

の選択率の値

省略可

○ ○ ○

TID_SORT

インデックス検索と表

データ取得のアクセ

スモデルでTIDソート

を利用するか否か

省略可

○ ○ ○

TID_UNIONTIDユニオンマージ

のアクセスモデルを

有効にするか否か

省略可

○ ○ ○

USQL_LOCK

UPDATE文:探索ま

たはDELETE文:探索の更新標的レコー

ドを位置づける部分

の占有モード

省略可

(注1)

○ ○ ○

メッセージ

MSG_LANG表示するメッセージの

言語種を設定する

省略可

- ○ -

MSG_PRINTSQL文実行時にエ

ラーメッセージを表示

するか否か

省略可

- ○ -

リカバリ RCV_MODEアプリケーションのリ

カバリ水準を指定す

省略可

- ○

(注2)

予約語と

SQL機能SQL_LEVEL

アプリケーションの予

約語とSQL機能のレ

ベルを設定する

省略可

- ○ -

- 238 -

分類 実行パラメタ 概要記述

記述の省

優先順位

1 2 3

SV CL SY

並列クエリ

MAX_PARALLELデータベースを並列

に検索する場合の多

重度

省略可

(注2)

(注2)

PARALLEL_SCAN

アプリケーション単位

またはコネクション単

位に、データベースを

並列に検索するか否

省略可

(注2)

(注2)

その他

ALTER_CHECK

表の設計変更により

表の列を変更した場

合、アプリケーション

への影響をチェックす

るか否か

省略可

- ○

(注2)

ARC_FULLアーカイブログ満杯

時にエラー復帰する

か否か

省略可

- ○

(注2)

SIGNAL_INFシグナルをアプリケー

ションで利用するか否

省略可

- ○ -

SV:サーバ用の動作環境ファイルへの指定が可能であるか否かを表します。

CL:クライアント用の動作環境ファイルへの指定が可能であるか否かを表します。

SY:システム用の動作環境ファイルへの指定が可能であるか否かを表します。

○:指定可

-:指定不可

注1)データベース簡単運用の場合は、省略値が異なります。省略値については、各実行パラメタの説明を参照してくだ

さい。

注2)データベース簡単運用の場合は、指定できません。

参照

アクセスプランおよび性能情報に関する実行パラメタの詳細については、“SQLTOOLユーザーズガイド”を参照してくだ

さい。

◆通信に関する実行パラメタ

BUFFER_SIZE

【指定形式】

BUFFER_SIZE = ([初期量][,拡張量])

【実行パラメタの意味】

通信に利用するバッファサイズを指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

BUFFER_SIZE = (32,32)

- 239 -

【パラメタの意味】

初期量:

バッファの初期量を1~10240の範囲で指定します。省略した場合は、32が指定されたものとみなします。単位は

キロバイトです。

拡張量:

拡張量を1~10240の範囲で指定します。省略した場合は、32が指定されたものとみなします。単位はキロバイト

です。

CLUSTER_SERVICE_NAME

【指定形式】

CLUSTER_SERVICE_NAME = (クラスタサービス名)

【実行パラメタの意味】

PRIMECLUSTERまたはSafeCLUSTERと連携する場合、アプリケーションが登録されている、クラスタシステム上のク

ラスタサービス名を指定します。

【パラメタの意味】

クラスタサービス名:

PRIMECLUSTERまたはSafeCLUSTERと連携する場合、クラスタシステムに登録されているクラスタサービス名を

記述します。

DEFAULT_CONNECTION

【指定形式】

接続するデータベースに対するアクセス方法により、指定形式が異なります。

- ローカルアクセスの場合

DEFAULT_CONNECTION = ([RDBシステム名.]データベース名)

- リモートアクセスの場合

DEFAULT_CONNECTION = (SQLサーバ名,認可識別子,パスワード)

【実行パラメタの意味】

以下の場合のサーバとの接続情報を指定します。

- アプリケーションにCONNECT文を記述しない場合

- CONNECT文にキーワード“DEFAULT”を指定した場合

- CONNECT文のユーザ指定を省略した場合

【パラメタの意味】

RDBシステム名:

サーバがマルチRDB運用をしている場合に結合するRDBシステム名を指定します。省略した場合は、環境変数

RDBNAMEに設定されたRDBシステム名が指定されたものとみなします。

データベース名:

接続するデータベース名を指定します。

SQLサーバ名:

接続するSQLサーバ名を指定します。

認可識別子:

OSのログイン名、または、CREATE USER文で登録されている利用者名を指定します。

- 240 -

パスワード:

OSのパスワード、または、CREATE USER文で登録されているパスワードを指定します。

以下の場合、ログイン名およびパスワードの指定は不要です。

この場合、実行時のログイン名および実行時のパスワードが使用されます。

- ローカルアクセスの場合

- 接続先ホスト名に自端末のIPアドレス、自端末のホスト名、“localhost”またはループバックアドレスを指定したリ

モートアクセスの場合

ログイン名およびパスワードは、各サーバでは以下のように扱われます。

ログイン名:

ログイン名

パスワード:

ログイン名のパスワード

ログイン名:

ユーザ名(ログオン名)

パスワード:

ユーザ名のパスワード

SERVER_ENV_FILE

【指定形式】

SERVER_ENV_FILE = (SQLサーバ名,ファイル名)

【実行パラメタの意味】

使用するサーバ用の動作環境ファイル名を指定します。コネクション(データベース環境)ごとにサーバのアプリケー

ション実行環境を変更する場合に指定します。

【パラメタの意味】

SQLサーバ名:

CONNECT文の実行で指定するSQLサーバ名を記述します。

ファイル名:

サーバ用の動作環境ファイル名を、絶対パスで指定します。

SERVER_SPEC

【指定形式】

SERVER_SPEC = (通信方法,SQLサーバ名,データ資源名,ホスト名,ポート番号[,[接続サーバ種別]])

【実行パラメタの意味】

CONNECT文でSQLサーバ名を指定した場合、サーバとの通信状態を確立するために必要な情報を記述します。こ

のため、CONNECT文で接続するSQLサーバ名は、アプリケーションの実行時にすべてSERVER_SPECに記述して

おく必要があります。ローカルのデータベースだけにアクセスする場合は、この実行パラメタは指定しません。

【パラメタの意味】

通信方法:

リモートアクセスの通信方法として、以下のどちらかを選択します。

- 241 -

- RDB2_TCP: TCP/IP通信を行います。通信データを暗号化しない場合に指定します。

- RDB2_TCPS:TCP/IP(SSL)通信を行います。通信データを暗号化する場合に指定します。

データベース簡単運用では、通信データの暗号化はできません。

SQLサーバ名:

CONNECT文で指定したSQLサーバ名を記述します。SQLサーバ名は、SERVER_SPECで指定されたデータ資

源に対して接続する際の名前を、利用者が任意に指定します。

データ資源名:

データベース名を指定します。

ホスト名:

ホスト名管理ファイルに設定した18バイト以内のホスト名を指定します。

ポート番号:

リモートアクセスで使用するポート番号を指定します。

Symfoware Serverのバージョンレベルや対象のプラットフォームによって、デフォルトのポート番号が異なります。

サーバ側で定義されているポート番号を確認の上、指定してください。

ポート番号の詳細については、“2.2.1 コネクションの接続方法”を参照してください。

接続サーバ種別:

以下のどちらかを選択します。ただし、通信データを暗号化する場合には、OPENのみが指定できます。また、省

略した場合は、OPENが指定されたものとみなします。

- OPEN: Solaris、Linux、Windows(R)上のSymfoware/RDBと接続する場合に指定します。

- GS: グローバルサーバ上のSymfoware/RDBと接続する場合に指定します。

注意

通信データを暗号化する場合、システム用の動作環境ファイルのパラメタ指定が必要です。詳細は、“セットアップガ

イド”を参照してください。

TRAN_SPEC

【指定形式】

TRAN_SPEC = ({NONE | TRANSACTION_ROLLBACK})

【実行パラメタの意味】

SQL文が実行中にエラーとなった場合のトランザクションの対処方法を指定します。

なお、本実行パラメタは、トランザクションモニタ配下では指定できません。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

TRAN_SPEC = (NONE)

【パラメタの意味】

NONE:

各プラットフォームのトランザクションの仕様に従います。

TRANSACTION_ROLLBACK:

SQL文の実行がエラーとなった場合に、トランザクションをロールバックします。

- 242 -

TRAN_TIME_LIMIT

【指定形式】

TRAN_TIME_LIMIT = ( 大トランザクション実行時間)

【実行パラメタの意味】

1つのトランザクションで使用可能な時間を指定します。

指定時間を経過した場合には、トランザクションをロールバックして、接続中のコネクションを切断します。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

TRAN_TIME_LIMIT = (0)

【パラメタの意味】

最大トランザクション実行時間:

大トランザクション実行時間を、0~32767の範囲で指定します。単位は秒です。0を指定すると無制限になりま

す。

WAIT_TIME

【指定形式】

WAIT_TIME = (待ち時間)

【実行パラメタの意味】

サーバからのデータ受信の待ち時間を指定します。

WAIT_TIMEで指定された時間内に、サーバからのデータが受信できなかった場合には、実行中のSQL文はエラー

となり、コネクションは切断されます。

なお、本実行パラメタは、トランザクションモニタ配下では指定できません。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

WAIT_TIME = (0)

【パラメタの意味】

待ち時間:

待ち時間を0~32767の範囲で指定します。単位は秒です。0を指定した場合は、データが受信できるまで待ちま

す。

◆通信データの暗号化に関する実行パラメタ

SSL_CLI_CA_CERT_FILE

【指定形式】

SSL_CLI_CA_CERT_FILE = (SQLサーバ名,CA証明書ファイル名)

【実行パラメタの意味】

サーバ認証で使用する認証局(Certificate Authority: CA)証明書ファイルの配置先を指定します。

CA証明書ファイルは、データベース管理者が認証局に発行手続きを行って取得後、アプリケーションを開発および

実行するマシンに配布されます。

通信データを暗号化しない場合に本パラメタを設定するとエラーになります。

【パラメタの意味】

SQLサーバ名:

SERVER_SPECで指定したSQLサーバ名を指定します。

- 243 -

CA証明書ファイル名:

CA証明書のファイル名を絶対パスで指定します。

指定できるファイル形式は、PEM形式のみです。

指定例:

SSL_CLI_CA_CERT_FILE = (SV1,C:\CertificateAuthority\CAFlie.pem)

◆作業領域に関する実行パラメタ

DESCRIPTOR_SPEC

【指定形式】

DESCRIPTOR_SPEC = (WITH MAX省略値)

【実行パラメタの意味】

動的SQLのSQL記述子の情報を指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

DESCRIPTOR_SPEC = (100)

【パラメタの意味】

WITH MAX省略値:

ALLOCATE DESCRIPTOR文でWITH MAXを省略した場合の値を1~32767の範囲で指定します。

参照

ALLOCATE DESCRIPTOR文については、“SQLリファレンス”を参照してください。

MAX_SQL

【指定形式】

MAX_SQL = (SQL文の数)

【実行パラメタの意味】

同一トランザクション内で指定できるSQL文の数を指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

MAX_SQL = (1024)

【パラメタの意味】

SQL文の数:

同一トランザクション内で指定できるSQL文の数を、2~32000の範囲で指定します。

ポイント

MAX_SQLの値を拡張して使用した場合、以下の考慮が必要です。

Symfoware/RDBでは、同一SQL文を繰り返し実行する場合の処理効率を図るため、SQL文を実行するための情報

の個数をMAX_SQLに指定します。また、SQL文の処理手順を格納するOPLバッファのサイズを、OPL_BUFFER_SIZEに指定します。

- 244 -

情報の保持数がMAX_SQLに指定した値を超えた場合、SQL文の実行情報は、古い情報から破棄されます。ただ

し、PREPARE文で準備されているSQL文およびオープン中のカーソルの情報は破棄できません。SQL文とSQL文情

報の保持期間の関係を以下に示します。

SQL文の種類 SQL文情報の保持期間

動的SQL文

カーソル系 PREPARE文でSQL文が準備

されてから、DEALLOCATEPREPARE文でSQL文が破棄

されるまで非カーソル系

静的SQL文カーソル系

OPEN文が実行されてからカー

ソルがクローズされるまで

非カーソル系 SQL文が実行されている間

したがって、MAX_SQLには、以下の数の総和を指定してください。

- PREPARE文で準備しているSQL文の数

- 同時にオープン中のカーソルの数

- 保持しておきたい静的SQL文の数

OPL_BUFFER_SIZE

【指定形式】

OPL_BUFFER_SIZE = (バッファサイズ)

【実行パラメタの意味】

Symfoware/RDBでは、同一SQL文を複数回実行するときに、 初の実行で作成した処理手順を使用することによっ

て処理効率の向上を図っています。MAX_SQLに指定した数の処理手順を格納するバッファのサイズを指定します。

この領域は、サーバ側で獲得されます。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

OPL_BUFFER_SIZE = (8192)

【パラメタの意味】

バッファサイズ:

SQLの処理手順を格納するバッファのサイズを1~1280000の範囲で指定します。単位はキロバイトです。

- 245 -

注意

同一SQL文を複数回実行するとき、以下の場合については 初の実行で作成した処理手順は使用されず、新たに

処理手順を作成します。

- SQL埋込みCプログラムにおいて、ポインタ変数として宣言したホスト変数を使用している場合

- 前回の実行後、保持可能な処理手順の数(MAX_SQLに指定した値と同数)以上の異なるSQL文を実行した場

- 前回の実行後、SET TRANSACTION文によりトランザクションモード(アクセスモードまたは独立性水準)を変更し

た場合

- 前回の実行後、SET CATALOG文により被準備文の対象となるデータベース名を変更した場合

- 前回の実行後、SET SCHEMA文により被準備文の省略したスキーマ名を変更した場合

- 前回の実行後、SET SESSION AUTHORIZATION文によりスコープの異なる利用者に変更した場合

- 前回の実行後、SQL文が使用するデータベース資源についてALTER TABLE文により動的に列の追加または

削除を実行した場合

- 前回の実行後、SQL文が使用するデータベース資源についてCREATE DSI文により動的にDSIの追加または削

除を実行した場合

- 前回の実行後、SQL文が使用するデータベース資源についてALTER DSI文により動的にDSIの分割値変更を

実行した場合

- 動作環境ファイルのパラメタINACTIVE_INDEX_SCANにNOを指定している場合に、前回の実行後、rdbexdsiコマンドにより任意のDSIの除外または除外の解除を実行した場合

- 前回の実行後、SQL文が使用するデータベース資源を削除した場合

ポイント

MAX_SQLの値を拡張した場合は、OPL_BUFFER_SIZEの値も変更する必要があります。以下の方法で見積もった

値をキロバイト単位で指定してください。

SQLの処理手順を格納するバッファのサイズ

= 0.7KB + Σ アクセス対象の表単位のSQL処理手順サイズ

アクセス対象の表単位のSQL処理手順サイズ

= 4.2KB + Σ SQL文単位のSQL処理手順サイズ

SQL文単位のSQL処理手順サイズ

= 0.17KB × 列数 + 0.08KB × 条件数

- アクセス対象の表単位のSQL処理手順サイズ

アクセス対象の表単位のSQL処理手順サイズの総和です。アクセス対象の表単位のSQL処理手順サイズを求

め、それらを合計します。

- SQL文単位のSQL処理手順サイズ

当該表をアクセスするSQL文単位のSQL処理手順サイズの総和です。当該表をアクセスするSQL文単位のSQL処理手順サイズを求め、それらを合計します。

- 列数

当該SQL文に記述する列の数です。列に“*”を記述する場合は、表を構成する列の数になります。同一の列を

選択リストや探索条件などの複数箇所に記述する場合や同一箇所に同一の列を複数記述する場合は、それぞ

れ列数に加算してください。

- 246 -

- 条件数

当該SQL文に記述する条件(述語)の数です。

RESULT_BUFFER

【指定形式】

RESULT_BUFFER = ([個数][,バッファサイズ])

【実行パラメタの意味】

Symfoware/RDBでは、FETCH文によってデータを取り出すときの性能を良くするため、複数の行を一度に取り出しま

す。この行を格納するバッファの数とサイズを指定します。バッファサイズを大きくするほど、FETCHの性能が良くなり

ます。また、1つのカーソルが1つのバッファを使用するので、複数のバッファを用意すれば、複数のカーソルの操作

の性能を良くすることができます。バッファを使用しない場合は、個数に0を指定します。この領域は、クライアント側と

サーバ側で獲得されます。

バッファサイズを大きくするほど性能は良くなりますが、メモリが圧迫され、他のアプリケーションの実行に支障が発生

する場合があります。バッファサイズを大きくする場合、メモリの空き容量に注意してください。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

RESULT_BUFFER = (2,32)

【パラメタの意味】

個数:

使用するバッファの個数を0~255の範囲で指定します。省略した場合は、2が指定されたものとみなします。

バッファサイズ:

使用するバッファのサイズを1~10240の範囲で指定します。省略した場合は、32が指定されたものとみなします。

単位はキロバイトです。

SORT_MEM_SIZE

【指定形式】

SORT_MEM_SIZE = (メモリサイズ)

【実行パラメタの意味】

ソート処理のために作業用ソート領域としてサーバ側で使用するメモリの大きさを指定します。この領域は、RDBプロ

セスのローカルメモリにセション単位に獲得されます。

ソート処理のデータ量がSORT_MEM_SIZEに指定した値を超えると、二次記憶の作業用ソート領域にデータを書き

出し、書き出したデータのソートを行います。このとき、二次記憶からのソートデータの読み込み回数はソートデータ

の全体量とSORT_MEM_SIZEに指定した値に依存します。このため、ソートデータの全体量に応じて、

SORT_MEM_SIZEに指定する値を見積もってください。

ソート処理のデータ量がSORT_MEM_SIZEに指定した値の1万倍以上になると、ソート処理で必要なメモリが不足し、

「JYP2221E 実行時の制限値を超えました.code:“4”」のエラーとなる場合があります。ただし、メモリ上の作業域の必

要 低限なサイズは、作業用ソート領域へのレコードの格納順に依存するため、SORT_MEM_SIZEに指定した値の

1万倍は目安となります。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

SORT_MEM_SIZE = (2112)

【パラメタの意味】

メモリサイズ:

サーバ側で使用するメモリの大きさを64~2097150の範囲で指定します。単位はキロバイトです。

- 247 -

WORK_ALLOC_SPACESIZE

【指定形式】

WORK_ALLOC_SPACESIZE = ([初期量][,[増分量][,[ 大量][,[保持指定]]]])

【実行パラメタの意味】

作業用ソート領域および作業用テーブルとしてサーバ側で使用するファイルサイズの初期量、増分量、 大量、保

持指定を指定します。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

WORK_ALLOC_SPACESIZE = (10000,50000,WORK_PATHで指定したパス名のディスク容量,HOLD)

初期量、増分量、 大量、保持指定のいずれかの値が省略された場合は、その値のデフォルト値が指定されたもの

とみなします。

以下に指定例を示します。

例1:初期量、増分量を指定する場合

WORK_ALLOC_SPACESIZE = (10000,50000)

例2:増分量、最大量を指定する場合

WORK_ALLOC_SPACESIZE = (,50000,100000)

【パラメタの意味】

初期量:

作業用ソート領域および作業用テーブルとして外部ファイルを作成する場合の初期量を5000~1000000の範囲

で指定します。省略した場合は、10000が指定されたものとみなします。単位はキロバイトです。

増分量:

作業用ソート領域および作業用テーブルとして作成した外部ファイルを拡張する場合の増分量を1000~1000000の範囲で指定します。省略した場合は、50000が指定されたものとみなします。単位はキロバイトです。

最大量:

作業用ソート領域および作業用テーブルとして作成する外部ファイルの 大量を5000~33553408の範囲で指定

します。省略した場合は、WORK_PATHで指定したパス名のディスク容量が指定されたものとみなします。単位

はキロバイトです。

保持指定:

以下の中から1つを選択します。省略した場合は、HOLDが指定されたものとみなします。

- FREE:初期量として獲得した作業用ソート領域および作業用テーブルの外部ファイルは、DISCONNECT文の実行時に解放します。

拡張量として獲得した作業用ソート領域および作業用テーブルの外部ファイルは、その領域を使用したSQL文の実行完了時に解放します。

- HOLD:作業用ソート領域および作業用テーブルとして作成した外部ファイルは、DISCONNECT文の実行時

に解放します。

WORK_MEM_SIZE

【指定形式】

WORK_MEM_SIZE = (メモリサイズ)

【実行パラメタの意味】

作業用テーブルとしてサーバ側で使用するメモリの大きさを指定します。この領域は、RDBプロセスのローカルメモリ

にセション単位に獲得されます。

- 248 -

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

WORK_MEM_SIZE = (128)

【パラメタの意味】

メモリサイズ:

サーバ側で使用するメモリの大きさを64~2097150の範囲で指定します。単位はキロバイトです。

WORK_PATH

【指定形式】

WORK_PATH = (パス名[,パス名]・・・)

【実行パラメタの意味】

サーバ側で使用するソート作業域、作業用テーブル域の獲得先ディレクトリを指定します。“Symfoware/RDBを起動

するユーザID”および“RDBコマンドを実行するユーザID”には、指定するディレクトリへの書込み権が必要です。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

WORK_PATH = (/var/tmp)

WORK_PATH = (Symfoware/RDBがインストールされているディレクトリ\TMP)

データベース簡単運用で、いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合は、以下の値が

設定されます。

WORK_PATH = (データ格納先ディレクトリ\RDBシステム名\USR\TMP)

参照

- 作業用ソート領域および作業用テーブルの見積りについては、“アプリケーション開発ガイド(共通編)”の“ソート

作業域の見積り”を参照してください。

- データベース簡単運用の場合の省略値として設定されるデータ格納先ディレクトリについては、“データベース簡

単運用ガイド”を参照してください。

【パラメタの意味】

パス名:

獲得先ディレクトリを指定します。

◆データ処理に関する実行パラメタ

CAL_ERROR

【指定形式】

CAL_ERROR = ({REJECT | NULL})

【実行パラメタの意味】

代入処理でオーバフローが発生した場合の処理を指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

CAL_ERROR = (REJECT)

【パラメタの意味】

REJECT:

例外エラーとします。

- 249 -

NULL:

演算結果をNULLとします。

CHARACTER_TRANSLATE

【指定形式】

CHARACTER_TRANSLATE = ({CLIENT | SERVER})

【実行パラメタの意味】

データベースシステムの文字コード系が、アプリケーションで使用している文字コード系と異なる場合、コード変換を

クライアントで行うか、サーバで行うかを指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

CHARACTER_TRANSLATE = (SERVER)

LinuxクライアントでSQL埋込みホストプログラムを使用している場合で、かつアプリケーション起動時に環境変数LANGにja_JP.UTF-8が指定されている環境では、以下のデータベースに接続する場合には本実行パラメタにCLIENTを指

定する必要があります。

Solarisの場合

- Symfoware Server Enterprise Extended Edition 6.0.1以前

- Symfoware Server Enterprise Edition 6.0.1以前

- Symfoware Server Standard Edition 6.0.1以前

Linuxの場合

- Symfoware Server Standard Edition V5.0L10以前

Windows(R)の場合

- Symfoware Server Enterprise Edition V6.0L10以前

- Symfoware Server Standard Edition V6.0L10以前

- Symfoware Server for Windows V6.0L10以前

【パラメタの意味】

CLIENT:

クライアントでコード変換を行う場合に指定します。

SERVER:

サーバでコード変換を行う場合に指定します。

ポイント

サーバの負荷を少しでも減らしたい場合は、クライアントで行うよう指定します。

CHAR_SET

【指定形式】

CHAR_SET = ({EUC_S90|EUC_U90|EUC|SJIS|UTF8})

【実行パラメタの意味】

文字列型のホスト変数、文字列型の動的パラメタ、および、SQLMSGの文字コード系を指定します。この指定は、ア

プリケーションをC言語で記述している場合に有効です。

本実行パラメタの指定を省略した場合は、以下に従い値が設定されます。

データベースに格納される文字列型データの文字コード系とCHAR_SETとの関係を以下に示します。

- 250 -

表7.5 データベースの文字コード系との関係

データベースの文字コード系 CHAR_SETの指定

EUC_S90 EUC_U90

EUC SJIS UTF8

EUCコードのS90コード ◎ × ○ ○

EUCコードのU90コード × ◎ ○ ○

シフトJISコード ○ ○ ◎ ○

UNICODE ○ ○ ○ ◎

◎:指定可能(省略値)

○:指定可能

×:指定不可能

【パラメタの意味】

EUC_S90:

ホスト変数内文字列のデータの文字コード系がEUCコードのS90コードの場合に指定します。

EUC_U90またはEUC:

ホスト変数内文字列のデータの文字コード系がEUCコードのU90コードの場合に指定します。EUCは互換として

存在します。

SJIS:

ホスト変数内文字列のデータの文字コード系がシフトJISコードの場合に指定します。

UTF8:

ホスト変数内文字列のデータの文字コード系がUNICODEの場合に指定します。

注意

アプリケーションをCOBOLで記述している場合は、本パラメタは無視されます。詳細は、“2.3.1 文字コード系の決定”

を参照してください。

NCHAR_CODE

【指定形式】

NCHAR_CODE = ({EUC_S90|EUC_U90|EUC|COBOL_EUC_S90|COBOL_EUC_U90|COBOL_EUC|SJIS|UTF8|UCS2|UCS2B })

【実行パラメタの意味】

各国語文字列型のホスト変数、各国語文字列型の動的パラメタの文字コード系を指定します。この指定は、アプリケー

ションをC言語で記述している場合に有効です。

本実行パラメタの指定を省略した場合は、以下に従い値が設定されます。

アプリケーションをC言語で記述している場合の、CHAR_SETとNCHAR_CODEの関係を以下に示します。

表7.6 CHAR_SETとNCHAR_CODEの関係

NCHAR_CODEの指定

CHAR_SETの指定

EUC_S90

COBOL_EUC_S90

EUC_U90

EUC COBOL_EUC_U90

COBOL_EUC

SJIS UTF8 UCS2 UCS2B

EUC_S90 ◎ ○ × × ×

EUC_U90 × ◎ ○ × ×

- 251 -

NCHAR_CODEの指定

CHAR_SETの指定

EUC_S90

COBOL_EUC_S90

EUC_U90

EUC COBOL_EUC_U90

COBOL_EUC

SJIS UTF8 UCS2 UCS2B

EUC

SJIS × × ◎ ×

UTF8 × × × ◎ ○

◎:有効(省略値)

○:有効

×:無効(指定値を無視して省略値になります)

データベースに格納される各国語文字列型データの文字コード系とNCHAR_CODEとの関係を以下に示します。

表7.7 データベースの文字コード系との関係

データベース

の文字コード系

NCHAR_CODEの指定

EUC_S90

COBOL_EUC_S90

EUC_U90

EUC COBOL_EUC_U90

COBOL_EUC

SJIS UTF8 UCS2 UCS2B

EUCコード

のS90コード◎ × ○ ○

EUCコード

のU90コード× ◎ ○ ○

シフトJISコード ○ ○ ◎ ○

UNICODE ○ ○ ○ ◎

◎:指定可能(省略時は、CHAR_SETに設定される値かCHAR_SETの省略値)

○:指定可能

×:指定不可能

【パラメタの意味】

EUC_S90:

ホスト変数内文字列のデータの文字コード系がEUCコードのS90コードの場合に指定します。

EUC_U90またはEUC:

ホスト変数内文字列のデータの文字コード系がEUCコードのU90コードの場合に指定します。EUCは下位互換と

して存在します。

COBOL_EUC_S90:

ホスト変数内文字列のデータの文字コード系がEUCコードのS90コードのCOBOLの内部表現形式(COBOL_EUC)の場合に指定します。

COBOL_EUC_U90またはCOBOL_EUC:

ホスト変数内文字列のデータの文字コード系がEUCコードのU90コードのCOBOLの内部表現形式(COBOL_EUC)場合に指定します。COBOL_EUCは下位互換として存在します。

SJIS:

ホスト変数内文字列のデータの文字コード系がシフトJISコードの場合に指定します。

UTF8:

ホスト変数内文字列のデータの文字コード系がUNICODEのUTF-8コードの場合に指定します。

- 252 -

UCS2:

ホスト変数内文字列のデータの文字コード系がUNICODEのUCS-2コードの場合に指定します。

UCS2B:

ホスト変数内文字列のデータの文字コード系がUNICODEのUCS-2コードのバイトスワップ形式の場合に指定しま

す。

注意

アプリケーションをCOBOLで記述している場合は、本パラメタは無視されます。詳細は、“2.3.1 文字コード系の決定”

を参照してください。

SURROGATE_PAIR_NUMBER

【指定形式】

SURROGATE_PAIR_NUMBER = ({1 | 2})

【実行パラメタの意味】

各国語文字を扱う関数は、データベースの文字コード系に従って処理されます。データベースの文字コード系が

UNICODEの場合、各国語文字列を扱う関数はUNICODEの補助文字(1~16面の4バイト文字)をUCS-2形式の2文字(2バイト×2)として認識しています。本実行パラメタを指定することにより、従来2文字として認識していた補助文字

を1文字として認識します。補助文字を1文字として扱うと、補助文字の文字数を意識しないで以下の関数を使うこと

ができます。

- POSITION、CHARINDEX

- CHARACTER_LENGTH、LEN

- SUBSTRING、LEFT、RIGHT

- TRIM

- LPAD

- RPAD

- REPLACE

- REPLICATE

- REVERSE

- STUFF

本実行パラメタは、サーバおよびクライアントがWindows(R)の場合に利用できます。

本実行パラメタは、データベースの文字コード系がUNICODEの場合にのみ有効となります。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

SURROGATE_PAIR_NUMBER = (2)

【パラメタの意味】

1:

各国語文字の補助文字1文字(4バイト)を1文字として扱います。

2:

従来どおり、各国語文字の補助文字1文字(4バイト)を2文字(2バイト×2)として扱います。

◆表・インデックスに関する実行パラメタ

- 253 -

DEFAULT_DSI_TYPE

【指定形式】

DEFAULT_DSI_TYPE = ({SEQUENTIAL | OBJECT})

【実行パラメタの意味】

格納構造定義を行わない表を作成する場合に、Symfoware/RDBが自動的に生成する表のDSOの格納構造を選択

します。

本パラメタにより格納構造の選択ができるのは、表の形式が以下の条件をすべて満たしている場合のみです。

- 表の 後に1つだけ、BLOB型でサイズに32キロバイト以上を指定している場合

- BLOB型以外の列は固定長属性の場合

- BLOB型の列にNOT NULL制約を指定している場合

上記以外の場合は、表のDSOはSEQUENTIAL構造となります。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

DEFAULT_DSI_TYPE = (OBJECT)

【パラメタの意味】

SEQUENTIAL:

表のDSOとしてSEQUENTIAL格納構造のDSOを定義します。

OBJECT:

表のDSOとしてOBJECT格納構造のDSOを定義します。

DEFAULT_INDEX_SIZE

【指定形式】

DEFAULT_INDEX_SIZE = (ベース部ページ長,インデックス部ページ長,ベース部初期量,インデックス部初期量[,拡張量,拡張契機])

【実行パラメタの意味】

格納構造定義を行わないインデックスを作成する場合、インデックスのベース部とインデックス部の割付け量、ページ

長などを指定します。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

DEFAULT_INDEX_SIZE = (8,8,30720,10240,10240,3072)

【パラメタの意味】

ベース部ページ長:

ベース部のページ長を1、2、4、8、16、32の中から指定します。単位はキロバイトです。

インデックス部ページ長:

インデックス部のページ長を1、2、4、8、16、32の中から指定します。単位はキロバイトです。

ベース部初期量:

ベース部の初期量を2~2097150の範囲で指定します。単位はキロバイトです。

インデックス部初期量:

インデックス部の初期量を2~2097150の範囲で指定します。単位はキロバイトです。

拡張量:

インデックスのベース部の拡張量を1~2097150の範囲で指定します。省略した場合は、10240が指定されたもの

とみなします。単位はキロバイトです。インデックス部の拡張量は、ベース部の5分の1の値となります。

- 254 -

拡張契機:

ベース部およびインデックス部の拡張を行うタイミングとして、DSIの空き容量を0~2097150の範囲で指定します。

インデックスのDSIの空き容量がここで指定した値になると、インデックスのベース部およびインデックス部の拡張

が行われます。省略した場合は、3072が指定されたものとみなします。単位はキロバイトです。

注意

- 自動容量拡張の拡張量と拡張契機は、ページ長単位に繰り上げますので、ページ長の倍数で指定してくださ

い。

- ベース部の5分の1がインデックス部のページ長の倍数でない場合、インデックス部のページ長の倍数に繰り上げ

ます。

- インデックス定義時には、容量拡張を行いません。拡張量および拡張契機は、インデックス定義した後に有効と

なります。

DEFAULT_OBJECT_TABLE_SIZE

【指定形式】

DEFAULT_OBJECT_TABLE_SIZE = (ページ長,初期量[,拡張量,拡張契機])

【実行パラメタの意味】

格納構造定義を行わない表を作成する場合、OBJECT構造の表のデータ格納域の割付け量、ページ長などを指定

します。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

DEFAULT_OBJECT_TABLE_SIZE = (32,32768,32768,0)

【パラメタの意味】

ページ長:

データ格納域のページ長を指定します。必ず32を指定します。単位はキロバイトです。

初期量:

データ格納域の初期量を2~2097150の範囲で指定します。単位はキロバイトです。

拡張量:

データ格納域の拡張量を1~2097150の範囲で指定します。省略した場合は、32768が指定されたものとみなしま

す。単位はキロバイトです。

拡張契機:

データ格納域の拡張を行うタイミングとして、表のDSIの空き容量を0~2097150の範囲で指定します。表のDSIの空き容量がここで指定した値になると、表のデータ格納域の拡張が行われます。省略した場合は、0が指定された

ものとみなします。単位はキロバイトです。

注意

自動容量拡張の拡張量と拡張契機は、ページ長単位に繰り上げますので、ページ長の倍数で指定してください。

DEFAULT_TABLE_SIZE

【指定形式】

DEFAULT_TABLE_SIZE = (ページ長,初期量[,拡張量,拡張契機])

- 255 -

【実行パラメタの意味】

格納構造定義を行わない表を作成する場合、表のデータ格納域の割付け量、ページ長などを指定します。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

DEFAULT_TABLE_SIZE = (32,30720,10240,3072)

【パラメタの意味】

ページ長:

データ格納域のページ長を1、2、4、8、16、32の中から指定します。単位はキロバイトです。

初期量:

データ格納域の初期量を2~2097150の範囲で指定します。単位はキロバイトです。

拡張量:

データ格納域の拡張量を1~2097150の範囲で指定します。省略した場合は、10240が指定されたものとみなしま

す。単位はキロバイトです。

拡張契機:

データ格納域の拡張を行うタイミングとして、表のDSIの空き容量を0~2097150の範囲で指定します。表のDSIの空き容量がここで指定した値になると、表のデータ格納域の拡張が行われます。省略した場合は、3072が指定さ

れたものとみなします。単位はキロバイトです。

注意

自動容量拡張の拡張量と拡張契機は、ページ長単位に繰り上げますので、ページ長の倍数で指定してください。

DSI_EXPAND_POINT

【指定形式】

DSI_EXPAND_POINT=({ON | OFF})

【実行パラメタの意味】

アプリケーションによるデータ操作で、DSIに指定された拡張契機(rdbalmdsiコマンドまたはDSI定義文で定義します)を無効とするか否かを指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

DSI_EXPAND_POINT=(ON)

【パラメタの意味】

ON:

DSIに定義された拡張契機は有効になります。アプリケーションによるデータ操作で、DSIの空きページ容量が拡

張契機に達した時点で、領域を拡張します。

OFF:

DSIに定義された拡張契機は無効になります。アプリケーションによるデータ操作で、DSIの空きページ容量が拡

張契機に達しても、領域を拡張しません。この場合、DSIの空き領域が枯渇した時点で、領域を拡張します。

INCLUSION_DSI

【指定形式】

INCLUSION_DSI = (データベース名.DSI名[,データベース名.DSI名・・・])

【実行パラメタの意味】

アプリケーションで、DSIを限定したい表のDSI名を指定します。

- 256 -

アプリケーションでは、限定されたDSIを含む表に対しては、そのDSIだけがデータ操作の範囲となります。また、本実

行パラメタの指定により、アプリケーション中での探索条件の記述が省略できます。なお、アプリケーションでDSIを限

定していない表に対しては、データ操作をすることができます。

【パラメタの意味】

データベース名.DSI名:

DSIを限定したい表のDSI名を指定します。

TEMPORARY_INDEX_SIZE

【指定形式】

TEMPORARY_INDEX_SIZE = (ベース部初期量,インデックス部初期量[,拡張量,拡張契機])

【実行パラメタの意味】

一時表にインデックスを定義する場合に、インデックスのベース部とインデックス部の割付け量を指定します。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

TEMPORARY_INDEX_SIZE = (160,64,256,0)

【パラメタの意味】

ベース部初期量:

ベース部の初期量を64~2097150の範囲で指定します。単位はキロバイトです。

インデックス部初期量:

インデックス部の初期量を64~2097150の範囲で指定します。単位はキロバイトです。

拡張量:

インデックスのベース部の拡張量を32~2097150の範囲で指定します。省略した場合は、256が指定されたものと

みなします。単位はキロバイトです。インデックス部の拡張量は、ベース部の5分の1の値となります。

拡張契機:

ベース部およびインデックス部の拡張を行うタイミングとして、インデックスの空き容量を0~2097150の範囲で指定

します。インデックスの空き容量がここで指定した値になると、インデックスのベース部およびインデックス部の拡張

が行われます。省略した場合は、0が指定されたものとみなします。単位はキロバイトです。

注意

- 自動容量拡張の拡張量と拡張契機は、ページ長単位に繰り上げますので、ページ長の倍数で指定してくださ

い。

- ベース部の5分の1がインデックス部のページ長の倍数でない場合、インデックス部のページ長の倍数に繰り上げ

ます。

- 257 -

TEMPORARY_TABLE_SIZE

【指定形式】

TEMPORARY_TABLE_SIZE = (初期量[,拡張量,拡張契機])

【実行パラメタの意味】

一時表を定義する場合に、表のデータ格納域の割付け量を指定します。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

TEMPORARY_TABLE_SIZE = (256,512,0)

【パラメタの意味】

初期量:

データ格納域の初期量を64~2097150の範囲で指定します。単位はキロバイトです。

拡張量:

データ格納域の拡張量を32~2097150の範囲で指定します。省略した場合は、512が指定されたものとみなしま

す。単位はキロバイトです。

拡張契機:

データ格納域の拡張を行うタイミングとして、表の空き容量を0~2097150の範囲で指定します。表の空き容量が

ここで指定した値になると、表のデータ格納域の拡張が行われます。省略した場合は、0が指定されたものとみな

します。単位はキロバイトです。

注意

自動容量拡張の拡張量と拡張契機は、ページ長単位に繰り上げますので、ページ長の倍数で指定してください。

◆排他に関する実行パラメタ

DSO_LOCK

【指定形式】

DSO_LOCK = (DSO名[/[P][占有モード]][,DSO名[/[P][占有モード]]・・・])

【実行パラメタの意味】

アプリケーションで使用するDSOおよびその占有の単位、占有モードを指定します。

本パラメタを指定した場合、指定されなかったDSOについては、占有の単位がページとなります。

DSO_LOCK が 指 定 さ れ た 場 合 、 SET TRANSACTION 文 、 ク ラ イ ア ン ト 用 の 動 作 環 境 フ ァ イ ル の

DEFAULT_ACCESS_MODEおよびDEFAULT_ISOLATIONは指定できません。

占有の単位は、動作環境ファイルのDSO_LOCKおよびR_LOCKでの指定により決定します。

なお、動作環境ファイルのR_LOCKの値により、DSO_LOCKを指定できない場合があります。以下にDSO_LOCKと

R_LOCKの関係を示します。

クライアント用の動

作環境ファイルの

R_LOCK

システム用の動作

環境ファイルの

R_LOCK

DSO_LOCKの指

占有の単位

NO NO 指定可 DSO_LOCKの

指定による(注1)

YES 指定可 DSO_LOCKの

指定による(注1)

YES NO 指定不可 行単位で占有(注2)

- 258 -

クライアント用の動

作環境ファイルの

R_LOCK

システム用の動作

環境ファイルの

R_LOCK

DSO_LOCKの指

占有の単位

YES 指定不可 行単位で占有(注2)

省略 NO 指定可 DSO_LOCKの

指定による(注1)

YES 指定不可 行単位で占有(注2)

注1) DSO_LOCKの指定を省略した場合、Symfoware/RDBによって占有の単位が選択されます。詳細は、“アプ

リケーション開発ガイド(共通編)”の“排他の属性と選択方法”の“Symfoware/RDBによる選択”を参照してくださ

い。

注2) DSO_LOCKを指定した場合、CONNECT文実行時にエラーとなります。

【パラメタの意味】

DSO名:

アプリケーションで使用するDSO名を以下の形式で指定します。

データベース名.DSO名

P:

DSOの占有の単位をページとします。省略した場合は、占有の単位はDSIになります。

DSO名に指定されたDSOにPRECEDENCE(1)が指定されている場合、本パラメタは指定できません。

占有モード:

占有のモードとして以下のいずれかを指定します。省略した場合は、EXが指定されたものとみなします。

- EX: 非共有モードの排他を行います。

- SH: 共有モードの排他を行います。

ISOLATION_WAIT

【指定形式】

ISOLATION_WAIT = ({WAIT | REJECT})

【実行パラメタの意味】

あるトランザクションで資源にアクセスしようとしたとき、別のトランザクションがその資源を占有していた場合に、資源

の占有が解除されるまで待つか否かを指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

ISOLATION_WAIT = (WAIT)

【パラメタの意味】

WAIT:

資源の占有が解除されるまで待ちます。

REJECT:

エラーとしてアプリケーションに復帰します。

R_LOCK

【指定形式】

R_LOCK = ({YES | NO})

【実行パラメタの意味】

占有の単位を行とするかどうかを指定します。

- 259 -

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

R_LOCK = (YES)

【パラメタの意味】

YES:

占有の単位を行とします。このパラメタを指定した場合、クライアント用およびサーバ用の動作環境ファイルに

DSO_LOCKパラメタを指定することはできません。

NO:

占有の単位は、DSO_LOCKの指定に従います。このパラメタを指定し、かつDSO_LOCKが指定されていない場

合は、Symfoware/RDBによって自動的に占有の単位が選択されます。

データベース簡単運用の場合、占有の単位は、表またはインデックスとなります。

参照

詳細については、“アプリケーション開発ガイド(共通編)”の“排他制御”を参照してください。

また、データベース簡単運用の場合は、“アプリケーション開発ガイド(共通編)”の“トランザクションと排他制御

(データベース簡単運用の場合)”を参照してください。

注意

- 動 作 環 境 フ ァ イ ル の R_LOCK が NO の 場 合 、 動 作 環 境 フ ァ イ ル の DEFAULT_ISOLATION に

REPEATABLE_READを指定、またはSET TRANSACTION文にREPEATABLE READを指定しても、独立性水

準はSERIALIZABLEになります。

- 動作環境ファイルのR_LOCKがYESの場合、動作環境ファイルのDEFAULT_ISOLATIONまたはSETTRANSACTION文にSERIALIZABLEを指定しても、独立性水準はREPEATABLE READになります。

- データベース簡単運用でない場合、動作環境ファイルのR_LOCKがNOのときには、DSO定義でPRECEDENCE(1)が指定されたSEQUENTIAL構造の表にアクセスするアプリケーションの占有の単位はDSIになります。

◆トランザクションに関する実行パラメタ

DEFAULT_ACCESS_MODE

【指定形式】

DEFAULT_ACCESS_MODE = ({READ_ONLY | READ_WRITE})

【実行パラメタの意味】

トランザクションアクセスモードの初期値を指定します。DEFAULT_ACCESS_MODEが指定された場合、プロセスで

初に実行されるSQL文の直前でSET TRANSACTION文が実行されたことになります。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

DEFAULT_ACCESS_MODE = (READ_WRITE)

注意

- 動作環境ファイルのDSO_LOCKを指定して、DEFAULT_ACCESS_MODEを指定した場合は、サーバ接続時に

エラーが発生します。

- rdbuptコマンド実行時は、本パラメタを指定することはできません。

- 260 -

参照

rdbuptコマンドの詳細は、“コマンドリファレンス”を参照してください。

【パラメタの意味】

READ_ONLY:

トランザクションアクセスモードの初期値をREAD ONLYとします。

READ_WRITE:

トランザクションアクセスモードの初期値をREAD WRITEとします。

DEFAULT_ISOLATION

【指定形式】

DEFAULT_ISOLATION = ({DEFAULT | READ_UNCOMMITTED | READ_COMMITTED |REPEATABLE_READ | SERIALIZABLE})

【実行パラメタの意味】

独立性水準の初期値を指定します。DEFAULT_ISOLATIONが指定された場合、プロセスで 初に実行されるSQL文の直前でSET TRANSACTION文が実行されたことになります。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

DEFAULT_ISOLATION = (DEFAULT)

データベース簡単運用で本実行パラメタの指定を省略した場合は、省略値として以下の値が設定されます。

DEFAULT_ISOLATION = (READ COMMITTED)

【パラメタの意味】

DEFAULT:

独立性水準の初期値はシステム用の動作環境ファイルにおけるDEFAULT_ISOLATIONの指定に従います。

READ_UNCOMMITTED:

独立性水準の初期値をREAD UNCOMMITTEDとします。

READ_COMMITTED:

独立性水準の初期値をREAD COMMITTEDとします。

REPEATABLE_READ:

独立性水準の初期値をREPEATABLE READとします。

SERIALIZABLE:

独立性水準の初期値をSERIALIZABLEとします。

注意

- 動作環境ファイルのR_LOCKがNOの場合、DEFAULT_ISOLATIONにREPEATABLE_READを指定しても、独

立性水準はSERIALIZABLEになります。

- 動作環境ファイルのR_LOCKがYESの場合、DEFAULT_ISOLATIONにSERIALIZABLEを指定しても、独立性

水準はREPEATABLE READになります。

- 動作環境ファイルのDSO_LOCKを指定して、DEFAULT_ISOLATIONを指定した場合は、サーバ接続時にエ

ラーが発生します。

- rdbuptコマンド実行時は、本パラメタを指定することはできません。

- 261 -

参照

rdbuptコマンドの詳細は、“コマンドリファレンス”を参照してください。

◆デバッグに関する実行パラメタ

COREFILE_PATH

【指定形式】

COREFILE_PATH = (絶対パス名)

【実行パラメタの意味】

アプリケーションで異常が発生した場合のダンプ出力先ディレクトリを指定します。

本実行パラメタの指定を省略した場合は、カレントディレクトリが設定されます。

【パラメタの意味】

絶対パス名:

ダンプ出力先ディレクトリを指定します。

DIV_TRACE_FILE

【指定形式】

DIV_TRACE_FILE = ({YES | NO})

【実行パラメタの意味】

複数のアプリケーションが動作する場合、出力ファイル名(SQL_SNAP機能やROUTINE_SNAP機能によって出力さ

れるファイル、および、アクセスプラン情報やSQL性能情報を取得するファイル)の後ろに、プロセスIDなどの情報を

付加して個別のトレース情報を出力するか否かを指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

DIV_TRACE_FILE = (NO)

【パラメタの意味】

YES:

出力ファイル名の後に以下の情報を付加して個別のトレース情報を取得します。

- ログイン名

- プロセスID - セション開始時間

出力ファイル名をsqlsnap.lstとし、ログイン名がtest、プロセスIDが288、セション開始時間が2007年4月16日12時34分56秒であるとした場合、以下のファイルに情報が出力されます。

sqlsnap_test_288_20070416123456.lst

NO:

個別のトレース情報を取得しません。

注意

アプリケーションがマルチスレッド環境で動作する場合は、DIV_TRACE_FILEの指定に関係なく、自動的に以下の

情報を出力ファイル名の後に付加して、個別のトレース情報を出力します。

- ログイン名

- プロセスID

- セションID

- 262 -

- セション開始時間

ROUTINE_SNAP

【指定形式】

ROUTINE_SNAP = ({ON | OFF},ファイル名[,出力レベル])

【実行パラメタの意味】

ROUTINE_SNAP機能を利用するかどうかを指定します。

ROUTINE_SNAP機能は、SQL手続き文の実行情報をファイルに出力する機能です。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

ROUTINE_SNAP = (OFF)

ROUTINE_SNAP機能の詳細および使用方法については、“7.2 アプリケーションのデバッグ”を参照してください。

【パラメタの意味】

ON:

ROUTINE_SNAP機能を利用する場合に指定します。

OFF:

ROUTINE_SNAP機能を利用しない場合に指定します。

ファイル名:

SQL手続き文の実行情報の出力先のサーバ側のファイル名を、絶対パスで指定します。指定されたファイルがす

でに存在する場合は、情報を追加して出力します。

複数のアプリケーションが動作する場合は、クライアント用の動作環境ファイルの実行パラメタ(DIV_TRACE_FILE)の指定により、出力ファイル名の後にプロセスIDなどの情報を付加して、個別のトレース情報を出力します。

アプリケーションがマルチスレッド環境で動作する場合は、DIV_TRACE_FILEの指定に関係なく、出力ファイル

名の後にプロセスIDやセションIDなどの情報を自動的に付加して、個別のトレース情報を出力します。

出力レベル:

出力する情報のレベルとして、1または2を指定します。省略した場合は、2が指定されたものとみなします。

出力レベルの指定と出力情報の対応については、“7.2.3 ROUTINE_SNAP機能の利用方法”を参照してくださ

い。

SET_CALLBACK

【指定形式】

SET_CALLBACK = (ライブラリ名)

【実行パラメタの意味】

動的ライブラリを使用してコールバック関数を登録する場合、動的ライブラリ名を指定します。

動的ライブラリ名が絶対パスでの指定でない場合は、以下のディレクトリにライブラリを格納する必要があります。

環境変数LD_LIBRARY_PATHに指定したディレクトリ

PATHに指定したディレクトリ

【パラメタの意味】

ライブラリ名:

動的ライブラリ名を指定します。

- 263 -

SQL_SNAP

【指定形式】

SQL_SNAP = ({ON | OFF}[,[スナップファイル名][,[出力レベル][,[繰り返し幅]]]])

【実行パラメタの意味】

SQL_SNAP機能を利用するかどうかを指定します。

SQL_SNAP機能は、アプリケーションが実行したSQL文の情報をファイルに出力する機能です。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

SQL_SNAP = (OFF)

SQL_SNAP機能の詳細および使用方法については、“7.2 アプリケーションのデバッグ”を参照してください。

注意

本機能の利用は性能に影響を与えるため、デバッグ作業が終了したら、本実行パラメタの設定をOFFにしてください。

また、格納データを暗号化している場合でも、スナップファイル内の情報は暗号化されません。そのため、デバッグ作

業が終了したら、本実行パラメタの設定をOFFにしてください。

【パラメタの意味】

ON:

SQL_SNAP機能を利用する場合に指定します。

OFF:

SQL_SNAP機能を利用しない場合に指定します。

スナップファイル名:

SQL_SNAP機能が出力するSQL文の実行情報の出力先ファイル名を指定します。ファイル名を省略した場合は、

アプリケーションのファイル名の拡張子を“.SNP”に変更したものとなります。ファイル名にディレクトリの指定がな

い場合は、カレントディレクトリが指定されたものとみなします。指定されたファイルがすでに存在する場合は、情

報を追加して出力します。

複数のアプリケーションが動作する場合は、クライアント用の動作環境ファイルの実行パラメタ(DIV_TRACE_FILE)の指定により、出力ファイル名の後にプロセスIDなどの情報を付加して、個別のトレース情報を出力します。

アプリケーションがマルチスレッド環境で動作する場合は、DIV_TRACE_FILEの指定に関係なく、出力ファイル

名の後にプロセスIDやセションIDなどの情報を自動的に付加して、個別のトレース情報を出力します。

出力レベル:

出力する情報のレベルとして、1、2、PRC1、PRC2のいずれかを指定します。省略した場合は、2が指定されたも

のとみなします。

出力レベルの指定と出力情報の対応については、“7.2.2 SQL_SNAP機能の利用方法”を参照してください。

繰り返し幅:

出力する情報の繰り返し幅を、1から32767の範囲で指定します。1つのSQL文の出力を1とします。繰り返し幅を

指定した場合は、その幅でサイクリックに情報を出力します。省略した場合は、先頭からの情報をすべて出力しま

す。

◆アクセスプラン・性能情報に関する実行パラメタ

ACCESS_PLAN

【指定形式】

ACCESS_PLAN = ({ON | OFF},ファイル名[,[出力レベル][,[SQLアドバイザ出力レベル]]])

- 264 -

【実行パラメタの意味】

アプリケーション単位でアクセスプランを取得するかどうかを指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

ACCESS_PLAN = (OFF)

参照

アクセスプランについては、“アプリケーション開発ガイド(共通編)”の“アクセスプラン”を参照してください。

【パラメタの意味】

ON:

アクセスプラン取得機能を利用する場合に指定します。

OFF:

アクセスプラン取得機能を利用しない場合に指定します。

ファイル名:

出力先のサーバ側のファイル名を、絶対パスで指定します。指定されたファイルがすでに存在する場合は、情報

を追加して出力します。

また、指定するパスが存在することと、CONNECT文で指定したユーザIDに対する書込み権があることを確認して

ください。

出力レベル:

出力レベルには1または2を指定します。1を指定すると、アクセスプランのセクション情報のみを出力します。2を指定すると、セクション内の各エレメント詳細情報も出力します。省略した場合は、2が指定されたものとみなしま

す。

SQLアドバイザ出力レベル:

SQLアドバイザ出力レベルには、“ADVICE”または“NOADVICE”を指定します。“ADVICE”を指定すると、SQL文に対するアドバイスを出力します。“NOADVICE”を指定すると、SQL文に対するアドバイスを出力しません。省

略した場合は、“ADVICE”が指定されたものとみなします。

SQL_TRACE

【指定形式】

SQL_TRACE = ({ON | OFF},性能情報ファイル名[,出力レベル])

【実行パラメタの意味】

アプリケーション単位でSQL性能情報を取得するかどうかを指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

SQL_TRACE = (OFF)

【パラメタの意味】

ON:

SQL性能情報取得機能を利用する場合に指定します。

OFF:

SQL性能情報取得機能を利用しない場合に指定します。

性能情報ファイル名:

出力先のサーバ側のファイル名を、絶対パスで指定します。指定されたファイルがすでに存在する場合は、情報

を追加して出力します。

複数のアプリケーションが動作する場合は、クライアント用の動作環境ファイルの実行パラメタ“DIV_TRACE_FILE”の指定により、出力ファイル名の後にプロセスIDなどの情報を付加して、個別のトレース情報を出力します。

- 265 -

アプリケーションがマルチスレッド環境で動作する場合は、DIV_TRACE_FILEの指定に関係なく、出力ファイル

名の後にプロセスIDやセションIDなどの情報を自動的に付加して、個別のトレース情報を出力します。

出力レベル:

出力レベルには1または2を指定します。1を指定すると、DSOごとに集計された性能情報を出力します。2を指定

すると、DSI単位の情報までも出力します。

データベース簡単運用の場合は、表またはインデックスに関する情報が出力されます。出力レベルによる出力内

容に違いはありません。

省略した場合は、2が指定されたものとみなします。

参照

出力レベルによる、出力内容の詳細については、“SQLTOOLユーザーズガイド”の“実行エレメント情報”を参照

してください。

参照

以下の実行パラメタの詳細については、“SQLTOOLユーザーズガイド”を参照してください。

・ CHOOSE_TID_UNION

・ GROUP_COL_COND_MOVE

・ IGNORE_INDEX

・ INACTIVE_INDEX_SCAN

・ JOIN_ORDER

・ JOIN_RULE

・ MAX_SCAN_RANGE

・ SAME_COST_JOIN_ORDER

・ SCAN_KEY_ARITHMETIC_RANGE

・ SCAN_KEY_CAST

・ SORT_HASHAREA_SIZE

・ SS_RATE

・ TID_SORT

・ TID_UNION

・ USQL_LOCK

◆メッセージに関する実行パラメタ

MSG_LANG

【指定形式】

MSG_LANG = ({JAPANESE | ENGLISH})

【実行パラメタの意味】

メッセージを表示するときの言語種を指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

MSG_LANG = (JAPANESE)

- 266 -

【パラメタの意味】

JAPANESE:

日本語で表示します。

ENGLISH:

英語で表示します。

MSG_PRINT

【指定形式】

MSG_PRINT = ({ON | OFF})

【実行パラメタの意味】

SQL文実行時に、エラーメッセージを標準エラー出力に出力するか否かを指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

MSG_PRINT = (OFF)

【パラメタの意味】

ON:

エラーメッセージを標準エラー出力に出力します。

OFF:

エラーメッセージを標準エラー出力に出力しません。

◆リカバリに関する実行パラメタ

RCV_MODE

【指定形式】

RCV_MODE = ({RCV | NRCV})

【実行パラメタの意味】

アプリケーションのリカバリ水準を指定します。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

RCV_MODE = (RCV)

【パラメタの意味】

RCV:

リカバリ機能を利用します。この場合、リカバリを適用しない(rdbrtrコマンドで利用規定にnオプションを指定してい

る)データベースをアクセスすることはできますが、ログは取得されません。

NRCV:

リカバリ機能を利用しません。この場合、リカバリを適用する(rdbrtrコマンドで利用規定にnオプションを指定してい

ない)データベースを更新することはできません。

◆予約語とSQL機能に関する実行パラメタ

SQL_LEVEL

【指定形式】

SQL_LEVEL = ({SQL88 | SQL92 | SQL95 | SQL96 | SQL2000 | SQL2007})

【実行パラメタの意味】

アプリケーションの予約語とSQL機能のレベルを設定します。

予約語とSQL機能のレベルを設定することで、キーワードの範囲と利用可能なSQLの機能を変更できます。

- 267 -

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

SQL_LEVEL = (SQL2007)

SQLの機能とそれを利用可能なレベルとの関係を以下に示します。

表に記載のない機能は、SQL_LEVELに関係なく利用可能です。

表7.8 SQL_LEVELと利用可能なSQLの機能一覧

SQL_LEVEL SQLの機能

SQL2007 数値関数 ACOS

ASIN

ATAN

ATAN2

COS

EXP

LN

POWER

SIGN

SIN

SQRT

TAN

ASCII

OCTET_POSITION

データ列値関数 LTRIM

RTRIM

OCTET_SUBSTRING

CHR

日時値関数 CNV_TIME

CNV_TIMESTAMP

XMLQUERY関数

述語 XMLEXISTS述語

ROWNUM

SQL2000以上 ファンクションルーチン

ロール

プロシジャ例外事象 条件宣言

ハンドラ宣言

SIGNAL文

RESIGNAL文

SQL96以上 トリガ

行識別子

並列指定

SQL95以上 プロシジャルーチン

SQL92以上 定数 日時定数

- 268 -

SQL_LEVEL SQLの機能

時間隔定数

データ型 日時型

時間隔型

BLOB型

順序定義

一時表定義

数値関数 POSITION

EXTRACT

CHAR_LENGTH

CHARACTER_LENGTH

OCTET_LENGTH

データ列値関数 SUBSTRING

UPPER

LOWER

TRIM

日時値関数 CURRENT_DATE

CURRENT_TIME

CURRENT_TIMESTAMP

CAST指定

CASE式 NULLIF

COALESCE

CASE

結合表

カーソルのSCROLL指定

ポイント

SQL2007の関数名と同名のファンクションルーチンを定義している場合、関数とファンクションルーチンの動作の優先

順位は以下になります。

ファンクションルーチ

ン名へのスキーマ名

修飾の有無

SQL_LEVEL

SQL2007 SQL2000

スキーマ名修飾有 ファンクションルーチン ファンクションルーチン

スキーマ名修飾無 関数 ファンクションルーチン

SQL文にSQL2007の関数名と同名のファンクションルーチンを指定している場合、関数が優先して動作することで、

ファンクションルーチンの結果と異なる結果になる場合があります。

ファンクションルーチンの動作を優先する場合は、SQL_LEVELにSQL2000を指定するか、ファンクションルーチン名

をスキーマ名修飾してください。

コンパイル時にRオプションまたはWオプションで予約語とSQL機能のレベルが指定されていた場合も、本パラメタで

指定された値が有効となります。

- 269 -

【パラメタの意味】

SQL88:

予約語とSQL機能のレベルをSQL88とします。

SQL92:

予約語とSQL機能のレベルをSQL92とします。

SQL95:

予約語とSQL機能のレベルをSQL95とします。

SQL96:

予約語とSQL機能のレベルをSQL96とします。

SQL2000:

予約語とSQL機能のレベルをSQL2000とします。

SQL2007:

予約語とSQL機能のレベルをSQL2007とします。

参照

各予約語とSQL機能のレベルと、キーワードの関係については、“SQLリファレンス”を参照してください。

◆並列クエリに関する実行パラメタ

MAX_PARALLEL

【指定形式】

MAX_PARALLEL = (多重度)

【実行パラメタの意味】

SQL文でデータベースを並列に検索する場合の多重度を指定します。

SQL文でデータベースを並列に検索できるのは、問合せ式で並列指定を指定した場合です。表のDSIの数が、指定

した多重度よりも少ない場合は、DSIの数を多重度として並列検索を行います。

なお、この実行パラメタは、クライアント用の動作環境ファイルまたはサーバ用の動作環境ファイルに

PARALLEL_SCAN=YESを指定した場合、またはSQL文の問合せ式に並列指定“PARALLEL”を指定した場合に

有効となります。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、n多重(注)で並列検索を行います。

注意

OSまたは仮想OSが認識している搭載CPUコア数×2が設定されます。ただし、RDB構成パラメタファイルにて

RDBCPUNUMが指定されている場合は、RDBCPUNUM×2が設定されます。

【パラメタの意味】

多重度:

SQL文でデータベースを並列に検索する場合の多重度を2~100の範囲で指定します。

PARALLEL_SCAN

【指定形式】

PARALLEL_SCAN = ({YES | NO})

- 270 -

【実行パラメタの意味】

アプリケーション単位またはコネクション単位に、データベースを並列に検索するか否かを指定します。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

PARALLEL_SCAN = (NO)

【パラメタの意味】

YES:

データベースを並列に検索します。この場合、そのアプリケーションの問合せを並列検索で実行できます。

ただし、以下のいずれかの条件を満たす場合、並列検索は実行されず従来のアクセス手順でデータベースをア

クセスします。

- 表がDSI分割されていない、または1つのDSIに対するアクセスの場合

- クラスタキーを利用したデータベースアクセスが可能な場合

- 探索条件にROW_IDを指定した検索の場合

- インデックスを利用したデータベースアクセスが可能な場合

NO:

データベースを並列に検索しません。

◆その他の実行パラメタ

ALTER_CHECK

【指定形式】

ALTER_CHECK=({YES | NO})

【実行パラメタの意味】

表の設計変更により表の列を変更した場合に、アプリケーションに影響があるか否かをチェックします。

本実行パラメタは、Symfoware Server Enterprise Extended Edition を使用した場合のみ指定できます。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

ALTER_CHECK=(NO)

【パラメタの意味】

YES:

選択リストに“*”を指定したカーソル宣言または単一行SELECT文や、挿入列リストを省略したINSERT文の実行

をチェックします。これらのSQL文の実行がエラーになります。

NO:

選択リストに“*”を指定したカーソル宣言または単一行SELECT文や、挿入列リストを省略したINSERT文に対す

るチェックをせずに実行します。

ARC_FULL

【指定形式】

ARC_FULL = ({RETURN | WAIT})

【実行パラメタの意味】

アーカイブログファイルが満杯状態になったとき、エラー復帰するか否かを指定します。

本実行パラメタの設定は、“表7.4 クライアント用の動作環境ファイルの実行パラメタの種類”の優先順位に従います。

いずれの動作環境ファイルにも本実行パラメタが指定されなかった場合、以下の値が設定されます。

ARC_FULL = (RETURN)

- 271 -

【パラメタの意味】

RETURN:

エラーとしてアプリケーションに復帰します。

WAIT:

空きのアーカイブログファイルが作成されるまで待ちます。

注意

- “WAIT”を指定した場合、空きのアーカイブログファイルが作成されるまでアプリケーションは無応答状態となりま

すので注意してください。

- 本実行パラメタの指定が互いに異なる複数のアプリケーションが、同時に同じDSIを扱うような運用はしないでく

ださい。例えば、以下の事象が発生する場合があります。

トランザクションAは、ARC_FULL=RETURNを設定し、アーカイブログ満杯の状態であるとします。トランザクショ

ンBは、ARC_FULL=WAITを設定し、アーカイブログ満杯の状態で資源を占有しているとします。このとき、トラン

ザクションBは、空きのアーカイブログファイルが作成されるまで待ちます。同じ資源にアクセスしているトランザク

ションAは、トランザクションBの終了を待つため、ARC_FULL=RETURNを設定しているにもかかわらず、無応答

状態になります。

この場合は、rdblkinfコマンドのlオプションやrdblogコマンドのVオプションかつaオプションで排他やアーカイブロ

グの状況を確認できます。また、アーカイブログに関する以下のシステムメッセージが表示されます。これらの情

報をもとに、バックアップ可能なアーカイブログファイルをバックアップするか、または新規にアーカイブログファイ

ルを追加して対処してください。

rdb: WARNING: qdg13336w:転送可能なアーカイブログ域が不足しています

rdb: ERROR: qdg03132u:アーカイブログファイルが満杯です

- 以下のいずれかの処理中にシステムロググループまたはユーザロググループのアーカイブログファイルが満杯状

態になった場合の振る舞いについては、本実行パラメタの指定に関わらずシステム用の動作環境ファイルに指

定したARC_FULLパラメタに従います。

- SQL文の実行で自動容量拡張が動作する。

- SQL文中に順序を直接指定して番号を採番する。

- 表定義のDEFAULT句に順序を指定して、自動的に取得した値を表に挿入する。

SIGNAL_INF

【指定形式】

SIGNAL_INF = ({YES | NO})

【実行パラメタの意味】

シグナルをアプリケーションで利用するか否かを設定します。

なお、本実行パラメタは、トランザクションモニタ配下では指定できません。

本実行パラメタの指定を省略した場合は、以下の値が設定されます。

SIGNAL_INF = (YES)

【パラメタの意味】

YES:

アプリケーションでシグナルを利用します。

NO:

アプリケーションでシグナルを利用しません。

- 272 -

7.4.2 データ操作範囲の限定方法

アプリケーションから表のデータ操作の範囲を限定することができます。表のデータ操作の範囲は、以下の方法で限定

できます。

注意

データベース簡単運用では、表のデータ操作の範囲を限定することができません。

・ クライアント用の動作環境ファイルのINCLUSION_DSIパラメタ

・ rdbexdsiコマンド

・ スコープ適用文

表のデータ操作の範囲を限定する方法について以下に示します。

表7.9 表のデータ操作の範囲を限定する方法

表の範囲限定方法 機能概要 有効範囲 対象

INCLUSION_DSIパラメタ

アプリケーションの実行時に、

INCLUSION_DSIパラメタで指定

されたDSIをデータ操作の範囲とし

て限定します。

アプリケーションの

開始から終了まで。

実行する

アプリ

ケーション

rdbexdsiコマンド

rdbexdsiコマンドで指定したDSIをシステムで動作するすべてのアプ

リケーションのデータ操作の範囲

から除きます。

rdbexdsiコマンドの

monオプションの

実行からmoffオプ

ションの実行まで。

全アプリ

ケーション

スコープ適用文

CREATE SCOPE文で定義した、

データ操作の範囲を、APPLYSCOPE文で利用者に適用します。

この適用により、利用者が実行す

るSQL文のデータ操作の範囲を限

定します。

APPLY SCOPE文の実行から

RELEASESCOPE文の実行

まで。

利用者ご

とに実行

するSQL文

表のデータ操作の範囲を限定する場合の注意事項

スコープとINCLUSION_DSIパラメタとの関係

INCLUSION_DSIパラメタが指定されたアプリケーションを、スコープが適用された利用者が実行する場合、

INCLUSION_DSIパラメタとスコープの両方で指定されたDSIがデータ操作の範囲となります。

(1) 表T1は、スコープとINCLUSION_DSIでDSIが限定されているため、DSI2だけデータ操作ができます。

(2) 表T2は、DSIの限定の対象外のため、表中のすべてのDSIに対して、データ操作ができます。

- 273 -

スコープとrdbexdsiコマンドとの関係

rdbexdsiコマンドでDSIが除外されている場合、適用されているスコープから除外されているDSIを除いたDSIが、デー

タ操作の範囲となります。

- 274 -

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

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

A.1 可変長文字列のデータ操作例

ここでは、ホスト変数の可変長文字列をCプログラムで操作するプログラミング例を説明します。ホスト変数の可変長文字

列をCプログラムで操作する場合は、文字列の長さが必要です。このため、コンパイル時には、可変長文字列を文字列

の長さと文字列を持つ構造体形式に変換します。Cプログラムは、変換された構造体の変数でデータ操作を行います。

以下に可変長文字列を構造体形式に変換した例を示します。

アプリケーション中に以下のように宣言します。

VARCHAR hcomp_word[13];

↓コンパイル時に構造体に変換します。

struct{

short sqllen;

char sqlvar[13];

} hcomp_word;

プログラムの処理概要を図A.1 可変長文字列のデータ操作の概要に示します。

図A.1 可変長文字列のデータ操作の概要

(1) 電話番号の市外局番を、ホスト変数の可変長文字列に対話で入力します。

(2) CONNECT文により、データベース“DB01”の存在するサーバとコネクションを接続します。

(3) カーソル操作により、取引会社表から入力された市外局番に該当する取引先会社のデータを検索します。

(4) 取引先会社のデータを端末に出力します。

(5) DISCONNECT文により、データベース“DB01”の存在するサーバとのコネクションを切断します。

プログラミング例を以下に示します。

#include<stdio.h>

#include<string.h>

- 275 -

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

VARCHAR hcomp_word[13]; …… (1)

long hnumber;

char CHARACTER SET NCHAR hcompany[21];

char htel_number[13];

char CHARACTER SET NCHAR hlocation[21];

EXEC SQL END DECLARE SECTION;

void putmsgx(void);

main(void){

short execute;

short count;

EXEC SQL DECLARE 取引先会社 TABLE ON BUSINESS; …… (2)

EXEC SQL DECLARE CSR1 CURSOR FOR

SELECT * FROM 取引先会社

WHERE 電話番号 LIKE :hcomp_word; …… (3)

printf("入力された市外局番に該当する取引先会社のデータを取り出します.\n");

for(;;){

printf("市外局番を入力してください >> ");

gets(hcomp_word.sqlvar); …… (4)

printf("\n");

printf("市外局番\"%s\"のデータでよろしいですか?\n",hcomp_word.sqlvar);

printf("よろしかったら(Y/y)を入力してください >>");

execute=getchar();

if(execute=='Y' || execute==’y’){

break;

}

printf("\n");

}

printf("\n");

strcat(hcomp_word.sqlvar,"%");

hcomp_word.sqllen = strlen(hcomp_word.sqlvar); …… (5)

EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'DB01'; …… (6)

EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;

EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR;

EXEC SQL OPEN CSR1; …… (7)

for(count=0;;count++) {

memset(hcompany,'\0',sizeof(hcompany)); …… (8)

memset(htel_number,'\0',sizeof(htel_number)); …… (9)

memset(hlocation,'\0',sizeof(hlocation)); …… (10)

EXEC SQL FETCH CSR1 INTO :hnumber,:hcompany,:htel_number,:hlocation; (11)

printf("\n取引先番号 会社名 電話番号 所在地\n");

printf("%010ld %-20s %-12s %-20s\n" …… (12)

,hnumber,hcompany,htel_number,hlocation);

}

NOT_FOUND_ERROR:

if(count != 0) printf("\n該当データは%d件です.\n",count); …… (13)

else printf("\n該当データなし\n");

- 276 -

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK; …… (14)

EXEC SQL DISCONNECT 'DB01'; …… (15)

return 0;

STM_ERROR: …… (16)

putmsgx();

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK; …… (17)

EXEC SQL DISCONNECT 'DB01'; …… (18)

return 1;

CONNECT_ERROR:

putmsgx(); …… (19)

return 1;

}

void putmsgx( void ) { …… (20)

int i;

for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );

SQLMSG[++i] = '\0';

SQLSTATE[5]='\0';

printf( "SQLMSG:%s\n" , SQLMSG );

printf( "SQLSTATE:%s\n" , SQLSTATE );

return;

}

(1) 市外局番を可変長文字列のホスト変数として定義します。

(2) 取引先会社を表宣言します。

(3) 取引先会社表のすべての列に対するカーソル“CSR1”を宣言します。

(4) 市外局番を対話入力します。市外局番は、可変長文字列変数“hcomp_word”をコンパイル時に構造体に変換した変

数“hcomp_word.sqlvar”に入力します。

(5) 入力した市外局番の長さを、可変長文字列のホスト変数“hcomp_word”をコンパイル時に構造体に変換した長さの

変数“hcomp_word.sqllen”に設定します。

(6) データベース“DB01”の存在するサーバとコネクションを接続します。

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

(8) ホスト変数“hcompany”をNULL文字で初期化します。

(9) ホスト変数“htel_number”をNULL文字で初期化します。

(10) ホスト変数“hlocation”をNULL文字で初期化します。

(11) 入力した市外局番と等しい市外局番の行にカーソルを位置づけ、その行を読み込みます。

(12) 読み込んだ行をprintf関数で表示します。

(13) 取引先会社表のデータをすべて検索した場合は、検索結果をprintf関数で表示します。

(14) トランザクションをROLLBACK文により終了します。

(15) データベース“DB01”の存在するサーバとのコネクションを切断します。

(16) SQL文のエラーの場合に、SQLMSGとSQLSTATEの内容を表示します。

- 277 -

(17) SQL文の実行でエラーが発生した場合は、トランザクションをROLLBACK文により終了します。

(18) データベース“DB01”の存在するサーバとのコネクションを切断します。

(19) コネクションでエラーの場合は、SQLMSGとSQLSTATEの内容を表示します。

(20) SQLMSGとSQLSTATEの内容を表示する関数です。

プログラムの処理概要を図A.2 可変長文字列のデータ操作の概要に示します。

図A.2 可変長文字列のデータ操作の概要

(1) CONNECT文により、データベースへコネクションを接続します。

(2) 市外局番を、ホスト変数の可変長文字列に対話で入力します。

(3) カーソル操作により、取引先会社表から入力された市外局番に該当する取引先会社のデータを検索します。

(4) 取引先会社のデータを出力します。

(5) DISCONNECT文により、コネクションを切断します。

プログラミング例を以下に示します。

EXEC SQL INCLUDE sample3.h;

long FAR PASCAL WsampleWndProc(hWnd, message, wParam, lParam)

{

FARPROC lpProcAbout;

HDC hDC;

PAINTSTRUCT ps;

EXEC SQL BEGIN DECLARE SECTION; …… (1)

char SQLSTATE[6];

char SQLMSG[256];

long hnumber;

char CHARACTER SET IS NCHAR hcompany[21];

char htel_number[13];

char CHARACTER SET IS NCHAR hlocation[21];

VARCHAR hcomp_word[13]; …… (2)

EXEC SQL END DECLARE SECTION;

char msgno[5];

short i;

- 278 -

EXEC SQL DECLARE 取引先会社 TABLE ON BUSINESS; …… (3)

EXEC SQL WHENEVER SQLERROR GOTO :err_exit;

switch (message) {

case WM_CREATE:

SQLMSG[255] = '\0';

EXEC SQL CONNECT TO DEFAULT; …… (4)

DFlag2 = FALSE;

count = 0;

break;

case WM_COMMAND:

switch (wParam) {

case WIN_END:

PostMessage(hWnd, WM_CLOSE, 0, 0 );

break;

case WIN_INPUT: …… (5)

lpProcAbout = MakeProcInstance(InputData, hInst);

DFlag = DialogBox(hInst,"InputData",hWnd,lpProcAbout);

FreeProcInstance(lpProcAbout);

break;

case WIN_EXEC: …… (6)

count = 0;

InvalidateRect(hWnd,NULL,TRUE);

if( DFlag == FALSE ) {

break;

}

EXEC SQL DECLARE CSR1 CURSOR FOR …… (7)

SELECT * FROM 取引先会社

WHERE 電話番号 LIKE :hcomp_word;

EXEC SQL OPEN CSR1; …… (8)

EXEC SQL WHENEVER NOT FOUND GOTO :atend;

hcompany[20] = '\0';

htel_number[12] = '\0';

hlocation[20] = '\0';

for(count=0;;count++) {

EXEC SQL FETCH CSR1 …… (9)

INTO :hnumber,:hcompany,:htel_number,:hlocation;

wsprintf( hbuff[count],"%031d %-20s %-12s %-20s",

hnumber,(char far*)hcompany, …… (10)

(char far*)htel_number, (char far*)hlocation);

DFlag2 = TRUE;

}

atend:

EXEC SQL CLOSE CSR1; …… (11)

EXEC SQL COMMIT WORK; …… (12)

break;

default:

break;

}

break;

case WM_PAINT:

if (DFlag2==TRUE) {

hDC = BeginPaint (hWnd, &ps);

for( i = 0; i < count; i++ ) {

TextOut (hDC,10,10+(i*20),

(LPSTR)hbuff,lstrlen((LPSTR)hbuff));

EndPaint(hWnd, &ps);

}

UpdateWindow(hWnd);

}

break;

case WM_DESTROY:

- 279 -

EXEC SQL DISCONNECT ALL; …… (13)

PostQuitMessage(0);

return(0);

err_exit:

memset(mes,'\0',512);

SQLSTATE[5]='\0';

SQLMSG[255]='\0';

delspace( SQLMSG );

wsprintf(mes,"SQL 文実行失敗\nSQLSTATE=%s\nSQLMSG=%s\n", …… (14)

(LPSTR)SQLSTATE,(LPSTR)SQLMSG);

MessageBox( 0, (LPSTR)mes, "MESSAGE", MB_OK );

memcpy( msgno , SQLMSG+3 , 4 );

msgno[4] = '\0';

WinHelp( hWnd, HLP_PASS, HELP_CONTEXT, (DWORD)atol(msgno) ); (15)

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK; …… (16)

EXEC SQL DISCONNECT ALL; …… (17)

PostQuitMessage(0);

return(0);

default:

break;

}

return (DefWindowProc(hWnd, message, wParam, lParam));

}

(1) ホスト変数を宣言します。

(2) 市外局番が格納される可変長文字列のホスト変数を宣言します。

(3) 取引先会社を表宣言します。

(4) 動作環境ファイルのDEFAULT_CONNECTIONで指定したサーバとコネクションを接続します。

(5) 選択されたメニューに従って、処理を行います。ここでは、市外局番を入力するダイアログボックスを表示し、対話処

理で入力します。“InputData”は、可変長文字列変数“hcomp_word”をプレコンパイラが構造体に変換した変数

“hcomp_word.sqlvar”および“hcomp_word.sqllen”にデータとその長さを入力する関数です。

(6) 選択されたメニューに従って、処理を行います。ここでは、SQL文の実行を開始します。

(7) 取引先会社表のすべての列に対するカーソル“CSR1”を宣言します。

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

(9) 入力した市外局番と等しい市外局番の行にカーソルを位置づけ、その行を読み込みます。

(10) 検索結果を画面に出力します。

(11) カーソル“CSR1”をクローズします。

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

(13) すべてのコネクションを切断します。

(14) SQL文の実行でエラーが発生した場合は、SQLSTATEとSQLMSGの内容を出力します。

(15) エラーに対するヘルプメッセージを表示します。

- 280 -

(16) SQL文の実行でエラーの場合は、トランザクションをROLLBACK文により終了します。

(17) すべてのコネクションを切断します。

A.2 日本語可変長文字列のデータ操作例

ここでは、ホスト変数の日本語可変長文字列をCプログラムで操作するプログラミング例を説明します。ホスト変数の日本

語可変長文字列をCプログラムで操作する場合は、文字列の長さが必要です。このため、コンパイル時には、日本語可

変長文字列の長さと日本語文字列を持つ構造体に変換します。Cプログラムは、変換された構造体の変数でデータ操

作を行います。

以下に日本語可変長文字列を構造体形式に変換した例を示します。

アプリケーション中に以下のように宣言します。

VARCHAR CHARACTER SET NCHAR hcomp_word[31];

↓コンパイル時に構造体に変換します。

struct {

short sqllen;

char sqlvar[31];

} hcomp_word;

プログラムの処理概要を図A.3 日本語可変長文字列のデータ操作の概要に示します。

図A.3 日本語可変長文字列のデータ操作の概要

(1) 製品名を、ホスト変数の日本語可変長文字列に対話で入力します。

(2) CONNECT文により、データベース“DB01”の存在するサーバとコネクションを接続します。

(3) カーソル操作により、在庫表から入力された製品名に該当する在庫のデータを検索します。

(4) 在庫のデータを端末に出力します。

(5) DISCONNECT文により、データベース“DB01”の存在するサーバとのコネクションを切断します。

プログラミング例を以下に示します。

- 281 -

#include<stdio.h>

#include<string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

VARCHAR CHARACTER SET NCHAR hcomp_word[31]; …… (1)

long hnumber;

char CHARACTER SET NCHAR hproduct[31];

long hstock;

long hstorehouse;

EXEC SQL END DECLARE SECTION;

void putmsgx();

main(void) {

short execute;

short count;

EXEC SQL DECLARE 在庫 TABLE ON BUSINESS; …… (2)

EXEC SQL DECLARE CSR1 CURSOR FOR

SELECT * FROM 在庫 WHERE 製品名=:hcomp_word; …… (3)

printf("入力された製品名に該当する在庫のデータを取り出します.\n");

for(;;){

printf("日本語で製品名を入力してください >>");

gets(hcomp_word.sqlvar); …… (4)

printf("\n");

printf("製品\"%s\"のデータでよろしいですか?\n",hcomp_word.sqlvar);

printf("よろしかったら(Y/y)を入力してください >>");

execute=getchar();

if(execute=='Y' || execute=='y'){

break;

}

printf("\n");

}

printf("\n");

hcomp_word.sqllen = strlen(hcomp_word.sqlvar); …… (5)

EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'DB01'; …… (6)

EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;

EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR;

EXEC SQL OPEN CSR1; …… (7)

printf("\n製品番号 製品名 在庫数量 倉庫番号\n");

for(count=0;;count++){

memset(hproduct,'\0',sizeof(hproduct)); …… (8)

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

printf("%08ld %-20s %08ld %08ld\n" …… (10)

,hnumber,hproduct,hstock,hstorehouse);

}

NOT_FOUND_ERROR:

if(count != 0) printf("\n該当データは%d件です.\n",count); …… (11)

else printf("\n該当データなし\n");

- 282 -

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK; …… (12)

EXEC SQL DISCONNECT 'DB01'; …… (13)

return 0;

STM_ERROR:

putmsgx();

EXEC SQL WHENEVER SQLERROR CONTINUE; …… (14)

EXEC SQL ROLLBACK WORK; …… (15)

EXEC SQL DISCONNECT 'DB01'; …… (16)

return 1;

CONNECT_ERROR:

putmsgx(); …… (17)

return 1;

}

void putmsgx( void ) { …… (18)

int i;

for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );

SQLMSG[++i] = '\0';

SQLSTATE[5]='\0';

printf( "SQLMSG:%s\n" , SQLMSG );

printf( "SQLSTATE:%s\n" , SQLSTATE );

return;

}

(1) 製品名を日本語可変長文字列のホスト変数として定義します。

(2) 在庫表を表宣言します。

(3) 在庫表のカーソル“CSR1”を宣言します。

(4) 対話処理で、製品名を入力します。入力領域は、日本語可変長文字列変数“hcomp_word”をコンパイル時に構造体

に変換した変数“hcomp_word.sqlvar”に入力します。

(5) 入力した製品名の長さを、日本語可変長文字列変数“hcomp_word”をコンパイル時に構造体に変換した変数

“hcomp_word.sqllen”に設定します。

(6) データベース“DB01”の存在するサーバとのコネクションを接続します。

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

(8) ホスト変数の“hproduct”をNULL文字で初期化します。

(9) 入力した製品名と等しい在庫表の製品名の行にカーソルを位置づけ、その行を読み込みます。

(10) 読み込んだ行をprintf関数で表示します。

(11) 在庫表のデータをすべて検索した場合は、検索結果をprintf関数で表示します。

(12) トランザクションをROLLBACK文により終了します。

(13) データベース“DB01”の存在するサーバとのコネクションを切断します。

(14) SQL文の実行でエラーの場合に、SQLMSGとSQLSTATEの内容を表示します。

(15) SQL文の実行でエラーの場合は、トランザクションをROLLBACK文により終了します。

(16) データベース“DB01”の存在するサーバとのコネクションを切断します。

- 283 -

(17) コネクションでエラーの場合に、SQLMSGとSQLSTATEの内容を表示します。

(18) SQLMSGとSQLSTATEの内容を表示する関数です。

プログラムの処理概要を図A.4 日本語可変長文字列のデータ操作の概要に示します。

図A.4 日本語可変長文字列のデータ操作の概要

(1) CONNECT文により、データベースへコネクションを接続します。

(2) 製品名を、ホスト変数の日本語可変長文字列に対話で入力します。

(3) カーソル操作により、在庫表から入力された製品名に該当する在庫のデータを検索します。

(4) 在庫のデータを出力します。

(5) DISCONNECT文により、コネクションを切断します。

プログラミング例を以下に示します。

EXEC SQL INCLUDE sample4.h;

long FAR PASCAL WsampleWndProc(hWnd, message, wParam, lParam)

{

FARPROC lpProcAbout;

HDC hDC;

PAINTSTRUCT ps;

EXEC SQL BEGIN DECLARE SECTION; …… (1)

char SQLSTATE[6];

char SQLMSG[256];

long hnumber;

char CHARACTER SET IS NCHAR hproduct[21];

long hstock;

long hstorehouse;

VARCHAR CHARACTER SET IS NCHAR hcomp_word[21]; …… (2)

EXEC SQL END DECLARE SECTION;

short i;

char msgno[5];

EXEC SQL DECLARE 在庫 TABLE ON BUSINESS; …… (3)

EXEC SQL WHENEVER SQLERROR GOTO :err_exit;

- 284 -

switch (message) {

case WM_CREATE:

SQLMSG[255] = '\0';

EXEC SQL CONNECT TO DEFAULT; …… (4)

DFlag2 = FALSE;

count = 0;

break;

case WM_COMMAND:

switch (wParam) {

case WIN_END:

PostMessage(hWnd, WM_CLOSE, 0, 0 );

break;

case WIN_INPUT: …… (5)

lpProcAbout = MakeProcInstance(InputData, hInst);

DFlag = DialogBox(hInst,"InputData",hWnd,lpProcAbout);

FreeProcInstance(lpProcAbout);

break;

case WIN_EXEC: …… (6)

count = 0;

InvalidateRect(hWnd,NULL,TRUE);

if (DFlag == FALSE) {

break;

}

EXEC SQL DECLARE CSR1 CURSOR FOR …… (7)

SELECT * FROM 在庫 WHERE 製品名 = :hcomp_word;

EXEC SQL OPEN CSR1; …… (8)

EXEC SQL WHENEVER NOT FOUND GOTO :atend;

hproduct[20]='\0';

for(count=0;;count++) {

EXEC SQL FETCH CSR1 …… (9)

INTO :hnumber,:hproduct,:hstock,:hstorehouse;

wsprintf( hbuff, "%08ld %-20s %08ld %08ld", hnumber,

(char far*)hproduct, hstock, hstorehouse ); …… (10)

DFlag2 = TRUE;

}

atend:

EXEC SQL CLOSE CSR1; …… (11)

EXEC SQL COMMIT WORK; …… (12)

break;

default:

break;

}

break;

case WM_PAINT:

if (DFlag2==TRUE) {

hDC = BeginPaint (hWnd, &ps);

for( i = 0; i < count; i++ ) {

TextOut (hDC,10,10+(i*20),

(LPSTR)hbuff,lstrlen((LPSTR)hbuff[i]));

EndPaint(hWnd, &ps);

}

UpdateWindow(hWnd);

}

break;

case WM_DESTROY:

EXEC SQL DISCONNECT ALL; …… (13)

PostQuitMessage(0);

return(0);

- 285 -

err_exit:

memset(mes,'\0',512);

SQLSTATE[5]='\0';

SQLMSG[255]='\0';

delspace( SQLMSG );

wsprintf(mes,"SQL 文実行失敗\nSQLSTATE=%s\nSQLMSG=%s\n", …… (14)

(LPSTR)SQLSTATE,(LPSTR)SQLMSG);

MessageBox( 0, (LPSTR)mes, "MESSAGE", MB_OK );

memcpy( msgno , SQLMSG+3 , 4 );

msgno[4] = '\0';

WinHelp( hWnd, HLP_PASS, HELP_CONTEXT, (DWORD)atol(msgno) ); (15)

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK; …… (16)

EXEC SQL DISCONNECT ALL; …… (17)

PostQuitMessage(0);

return(0);

default:

break;

}

return (DefWindowProc(hWnd, message, wParam, lParam));

}

(1) ホスト変数を宣言します。

(2) 製品名が格納される日本語可変長文字列のホスト変数を宣言します。

(3) 在庫を表宣言します。

(4) 動作環境ファイルのDEFAULT_CONNECTIONで指定したサーバとコネクションを接続します。

(5) 選択されたメニューに従って、処理を行います。ここでは、製品名を入力するダイアログボックスを表示し、対話処理

で入力します。“InputData”は、日本語可変長文字列変数“hcomp_word”をプレコンパイラが構造体に変換した変数

“hcomp_word.sqlvar”および“hcomp_word.sqllen”にデータとその長さを入力する関数です。

(6) 選択されたメニューに従って、処理を行います。ここでは、SQL文の実行を開始します。

(7) 在庫表のすべての列に対するカーソル“CSR1”を宣言します。

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

(9) 入力した製品名と等しい在庫表の製品名の行にカーソルを位置づけ、その行を読み込みます。

(10) 検索結果を画面に出力します。

(11) カーソル“CSR1”をクローズします。

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

(13) すべてのコネクションを切断します。

(14) SQL 文の実行でエラーの場合は、SQLSTATEとSQLMSGの内容を出力します。

(15) エラーに対するヘルプメッセージを表示します。

(16) SQL 文の実行でエラーの場合は、トランザクションをROLLBACK文により終了します。

(17) すべてのコネクションを切断します。

- 286 -

A.3 ポインタ型ホスト変数(文字列型)の使用例

文字列型のポインタ型ホスト変数を使用したサンプルプログラムを以下に示します。

なお、ポインタ型ホスト変数の詳細については、“3.1.8 ポインタ変数として宣言したホスト変数の使用方法”を参照してく

ださい。

#include<stdio.h>

#include<string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

char *country;

short count;

EXEC SQL END DECLARE SECTION;

void putmsgx(void);

main(void){

short execute;

EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'DB01';

EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;

country = (char *)malloc(256);

printf("国名を入力します.\n");

count = 1;

for(;;){

printf("%d件目の国名を入力してください >> ", count);

gets(country);

printf("\n");

printf("\"%s\"でよろしいですか?\n",country);

printf("よろしかったら(Y/y)を入力してください >>");

execute=getchar();

if(execute=='Y' || execute=='y'){

printf("\n");

EXEC SQL INSERT INTO SCH.TBL( COUNTRY, DATANO )

VALUES( :country, :count );

count++;

printf("入力を終えますか?(Y/y) >>");

execute=getchar();

if(execute=='Y' || execute=='y'){

break;

}

}

}

printf("\n");

EXEC SQL INSERT INTO SCH.TBL( COUNTRY )

VALUES( :country );

STM_ERROR:

putmsgx();

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

- 287 -

return 1;

CONNECT_ERROR:

putmsgx();

return 1;

}

void putmsgx( void ) {

int i;

for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );

SQLMSG[++i] = '\0';

SQLSTATE[5]='\0';

printf( "SQLMSG:%s\n" , SQLMSG );

printf( "SQLSTATE:%s\n" , SQLSTATE );

return;

}

A.4 ポインタ型ホスト変数(可変長文字列型)の使用例

可変長文字列型のポインタ型ホスト変数を使用したサンプルプログラムを以下に示します。

なお、ポインタ型ホスト変数の詳細については、“3.1.8 ポインタ変数として宣言したホスト変数の使用方法”を参照してく

ださい。

#include<stdio.h>

#include<string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

VARCHAR *country;

short loop;

EXEC SQL END DECLARE SECTION;

#define MAX_COUNTRY 100

void putmsgx(void);

main(void){

EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'DB01';

EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;

EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR;

country = (struct country_SQLVAR *)malloc(256);

printf("すべての国名を取り出します.\n");

for ( loop=0; loop<MAX_COUNTRY; loop++ ) {

country->sqllen = 254;

EXEC SQL SELECT COUNTRY INTO :country

FROM SCH.TBL

WHERE DATANO = :loop;

country->sqlvar[country->sqllen] = '\0';

printf("%d件目の国名は%sです.\n", loop, country->sqlvar );

}

- 288 -

NOT_FOUND_ERROR:

STM_ERROR:

putmsgx();

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

return 1;

CONNECT_ERROR:

putmsgx();

return 1;

}

void putmsgx( void ) {

int i;

for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );

SQLMSG[++i] = '\0';

SQLSTATE[5]='\0';

printf( "SQLMSG:%s\n" , SQLMSG );

printf( "SQLSTATE:%s\n" , SQLSTATE );

return;

}

A.5 ポインタ型ホスト変数(BLOB型)の使用例

BLOB型のポインタ型ホスト変数を使用したサンプルプログラムを以下に示します。

なお、ポインタ型ホスト変数の詳細については、“3.1.8 ポインタ変数として宣言したホスト変数の使用方法”を参照してく

ださい。

#include<stdio.h>

#include<string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

short datano;

SQL TYPE IS BLOB *image;

EXEC SQL END DECLARE SECTION;

void putmsgx(void);

main(void){

short execute;

EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'DB01';

EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;

EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR;

image = (struct image_SQLBLOB *)malloc( 10240 + 8 );

image->image_length = 10240;

datano = 5;

/* データの取得 */

EXEC SQL SELECT IMAGE

INTO :image

- 289 -

FROM SCH01.TBL01

WHERE DATANO = :datano;

/* 最初の50バイトを出力 */

image->image_data[50] = '\0';

printf("データ(%d)%s\n",image->image_length,image->image_data);

STM_ERROR:

putmsgx();

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

return 1;

NOT_FOUND_ERROR:

printf("\n該当データはありません.\n");

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK;

EXEC SQL DISCONNECT 'DB01';

return 0;

CONNECT_ERROR:

putmsgx();

return 1;

}

void putmsgx( void ) {

int i;

for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );

SQLMSG[++i] = '\0';

SQLSTATE[5]='\0';

printf( "SQLMSG:%s\n" , SQLMSG );

printf( "SQLSTATE:%s\n" , SQLSTATE );

return;

}

A.6 構造体型ホスト変数の使用例

構造体型ホスト変数を使用したサンプルプログラムを以下に示します。

なお、構造体型ホスト変数の詳細については、“3.1.9 構造体として宣言したホスト変数の使用方法”を参照してください。

#include<stdio.h>

#include<string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

struct {

long num;

char name[21];

char atta[41];

short year;

} data;

short number;

EXEC SQL END DECLARE SECTION;

- 290 -

void putmsgx(void);

main(void){

short execute;

memset( &data, 0x00, sizeof( data ) );

EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'DB01';

EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;

EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR;

number = 1;

/* データの取得 */

EXEC SQL SELECT COL01, COL02, COL03, COL04 INTO :data

FROM SCH01.TBL01

WHERE NUMBER = :number;

printf( "COL1=%d", data.num );

printf( "COL2=%s", data.name );

printf( "COL3=%s", data.atta );

printf( "COL4=%d", data.year );

STM_ERROR:

putmsgx();

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

return 1;

NOT_FOUND_ERROR:

printf("\n該当データはありません.\n");

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK;

EXEC SQL DISCONNECT 'DB01';

return 0;

CONNECT_ERROR:

putmsgx();

return 1;

}

void putmsgx( void ) {

int i;

for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );

SQLMSG[++i] = '\0';

SQLSTATE[5]='\0';

printf( "SQLMSG:%s\n" , SQLMSG );

printf( "SQLSTATE:%s\n" , SQLSTATE );

return;

}

- 291 -

A.7 BLOB型を含む構造体型ホスト変数の使用例

BLOB型を含む構造体型ホスト変数を使用したサンプルプログラムを以下に示します。

なお、構造体型ホスト変数の詳細については、“3.1.9 構造体として宣言したホスト変数の使用方法”を参照してください。

#include<stdio.h>

#include<string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

struct _tbl {

short number;

SQL TYPE IS BLOB(10K) image1;

SQL TYPE IS BLOB(10K) image2;

};

short number;

EXEC SQL END DECLARE SECTION;

void putmsgx(void);

short get_10_data( void * );

short set_10_data( void * );

main(void){

short execute;

struct _tbl *buff;

EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'DB01';

buff = (struct _tbl *)malloc( sizeof( struct _tbl ) );

get_10_data( (void *)buff );

set_10_data( (void *)buff );

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

return 1;

CONNECT_ERROR:

putmsgx();

return 1;

}

void putmsgx( void ) {

int i;

for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );

SQLMSG[++i] = '\0';

SQLSTATE[5]='\0';

printf( "SQLMSG:%s\n" , SQLMSG );

printf( "SQLSTATE:%s\n" , SQLSTATE );

return;

}

- 292 -

short get_10_data( void *data0 )

{

EXEC SQL BEGIN DECLARE SECTION;

struct _tbl *outdata;

EXEC SQL END DECLARE SECTION;

outdata = (struct _tbl *)data0;

EXEC SQL SELECT DATANO,IMAGE1,IMAGE2 INTO :outdata

FROM SCH01.TBL01;

return 0;

}

short set_10_data( void *data0 )

{

EXEC SQL BEGIN DECLARE SECTION;

struct _tbl *indata;

EXEC SQL END DECLARE SECTION;

indata = (struct _tbl *)data0;

EXEC SQL UPDATE SCH01.TBL01 SET IMAGE = :indata->image1

WHERE DATANO = :indata->number;

return 0;

}

A.8 構造体型標識変数の使用例

構造体型標識変数を使用したサンプルプログラムを以下に示します。

なお、構造体型標識変数の詳細については、“3.1.9 構造体として宣言したホスト変数の使用方法”を参照してください。

#include<stdio.h>

#include<string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

struct {

long num;

char name[21];

char atta[41];

short year;

} data;

struct {

short ind1;

short ind2;

short ind3;

short ind4;

} indi;

short number;

EXEC SQL END DECLARE SECTION;

void putmsgx(void);

main(void){

EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'DB01';

EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;

EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR;

- 293 -

number = 1;

/* データの取得 */

EXEC SQL SELECT COL01, COL02, COL03, COL04 INTO :data :indi

FROM SCH01.TBL01

WHERE NUMBER = :number;

printf( "COL1=%d", data.num );

printf( "IND=%d", indi.ind1 );

printf( "COL2=%s", data.name );

printf( "IND=%d", indi.ind2 );

printf( "COL3=%s", data.atta );

printf( "IND=%d", indi.ind3 );

printf( "COL4=%d", data.year );

printf( "IND=%d", indi.ind4 );

STM_ERROR:

putmsgx();

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

return 1;

NOT_FOUND_ERROR:

printf("\n該当データはありません.\n");

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK;

EXEC SQL DISCONNECT 'DB01';

return 0;

CONNECT_ERROR:

putmsgx();

return 1;

}

void putmsgx( void ) {

int i;

for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );

SQLMSG[++i] = '\0';

SQLSTATE[5]='\0';

printf( "SQLMSG:%s\n" , SQLMSG );

printf( "SQLSTATE:%s\n" , SQLSTATE );

return;

}

A.9 配列型標識変数の使用例

配列型標識変数を使用したサンプルプログラムを以下に示します。

なお、配列型標識変数の詳細については、“3.1.9 構造体として宣言したホスト変数の使用方法”を参照してください。

#include<stdio.h>

#include<string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

struct {

- 294 -

long num;

char name[21];

char atta[41];

short year;

} data;

struct {

short ind[4];

} indi;

short number;

EXEC SQL END DECLARE SECTION;

void putmsgx(void);

main(void){

EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'DB01';

EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;

EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR;

number = 1;

/* データの取得 */

EXEC SQL SELECT * INTO :data :indi

FROM SCH01.TBL01

WHERE NUMBER = :number;

printf( "COL1=%d", data.num );

printf( "IND=%d", indi.ind[1] );

printf( "COL2=%s", data.name );

printf( "IND=%d", indi.ind[2] );

printf( "COL3=%s", data.atta );

printf( "IND=%d", indi.ind[3] );

printf( "COL4=%d", data.year );

printf( "IND=%d", indi.ind[4] );

STM_ERROR:

putmsgx();

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

return 1;

NOT_FOUND_ERROR:

printf("\n該当データはありません.\n");

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK;

EXEC SQL DISCONNECT 'DB01';

return 0;

CONNECT_ERROR:

putmsgx();

return 1;

}

void putmsgx( void ) {

- 295 -

int i;

for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );

SQLMSG[++i] = '\0';

SQLSTATE[5]='\0';

printf( "SQLMSG:%s\n" , SQLMSG );

printf( "SQLSTATE:%s\n" , SQLSTATE );

return;

}

A.10 マルチスレッド環境で動作するアプリケーションの例

マルチスレッド環境で動作するアプリケーションの例を以下に示します。

スレッドを2つ起動し、並列で動作する例です。

以下の例に示したアプリケーションを動作させるためには、コンパイル・リンク時のコマンドのオプションに-DNTを指定し

てください。

以下の例に示したアプリケーションを動作させるためには、コンパイル・リンク時のコマンドのオプションに-DLinuxを指定

してください。

#if defined(NT)

#include <windows.h>

#else

#if defined(Linux)

#include <stdio.h>

#include <pthread.h>

#else

#include <stdio.h>

#include <thread.h>

#endif

#endif

#include "sqlrdbei.h"

#define SQL_STATEMENT1 \

"SELECT WISTRU1 FROM SI_SCHM1.SI_TABLE WHERE WIUNQU1=1" …… (1)

void* sub_threadA(void *); …… (2)

void* sub_threadB(void *);

int main(void)

{

SQLRETURN ret =0;

SQLHDBS ses_id =0;

SQLHDBS ses_id2=0;

#if defined(NT)

unsigned long t_threadA;

unsigned long t_threadB;

HANDLE thread_tbl[2];

#else

#if defined(Linux)

pthread_t t_threadA;

pthread_t t_threadB;

#else

thread_t t_threadA;

thread_t t_threadB;

thread_t ret_threadA;

thread_t ret_threadB;

#endif

#endif

- 296 -

ret = SQLThrAllocID( &ses_id ); …… (3)

if ( ret != SQLRDB_NORMAL ) {

printf( "SQLThrAllocID(code) = %d\n" , ret );

return 1;

}

ret = SQLThrAllocID( &ses_id2 );

if ( ret != SQLRDB_NORMAL ) {

printf( "SQLThrAllocID(code) = %d\n" , ret );

ret = SQLThrFreeID( ses_id );

return 1;

}

#if defined(NT)

t_threadA = (unsigned long)_beginthread( sub_threadA, 0, &ses_id); …… (4)

thread_tbl[0] = (HANDLE)t_threadA;

t_threadB = (unsigned long)_beginthread( sub_threadB, 0, &ses_id2);

thread_tbl[1] = (HANDLE)t_threadB;

WaitForMultipleObjects( 1, thread_tbl, TRUE, INFINITE ); …… (5)

#else

#if defined(Linux)

pthread_create(&t_threadA, NULL, sub_threadA, (void *)&ses_id ); …… (4)

pthread_create(&t_threadB, NULL, sub_threadB, (void *)&ses_id2);

pthread_join(t_threadA, NULL); …… (5)

pthread_join(t_threadB, NULL);

#else

thr_create(NULL, 0, sub_threadA, (void *)&ses_id, THR_BOUND, &t_threadA); …… (4)

thr_create(NULL, 0, sub_threadB, (void *)&ses_id2, THR_BOUND, &t_threadB);

thr_join(t_threadA, &ret_threadA, NULL); …… (5)

thr_join(t_threadB, &ret_threadB, NULL);

#endif

#endif

ret = SQLThrFreeID( ses_id ); …… (6)

ret = SQLThrFreeID( ses_id2 );

return 0;

}

(1) 実行するSQL文を定義します。

(2) スレッド(サブプロセス)の関数を宣言します。

(3) セションを作成します。セションを作成する関数を実行することによって、セションIDを受け取ります。

(4) スレッドを作成して、sub_threadAおよびsub_threadBを実行します。

(5) sub_threadAおよびsub_threadBの両方の処理が終了してからセションを破棄するように制御します。

(6) セションを破棄します。

void* sub_threadA(void *ses_id_p)

{

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6]; …… (1)

char SQLMSG[256];

VARCHAR statement[256];

char dataA[53];

EXEC SQL END DECLARE SECTION;

SQLHDBS ses_id = *(SQLHDBS *)ses_id_p;

SQLRETURN ret=0;

memset(SQLSTATE, 0x00, 6);

memset(SQLMSG, 0x00, 256);

- 297 -

memset(dataA, 0x00, 53);

ret = SQLThrStartID( ses_id ); …… (2)

if ( ret != SQLRDB_NORMAL ) {

printf( "SQLThrStartID(code) = %d\n" , ret );

return 0;

}

EXEC SQL DECLARE CU1 CURSOR FOR CMD1; …… (3)

EXEC SQL WHENEVER SQLERROR GO TO :CONNECT_ERROR;

EXEC SQL CONNECT TO DEFAULT; …… (4)

printf( "CONNECT(SQLSTATE) = %s\n" , SQLSTATE );

printf( "CONNECT(SQLMSG) = %s\n" , SQLMSG );

EXEC SQL WHENEVER SQLERROR CONTINUE;

strcpy( statement.sqlvar, SQL_STATEMENT1 );

statement.sqllen = strlen( statement.sqlvar );

EXEC SQL PREPARE CMD1 FROM :statement;

printf( "PREPARE(SQLSTATE):%s\n", SQLSTATE );

printf( "PREPARE(SQLMSG):%s\n", SQLMSG );

EXEC SQL OPEN CU1 ; …… (5)

printf( "OPEN(SQLSTATE):%s\n", SQLSTATE );

printf( "OPEN(SQLMSG):%s\n", SQLMSG );

while ( strcmp(SQLSTATE,"00000")==0 ) {

EXEC SQL FETCH CU1 INTO :dataA ; …… (6)

printf( "FETCH(DATA):%s\n", dataA );

printf( "FETCH(SQLSTATE):%s\n", SQLSTATE );

printf( "FETCH(SQLMSG):%s\n", SQLMSG );

}

EXEC SQL CLOSE CU1; …… (7)

printf( "CLOSE(SQLSTATE):%s\n", SQLSTATE );

printf( "CLOSE(SQLMSG):%s\n", SQLMSG );

EXEC SQL DEALLOCATE PREPARE CMD1;

printf( "DEALLO_PREP(SQLSTATE):%s\n", SQLSTATE );

printf( "DEALLO_PREP(SQLMSG):%s\n", SQLMSG );

EXEC SQL COMMIT WORK; …… (8)

printf( "COMMIT(SQLSTATE) = %s\n" , SQLSTATE ) ;

printf( "COMMIT(SQLMSG) = %s\n" , SQLMSG );

EXEC SQL DISCONNECT ALL; …… (9)

printf( "DISCONNECT(SQLSTATE) = %s\n" , SQLSTATE );

printf( "DISCONNECT(SQLMSG) = %s\n" , SQLMSG );

ret = SQLThrEndID( ses_id ); …… (10)

if ( ret != SQLRDB_NORMAL ) {

printf( "SQLThrEndID(code) = %d\n" , ret );

return 0;

}

return 0;

CONNECT_ERROR: …… (11)

printf( "CONNECT(SQLSTATE) = %s\n" , SQLSTATE );

printf( "CONNECT(SQLMSG) = %s\n" , SQLMSG );

ret = SQLThrEndID ( ses_id );

- 298 -

return 0;

}

(1) SQLSTATEとSQLMSGを各スレッドで宣言します。

(2) セションを開始します。セションを開始する関数を実行することにより、セションとスレッド(sub_threadA)が対応付けら

れます。

(3) カーソルを宣言します。

(4) サーバとコネクションを接続します。

(5) カーソルをオープンします。

(6) カーソルを位置づけ、その行を読み込みます。

(7) カーソルをクローズします。

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

(9) サーバとのコネクションを切断します。

(10) セションを終了します。

(11) サーバとのコネクションに失敗した場合は、セションを終了します。

void* sub_threadB(void *ses_id_p)

{

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6]; …… (1)

char SQLMSG[256];

EXEC SQL END DECLARE SECTION;

SQLHDBS ses_id = *(SQLHDBS *)ses_id_p;

SQLRETURN ret=0;

memset(SQLSTATE, 0x00, 6);

memset(SQLMSG, 0x00, 256);

ret = SQLThrStartID( ses_id ); …… (2)

if ( ret != SQLRDB_NORMAL ) {

printf( "SQLThrStartID(code) = %d\n" , ret );

return 0;

}

EXEC SQL WHENEVER SQLERROR GO TO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'SI_DB333'; …… (3)

printf( "CONNECT(SQLSTATE) = %s\n" , SQLSTATE );

printf( "CONNECT(SQLMSG) = %s\n" , SQLMSG );

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL INSERT INTO SI_SCHM1.SI_TABLE2

VALUES(1,1,1,1,1,1,1,1,1,1,'R','DD','BBBB'); …… (4)

printf( "INSERT(SQLSTATE):%s\n", SQLSTATE );

printf( "INSERT(SQLMSG):%s\n", SQLMSG );

EXEC SQL COMMIT WORK; …… (5)

printf( "COMMIT(SQLSTATE) = %s\n" , SQLSTATE ) ;

printf( "COMMIT(SQLMSG) = %s\n" , SQLMSG );

EXEC SQL DISCONNECT ALL; …… (6)

printf( "DISCONNECT(SQLSTATE) = %s\n" , SQLSTATE );

printf( "DISCONNECT(SQLMSG) = %s\n" , SQLMSG );

- 299 -

ret = SQLThrEndID( ses_id ); …… (7)

if ( ret != SQLRDB_NORMAL ) {

printf( "SQLThrEndID(code) = %d\n" , ret );

return 0;

}

return 0;

CONNECT_ERROR: …… (8)

printf( "CONNECT(SQLSTATE) = %s\n" , SQLSTATE );

printf( "CONNECT(SQLMSG) = %s\n" , SQLMSG );

ret = SQLThrEndID( ses_id );

return 0;

}

(1) SQLSTATEとSQLMSGを各スレッドで宣言します。

(2) セションを開始します。セションを開始する関数を実行することにより、セションとスレッド(sub_threadB)が対応付けら

れます。

(3) サーバとコネクションを接続します。

(4) INSERT文を実行して値を挿入します。

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

(6) サーバとのコネクションを切断します。

(7) セションを終了します。

(8) サーバとのコネクションに失敗した場合は、セションを終了します。

マルチスレッド環境で動作するアプリケーションを作成する場合の注意事項

アプリケーションを作成するには、ホスト変数および複数スレッド間の排他などを考慮して、実行したSQL文によるデータ

ベースの検索および更新結果が正しくなるようにしなければなりません。以下に注意点を示します。

・ 状態変数(SQLSTATE)およびメッセージ変数(SQLMSG)は、関数単位に宣言してください。

・ データ操作で使用するホスト変数は、auto変数を使用することを推奨します。extern変数およびstatic変数を使用する

場合は、複数スレッドで共通に使用されるため、排他を考慮したアプリケーションを作成する必要があります。

・ 1つのセションに対して複数のスレッドが存在する場合、各スレッドが同時に動作しないようにしてください。セマフォ

を利用するなどして排他制御を考慮し、アプリケーションを作成してください。

・ セションを破棄する前には、必ずDISCONNECT文を実行してください。

・ マルチスレッド環境でアプリケーションを実行する場合も、トランザクション単位にSymfoware/RDBで排他制御を行い

ます。また、カーソル操作についても、カーソルをオープンした後に、単一コネクションにおける複数のスレッド間で

は同じカーソルを操作できますが、複数のコネクションにまたがって同じカーソルを操作することはできません。

状態変数およびメッセージ変数の宣言については、“2.7 名前の一意性と有効範囲”を参照してください。

A.11 コールバック機能の利用例

コールバック機能の利用例を以下に示します。

SQL文の実行時間が5秒以上であった場合、または、SQL文の実行エラーが発生した場合に、出口コールバック関数を

使用して、標準出力に情報を出力します。

- 300 -

・ コールバック関数を動的ライブラリを使用して登録しています。

・ シングルスレッド環境で動作するアプリケーションでコールバック関数を使用して登録しています。

上記のコールバック関数と実行結果を以下に示します。

コールバック関数 dynscb.c

/* libdynscb.so */

#include<stdio.h>

#include<sys/time.h>

#include"sqlrdbei.h"

/* コールバック関数の動的登録関数宣言 */

/* コールバック関数のプロトタイプ */

SQLRETURN CFEntry1( SQLHDBS, char *, char *, void *, SQLCALL_T * );

SQLRETURN CFEntry2( SQLHDBS, char *, char *, void *, SQLCALL_T * );

struct timeval start_tv,end_tv;

/* コールバック関数の動的登録 */

SQLRETURN SQLDynSetCallback( SQLHDBS sid )

{

SQLRETURN ret;

short kind_list[14];

/* コールバック関数の登録 */

kind_list[0] = (short)SQLRDB_CF_SELECT;

kind_list[1] = (short)SQLRDB_CF_DELETE_SEARCH;

kind_list[2] = (short)SQLRDB_CF_UPDATE_SEARCH;

kind_list[3] = (short)SQLRDB_CF_DELETE_POSITION;

kind_list[4] = (short)SQLRDB_CF_UPDATE_POSITION;

kind_list[5] = (short)SQLRDB_CF_INSERT;

kind_list[6] = (short)SQLRDB_CF_OPEN;

kind_list[7] = (short)SQLRDB_CF_FETCH;

kind_list[8] = (short)SQLRDB_CF_CLOSE;

kind_list[9] = (short)SQLRDB_CF_CALL;

kind_list[10] = (short)SQLRDB_CF_COMMIT;

kind_list[11] = (short)SQLRDB_CF_CONNECT;

kind_list[12] = (short)SQLRDB_CF_DISCONNECT;

kind_list[13] = 0;

ret = SQLSetCallback(sid,CFEntry1,NULL,kind_list,SQLRDB_CALL_IN);

if( ret != SQLRDB_NORMAL ){

return( ret );

}

ret = SQLSetCallback(sid,CFEntry2,NULL,kind_list,SQLRDB_CALL_OUT);

- 301 -

if( ret != SQLRDB_NORMAL){

return( ret );

}

return( SQLRDB_NORMAL);

}

/* 入口コールバック関数 CFEntry1 */

SQLRETURN CFEntry1(SQLHDBS sid,

char *SQLSTATE,

char *SQLMSG,

void *user_area,

SQLCALL_T *SQLDATA)

{

/* 開始時刻の取得 */

gettimeofday(&start_tv,NULL);

return(SQLRDB_CONTINUE);

}

/* 出口コールバック関数 CFEntry2 */

SQLRETURN CFEntry2(SQLHDBS sid,

char *SQLSTATE,

char *SQLMSG,

void *user_area,

SQLCALL_T *SQLDATA)

{

long exec_sec,exec_usec;

/* 終了時刻の取得 */

gettimeofday(&end_tv,NULL);

/* 実行時間の計算 */

exec_sec = end_tv.tv_sec - start_tv.tv_sec;

exec_usec = end_tv.tv_usec - start_tv.tv_usec;

if(exec_usec<0){

exec_sec--;

exec_usec += 1000000;

}

/* エラーが発生した場合 */

if((memcmp(SQLSTATE,"00",2)!=0) &&

(memcmp(SQLSTATE,"01",2)!=0) &&

(memcmp(SQLSTATE,"02",2)!=0)){

printf("<<ERROR>>\n");

printf("APPLICATION: %s\n" , SQLDATA->application);

printf("LINE : %ld\n", SQLDATA->sql_line);

printf("SQL : %s\n" , SQLDATA->sql_stmt);

if(SQLMSG != NULL){

printf("SQLSTATE : %s\n" , SQLSTATE);

printf("SQLMSG : %s\n" , SQLMSG);

}

printf("EXEC TIME : %ld.%06ld\n" , exec_sec , exec_usec);

printf("\n");

}

/* 実行時間が5秒以上であった場合 */

else if(exec_sec >= 5){

printf("<<TIME-OVER>>\n");

printf("APPLICATION: %s\n" , SQLDATA->application);

printf("LINE : %ld\n", SQLDATA->sql_line);

printf("SQL : %s\n" , SQLDATA->sql_stmt);

printf("EXEC TIME : %ld.%06ld\n" , exec_sec , exec_usec);

printf("\n");

}

- 302 -

return(SQLRDB_CONTINUE);

}

実行結果

<<ERROR>>

APPLICATION: sample

LINE : 17

SQL : UPDATE SCHEMA1.TABLE1 SET COL01=1,COL02=2 WHERE COL01=1

SQLSTATE : 40001

SQLMSG : JYP2099E デッドロックが発生しました.

EXEC_TIME : 0.000121

<<TIME-OVER>>

APPLICATION: sample

LINE : 23

SQL : DELETE FROM SCHEMA1.TABLE1 WHERE COL01<10

EXEC_TIME : 6.000239

コールバック関数 dynscb.c

/* dynscb.dll */

#include<stdio.h>

#include<windows.h>

#include"sqlrdbei.h"

/* コールバック関数の動的登録関数宣言 */

/* コールバック関数のプロトタイプ */

SQLRETURN CFEntry1( SQLHDBS, char *, char *, void *, SQLCALL_T *);

SQLRETURN CFEntry2( SQLHDBS, char *, char *, void *, SQLCALL_T *);

unsigned long start_tv,end_tv;

/* コールバック関数の動的登録 */

SQLRETURN SQLDynSetCallback( SQLHDBS sid )

{

SQLRETURN ret;

short kind_list[14];

/* コールバック関数の登録 */

kind_list[0] = (short)SQLRDB_CF_SELECT;

kind_list[1] = (short)SQLRDB_CF_DELETE_SEARCH;

kind_list[2] = (short)SQLRDB_CF_UPDATE_SEARCH;

kind_list[3] = (short)SQLRDB_CF_DELETE_POSITION;

kind_list[4] = (short)SQLRDB_CF_UPDATE_POSITION;

kind_list[5] = (short)SQLRDB_CF_INSERT;

kind_list[6] = (short)SQLRDB_CF_OPEN;

kind_list[7] = (short)SQLRDB_CF_FETCH;

kind_list[8] = (short)SQLRDB_CF_CLOSE;

kind_list[9] = (short)SQLRDB_CF_CALL;

kind_list[10] = (short)SQLRDB_CF_COMMIT;

kind_list[11] = (short)SQLRDB_CF_CONNECT;

kind_list[12] = (short)SQLRDB_CF_DISCONNECT;

kind_list[13] = 0;

ret = SQLSetCallback(sid,CFEntry1,NULL,kind_list,SQLRDB_CALL_IN);

if( ret != SQLRDB_NORMAL){

return( ret );

}

ret = SQLSetCallback(sid,CFEntry2,NULL,kind_list,SQLRDB_CALL_OUT);

if( ret != SQLRDB_NORMAL){

return( ret );

- 303 -

}

return( SQLRDB_NORMAL );

}

/* 入口コールバック関数 CFEntry1 */

SQLRETURN CFEntry1(SQLHDBS sid,

char *SQLSTATE,

char *SQLMSG,

void *user_area,

SQLCALL_T *SQLDATA)

{

/* 開始時刻の取得 */

start_tv = GetTickCount();

return(SQLRDB_CONTINUE);

}

/* 出口コールバック関数 CFEntry2 */

SQLRETURN CFEntry2(SQLHDBS sid,

char *SQLSTATE,

char *SQLMSG,

void *user_area,

SQLCALL_T *SQLDATA)

{

long exec_sec,exec_msec;

/* 終了時刻の取得 */

end_tv = GetTickCount();

/* 実行時間の計算 */

exec_sec = (end_tv-start_tv)/1000;

exec_msec= (end_tv-start_tv)%1000;

/* エラーが発生した場合 */

if((memcmp(SQLSTATE,"00",2)!=0) &&

(memcmp(SQLSTATE,"01",2)!=0) &&

(memcmp(SQLSTATE,"02",2)!=0)){

printf("<<ERROR>>\n");

printf("APPLICATION:%s\n" , SQLDATA->application);

printf("LINE :%ld\n" , SQLDATA->sql_line);

printf("SQL :%s\n" , SQLDATA->sql_stmt);

if(SQLMSG != NULL){

printf("SQLSTATE : %s\n" , SQLSTATE);

printf("SQLMSG : %s\n" , SQLMSG);

}

printf("EXEC TIME :%ld.%03ld\n" , exec_sec , exec_msec);

printf("\n");

}

/* 実行時間が5秒以上かかった場合 */

else if(exec_sec >=5){

printf("<<TIME-OVER>>\n");

printf("APPLICATION: %s\n" , SQLDATA->application);

printf("LINE : %ld\n", SQLDATA->sql_line);

printf("SQL : %s\n" , SQLDATA->sql_stmt);

printf("EXEC TIME : %ld.%03ld\n" , exec_sec , exec_msec);

printf("\n");

}

return(SQLRDB_CONTINUE);

}

実行結果

<<ERROR>>

APPLICATION: sample

- 304 -

LINE : 17

SQL : UPDATE SCHEMA1.TABLE1 SET COL01=1,COL02=2 WHERE COL01=1

SQLSTATE : 40001

SQLMSG : JYP2099E デッドロックが発生しました.

EXEC_TIME : 0.078

<<TIME-OVER>>

APPLICATION: sample

LINE : 23

SQL : DELETE FROM SCHEMA1.TABLE1 WHERE COL01<10;

EXEC_TIME : 13.125

A.12 状態変数およびメッセージ変数の使用例

状態変数とメッセージ変数を使用し、SQL文の実行結果を確認するサンプルプログラムを以下に示します。サンプルプ

ログラムには、SQL文実行時にエラーが発生した場合の処理を記述しています。

例1

状態変数およびメッセージ変数の内容をチェックし、エラーが発生している場合はSQLSTATE値およびメッセージを

出力する例

#include<stdio.h>

#include<string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

short number;

struct {

long num;

char name[21];

char atta[41];

short year;

} data;

EXEC SQL END DECLARE SECTION;

main(void){

memset( SQLSTATE, '\0' , 6 );

memset( SQLMSG, '\0' , 256 );

EXEC SQL CONNECT TO 'DB01';

if ( strcmp( SQLSTATE, "00000" ) != 0 ) {

printf( "SQLSTATE %s\n", SQLSTATE );

printf( "SQLMSG %s\n", SQLMSG );

}

number = 1;

/* データの取得 */

EXEC SQL SELECT COL01, COL02, COL03, COL04 INTO :data

FROM SCH01.TBL01

WHERE NUMBER = :number;

if ( strcmp( SQLSTATE, "00000" ) != 0 ) {

printf( "SQLSTATE %s\n", SQLSTATE );

printf( "SQLMSG %s\n", SQLMSG );

}

printf( "COL1=%d\n", data.num );

printf( "COL2=%s\n", data.name );

printf( "COL3=%s\n", data.atta );

printf( "COL4=%d\n", data.year );

- 305 -

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

return 1;

}

例2

WHENEVER文を使用し、SQL文の実行時にエラーが発生した場合、SQLSTATE値およびメッセージを出力する例

#include<stdio.h>

#include<string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

short number;

struct {

long num;

char name[21];

char atta[41];

short year;

} data;

EXEC SQL END DECLARE SECTION;

main(void){

memset( SQLSTATE, '\0' , 6 );

memset( SQLMSG, '\0' , 256 );

EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'DB01';

EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;

EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR;

number = 1;

/* データの取得 */

EXEC SQL SELECT COL01, COL02, COL03, COL04 INTO :data

FROM SCH01.TBL01

WHERE NUMBER = :number;

printf( "COL1=%d\n", data.num );

printf( "COL2=%s\n", data.name );

printf( "COL3=%s\n", data.atta );

printf( "COL4=%d\n", data.year );

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

return 1;

STM_ERROR:

printf( "SQLSTATE %s\n", SQLSTATE );

printf( "SQLMSG %s\n", SQLMSG );

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

return 1;

- 306 -

NOT_FOUND_ERROR:

printf( "SQLSTATE %s\n", SQLSTATE );

printf( "SQLMSG %s\n", SQLMSG );

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL ROLLBACK WORK;

EXEC SQL DISCONNECT 'DB01';

return 0;

CONNECT_ERROR:

printf( "SQLSTATE %s\n", SQLSTATE );

printf( "SQLMSG %s\n", SQLMSG );

return 1;

}

A.13 拡張カーソルを使用したカーソル操作の使用例

拡張カーソルを使用したカーソル操作の使用例を以下に示します。

#include<stdio.h>

#include<string.h>

EXEC SQL BEGIN DECLARE SECTION;

char SQLSTATE[6];

char SQLMSG[256];

VARCHAR strsql[100];

VARCHAR cmd[100];

VARCHAR cur[100];

VARCHAR country[100];

short loop;

EXEC SQL END DECLARE SECTION;

#define MAX_COUNTRY 100

#define SQL_NUM 10

void putmsgx(void);

main( void ){

char data[SQL_NUM][100] = {

"SELECT COUNTRY FROM SCH.TBL00",

"SELECT COUNTRY FROM SCH.TBL01",

"SELECT COUNTRY FROM SCH.TBL02",

"SELECT COUNTRY FROM SCH.TBL03",

"SELECT COUNTRY FROM SCH.TBL04",

"SELECT COUNTRY FROM SCH.TBL05",

"SELECT COUNTRY FROM SCH.TBL06",

"SELECT COUNTRY FROM SCH.TBL07",

"SELECT COUNTRY FROM SCH.TBL08",

"SELECT COUNTRY FROM SCH.TBL09"};

char work_area[10];

char indata[10];

EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;

EXEC SQL CONNECT TO 'DB01';

EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;

for ( loop=0; loop<SQL_NUM; loop++ ) {

- 307 -

strcpy( (char *)strsql.sqlvar, (char *)data[loop] );

strsql.sqllen = strlen(strsql.sqlvar);

sprintf( cmd.sqlvar, "CMD%d", loop );

cmd.sqllen = strlen(cmd.sqlvar);

sprintf( cur.sqlvar, "CUR%d", loop );

cur.sqllen = strlen(cur.sqlvar);

EXEC SQL PREPARE :cmd FROM :strsql;

EXEC SQL ALLOCATE :cur CURSOR FOR :cmd;

}

EXEC SQL WHENEVER NOT FOUND GOTO :NODATA;

for(;;){

printf( "何番目の表のデータを表示するか入力してください (0-9)>> " );

fgets( indata, 10, stdin );

printf("\n");

if( ( indata[0] < '0' ) || ( '9' < indata[0] ) ){

printf( "入力されたデータに誤りがあります\n" );

continue;

}

sprintf( cur.sqlvar, "CUR%c", indata[0] );

cur.sqllen = strlen(cur.sqlvar);

EXEC SQL OPEN :cur;

for(loop=1;;loop++){

EXEC SQL FETCH :cur INTO :country;

country.sqlvar[country.sqllen] = '\0';

printf("%d件目の国名は%sです.\n", loop, country.sqlvar );

}

NODATA:

EXEC SQL CLOSE :cur;

EXEC SQL COMMIT WORK;

printf("終了しますか?(Y/y) >>");

fgets( indata, 10, stdin );

printf("\n");

if(indata[0]=='Y' || indata[0]=='y'){

break;

}

}

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

return 0;

NOT_FOUND_ERROR:

STM_ERROR:

putmsgx();

EXEC SQL WHENEVER SQLERROR CONTINUE;

EXEC SQL COMMIT WORK;

EXEC SQL DISCONNECT 'DB01';

return 1;

CONNECT_ERROR:

putmsgx();

return 1;

}

- 308 -

void putmsgx( void ) {

int i;

for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );

SQLMSG[++i] = '\0';

SQLSTATE[5]='\0';

printf( "SQLMSG:%s\n" , SQLMSG );

printf( "SQLSTATE:%s\n" , SQLSTATE );

return;

}

- 309 -

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

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

B.1 可変長文字列のデータ操作例

ここでは、可変長文字列データをCOBOLプログラムのホスト変数で操作するプログラミング例を説明します。可変長文字

列データを操作する場合は、文字列の長さが必要です。このため、データ操作を行うホスト変数は、可変長文字列の長

さをもつ符号付き2進項目と、文字列自身をもつ英数字項目からなる集団項目の形式で定義します。

また、日本語可変長文字列のデータ操作も同様に行えます。

図B.1 可変長文字列のデータ操作の例にプログラムの処理概要を示します。

図B.1 可変長文字列のデータ操作の例

(1) 電話番号の市外局番を、ホスト変数の可変長文字列に対話で入力します。

(2) CONNECT文により、データベース“DB01”の存在するサーバとコネクションを接続します。

(3) カーソル操作により、取引先会社表から入力された市外局番に該当する取引先会社のデータを検索します。

(4) 取引先会社のデータを出力します。

(5) DISCONNECT文により、データベース“DB01”の存在するサーバとコネクションを切断します。

以下にプログラミング例を示します。

000010 IDENTIFICATION DIVISION.

000020 PROGRAM-ID. SAMPLE3.

000030 ENVIRONMENT DIVISION.

000040 CONFIGURATION SECTION.

000050 SPECIAL-NAMES.

000060 CONSOLE IS CONS.

000070 DATA DIVISION.

000080 WORKING-STORAGE SECTION.

000090*

000100 EXEC SQL BEGIN DECLARE SECTION END-EXEC.

000110 01 SQLSTATE PIC X(5).

000120 01 SQLMSG PIC X(255).

000130 01 HCOMPWORD. …… (1)

000140 49 HCOMP-L PIC S9(4) BINARY.

000150 49 HCOMP-D PIC X(12).

000160 01 HNUMBER PIC S9(9) BINARY.

000170 01 HCOMPANY PIC N(10).

000180 01 HTELNUMBER PIC X(12).

000190 01 HLOCATION PIC N(10).

- 310 -

000200 EXEC SQL END DECLARE SECTION END-EXEC.

000210*

000220 01 FLAG1 PIC X.

000230 01 COUNT1 PIC S9(4) BINARY.

000240 01 COUNT2 PIC S9(9) BINARY.

000250 01 WORK PIC X(12).

000260*

000270 PROCEDURE DIVISION.

000280 MAIN SECTION.

000290 EXEC SQL DECLARE 取引先会社 TABLE ON BUSINESS END-EXEC. …… (2)

000300 EXEC SQL DECLARE CSR1 CURSOR FOR …… (3)

000310 SELECT * FROM 取引先会社

000320 WHERE 電話番号 LIKE :HCOMPWORD END-EXEC.

000330 DISPLAY " 入力された市外局番に該当する取引先会社のデータを"

000340 " 取り出します.".

000350 GET-TELNO.

000360 DISPLAY " 市外局番を入力してください >> ".

000370 ACCEPT HCOMP-D FROM CONS. …… (4)

000380 DISPLAY " 市外局番" HCOMP-D UPON CONS.

000390 DISPLAY " のデータでよろしいですか?".

000400 DISPLAY " よろしかったら(Y/y)を入力してください >>".

000410 ACCEPT FLAG1.

000420 IF FLAG1 NOT = "Y" AND FLAG1 NOT = "y"

000430 GO TO GET-TELNO

000440 END-IF.

000450 MOVE 0 TO COUNT1.

000460 INSPECT HCOMP-D TALLYING COUNT1 FOR CHARACTERS BEFORE SPACE.

000470 MOVE COUNT1 TO HCOMP-L. …… (5)

000480 STRING HCOMP-D "%" DELIMITED BY SPACE INTO WORK. …… (6)

000490 MOVE WORK TO HCOMP-D. …… (7)

000500 ADD 1 TO HCOMP-L. …… (8)

000510 EXEC SQL WHENEVER SQLERROR GOTO :CONNECT-ERROR END-EXEC.

000520 EXEC SQL CONNECT TO 'DB01' END-EXEC. …… (9)

000530 EXEC SQL WHENEVER SQLERROR GOTO :STM-ERROR END-EXEC.

000540 EXEC SQL WHENEVER NOT FOUND GOTO :NOT-FOUND-ERROR END-EXEC.

000550 EXEC SQL OPEN CSR1 END-EXEC. …… (10)

000560 MOVE 0 TO COUNT2.

000570 FETCH-CURSOR.

000580 EXEC SQL FETCH CSR1 …… (11)

000590 INTO :HNUMBER,:HCOMPANY,:HTELNUMBER,:HLOCATION END-EXEC.

000600 ADD 1 TO COUNT2.

000610 DISPLAY " 取引先番号 会社名 電話番号 所在地".

000620 DISPLAY HNUMBER " " HCOMPANY " " HTELNUMBER" " HLOCATION. …… (12)

000630 GO TO FETCH-CURSOR.

000640 NOT-FOUND-ERROR.

000650 IF COUNT2 NOT = 0 DISPLAY " 該当データは" COUNT2 "件です." …… (13)

000660 ELSE DISPLAY " 該当データなし"

000670 END-IF.

000680 EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.

000690 EXEC SQL ROLLBACK WORK END-EXEC. …… (14)

000700 EXEC SQL DISCONNECT 'DB01' END-EXEC. …… (15)

000710 MOVE 0 TO PROGRAM-STATUS.

000720 EXIT PROGRAM.

000730 STM-ERROR.

000740 EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.

000750 EXEC SQL ROLLBACK WORK END-EXEC. …… (16)

000760 EXEC SQL DISCONNECT 'DB01' END-EXEC. …… (17)

000770 EXIT PROGRAM.

000780 CONNECT-ERROR.

000790 DISPLAY "SQLSTATE :" SQLSTATE. …… (18)

000800 DISPLAY "SQLMSG : " SQLMSG. …… (19)

000810 EXIT PROGRAM.

- 311 -

(1) 市外局番を可変長文字列のホスト変数として定義します。

(2) 取引先会社を表宣言します。

(3) 取引先会社表のすべての列に対するカーソル“CSR1”を宣言します。

(4) 市外局番を対話入力します。市外局番は、可変長文字列データ用のホスト変数である集団項目“HCOMPWORD”

の文字データ部“HCOMP-D”に入力します。

(5)~(8) 入力した市外局番の長さを、可変長文字列データ用のホスト変数である集団項目“HCOMPWORD”の長さ部

“HCOMP-L”に設定します。

(9) データベース“DB01”の存在するサーバとコネクションを接続します。

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

(11) 入力した市外局番と等しい市外局番の行にカーソルを位置づけ、その行を読み込みます。

(12) 読み込んだ行を表示します。

(13) 取引先会社表のデータがAT-ENDの場合は、検索結果を表示します。

(14) トランザクションをROLLBACK文により終了します。

(15) データベース“DB01”の存在するサーバとのコネクションを切断します。

(16) SQLの実行でエラーが発生した場合は、トランザクションをROLLBACK文により終了します。

(17) データベース“DB01”の存在するサーバとのコネクションを切断します。

(18) コネクションでエラーの場合は、SQLSTATEの内容を表示します。

(19) コネクションでエラーの場合は、SQLMSGの内容を表示します。

B.2 マルチスレッド環境で動作するアプリケーションの例

マルチスレッド環境で動作するアプリケーションの例を以下に示します。

以下の例におけるスレッドは、すでに他のアプリケーションで起動されているものとします。

000010 @OPTIONS ALPHAL(WORD)

000020 IDENTIFICATION DIVISION.

000030 PROGRAM-ID. sub_threadB.

000040 ENVIRONMENT DIVISION.

000050 DATA DIVISION.

000060 WORKING-STORAGE SECTION.

000070 EXEC SQL BEGIN DECLARE SECTION END-EXEC.

000080 01 SQLSTATE PIC X(5). …… (1)

000090 01 SQLMSG PIC X(255).

000100 EXEC SQL END DECLARE SECTION END-EXEC.

000110 01 ret PIC S9(4) BINARY.

000120 LINKAGE SECTION.

000130 01 ses_id PIC S9(9) COMP-5.

000140 PROCEDURE DIVISION USING ses_id.

000150

000160 INITIALIZE SQLSTATE.

000170 INITIALIZE SQLMSG.

000180

000190 CALL "SQLThrStartID" USING BY VALUE ses_id RETURNING ret. …… (2)

000200 IF ret NOT = 0 THEN

000210 DISPLAY "SQLThrStartIDエラー"

000220 EXIT PROGRAM

000230 END-IF.

000240

000250 EXEC SQL WHENEVER SQLERROR GO TO :CONNECT_ERROR END-EXEC.

000260 EXEC SQL

000270 CONNECT TO 'SI_DB333' …… (3)

000280 END-EXEC.

000290 DISPLAY "CONNECT(SQLSTATE) = " SQLSTATE.

- 312 -

000300 DISPLAY "CONNECT(SQLMSG) = " SQLMSG.

000310

000320 EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.

000330

000340 EXEC SQL

000350 INSERT INTO SI_SCHM1.SI_TABLE2 …… (4)

000360 VALUES(1,1,1,1,1,1,1,1,1,1,'R','DD','BBBB')

000370 END-EXEC.

000380 DISPLAY "INSERT(SQLSTATE) = " SQLSTATE.

000390 DISPLAY "INSERT(SQLMSG) = " SQLMSG.

000400

000410 EXEC SQL

000420 COMMIT WORK …… (5)

000430 END-EXEC.

000440 DISPLAY "COMMIT(SQLSTATE) = " SQLSTATE.

000450 DISPLAY "COMMIT(SQLMSG) = " SQLMSG.

000460

000470 EXEC SQL

000480 DISCONNECT ALL …… (6)

000490 END-EXEC.

000500 DISPLAY "DISCONNECT(SQLSTATE) = " SQLSTATE.

000510 DISPLAY "DISCONNECT(SQLMSG) = " SQLMSG.

000520

000530 CALL "SQLThrEndID" USING BY VALUE ses_id RETURNING ret. …… (7)

000540 IF ret = 0 THEN

000550 DISPLAY "SQLThrEndIDエラー"

000560 EXIT PROGRAM

000570 END-IF.

000580

000590 EXIT PROGRAM.

000600

000610 CONNECT_ERROR. …… (8)

000620 DISPLAY "CONNECT(SQLSTATE) = " SQLSTATE.

000630 DISPLAY "CONNECT(SQLMSG) = " SQLMSG.

000640 CALL "SQLThrEndID" USING BY VALUE ses_id RETURNING ret.

000650 EXIT PROGRAM.

(1) SQLSTATEとSQLMSGを宣言します。

(2) セションを開始します。セションを開始する関数を実行することにより、セションとスレッド(sub_threadB)が対応付けら

れます。

(3) サーバとコネクションを接続します。

(4) INSERT文を実行して値を挿入します。

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

(6) サーバとのコネクションを切断します。

(7) セションを終了します。

(8) サーバとのコネクションに失敗した場合は、セションを終了します。

マルチスレッド環境で動作するアプリケーションを作成する場合の注意事項

アプリケーションを作成するには、複数スレッド間の排他などを考慮して、実行したSQL文によるデータベースの検索お

よび更新結果が正しくなるようにしなければなりません。以下に注意点を示します。

・ 1つのセションに対して複数のスレッドが存在する場合、各スレッドが同時に動作しないようにしてください。セマフォ

を利用するなどして排他制御を考慮し、アプリケーションの作成者が責任をもって対処してください。

・ セションを破棄する前には、必ずDISCONNECT文を実行してください。

・ マルチスレッド環境でアプリケーションを実行する場合も、トランザクション単位にSymfoware/RDBで排他制御を行い

ます。また、カーソル操作についても、カーソルをオープンした後に、単一コネクションにおける複数のスレッド間で

は同じカーソルを操作できますが、複数のコネクションにまたがって同じカーソルを操作することはできません。

- 313 -

B.3 集団項目の使用例

集団項目ホスト変数を使用したサンプルプログラムを以下に示します。

集団項目ホスト変数の詳細については、“3.2.7 集団項目ホスト変数の記述方法”を参照してください。

000010 IDENTIFICATION DIVISION.

000020 PROGRAM-ID. COBTHD1.

000030 DATA DIVISION.

000040 WORKING-STORAGE SECTION.

000050 EXEC SQL BEGIN DECLARE SECTION END-EXEC.

000060 01 SQLSTATE PIC X(5).

000070 01 SQLMSG PIC X(255).

000080 01 G1.

000090 02 HOST1 PIC S9(4) BINARY.

000100 02 HOST2 PIC N(10).

000110 02 HOST3 PIC S9(9) BINARY.

000120 02 HOST4 PIC S9(4) BINARY.

000130 01 G2.

000140 02 IND PIC S9(4) BINARY OCCURS 4.

000150 EXEC SQL END DECLARE SECTION END-EXEC.

000160

000170 PROCEDURE DIVISION.

000180 INITIALIZE SQLSTATE.

000190 INITIALIZE SQLMSG.

000200 INITIALIZE G1.

000210 INITIALIZE G2.

000220*

000230*

000240* CONNECT

000250 DISPLAY "CONNECT TO DEFAULT"

000260 EXEC SQL

000270 CONNECT TO DEFAULT

000280 END-EXEC.

000290*

000300 EXEC SQL

000310 SELECT COL01, COL02, COL03, COL04

000320 INTO :G1 :G2

000330 FROM SCH.TBL

000340 WHERE COL = 100

000350 END-EXEC.

000360*

000370 DISPLAY "COL1=" HOST1.

000380 DISPLAY "IND= " IND(1).

000390 DISPLAY "COL2=" HOST2.

000400 DISPLAY "IND= " IND(2).

000410 DISPLAY "COL3=" HOST3.

000420 DISPLAY "IND= " IND(3).

000430 DISPLAY "COL4=" HOST4.

000440 DISPLAY "IND= " IND(4).

000450*

000460* DISCONNECT

000470 EXEC SQL

000480 DISCONNECT DEFAULT

000490 END-EXEC.

000500*

000510 EXIT PROGRAM.

B.4 状態変数およびメッセージ変数の使用例

状態変数とメッセージ変数を使用し、SQL文の実行結果を確認するサンプルプログラムを以下に示します。サンプルプ

ログラムには、SQL文実行時にエラーが発生した場合の処理を記述しています。

- 314 -

例1

状態変数およびメッセージ変数の内容をチェックし、エラーが発生している場合はSQLSTATE値およびメッセージを

出力する例

000010 IDENTIFICATION DIVISION.

000020 PROGRAM-ID. COBTHD1.

000030 DATA DIVISION.

000040 WORKING-STORAGE SECTION.

000050 EXEC SQL BEGIN DECLARE SECTION END-EXEC.

000060 01 SQLSTATE PIC X(5).

000070 01 SQLMSG PIC X(255).

000080 01 DATA1.

000090 02 NUM PIC S9(9) BINARY.

000100 02 NAME PIC X(20).

000110 02 ATTA PIC X(40).

000120 02 YEAR PIC S9(4) BINARY.

000130 EXEC SQL END DECLARE SECTION END-EXEC.

000140

000150 PROCEDURE DIVISION.

000160 INITIALIZE SQLSTATE.

000170 INITIALIZE SQLMSG.

000180 INITIALIZE DATA1.

000190*

000200*

000210* CONNECT

000220 DISPLAY "CONNECT TO DEFAULT"

000230 EXEC SQL

000240 CONNECT TO 'DB1'

000250 END-EXEC.

000260 IF SQLSTATE IS NOT = "00000" THEN

000270 DISPLAY "SQLSTATE " SQLSTATE

000280 DISPLAY "SQLMSG " SQLMSG

000290 END-IF.

000300*

000310 EXEC SQL

000320 SELECT COL01, COL02, COL03, COL04

000330 INTO :DATA1

000340 FROM SCH.TBL

000350 WHERE COL = 100

000360 END-EXEC.

000370 IF SQLSTATE IS NOT = "00000" THEN

000380 DISPLAY "SQLSTATE " SQLSTATE

000390 DISPLAY "SQLMSG " SQLMSG

000400 END-IF.

000410*

000420 DISPLAY "COL1=" NUM.

000430 DISPLAY "COL2=" NAME.

000440 DISPLAY "COL3=" ATTA.

000450 DISPLAY "COL4=" YEAR.

000460*

000470* COMMIT

000480 EXEC SQL

000490 COMMIT WORK

000500 END-EXEC.

000510*

000520* DISCONNECT

000530 EXEC SQL

000540 DISCONNECT DEFAULT

000550 END-EXEC.

000560*

000570 EXIT PROGRAM.

- 315 -

例2

WHENEVER文を使用し、SQL文の実行時にエラーが発生した場合、SQLSTATE値およびメッセージを出力する例

000010 IDENTIFICATION DIVISION.

000020 PROGRAM-ID. COBTHD1.

000030 DATA DIVISION.

000040 WORKING-STORAGE SECTION.

000050 EXEC SQL BEGIN DECLARE SECTION END-EXEC.

000060 01 SQLSTATE PIC X(5).

000070 01 SQLMSG PIC X(255).

000080 01 DATA1.

000090 02 NUM PIC S9(9) BINARY.

000100 02 NAME PIC X(20).

000110 02 ATTA PIC X(40).

000120 02 YEAR PIC S9(4) BINARY.

000130 EXEC SQL END DECLARE SECTION END-EXEC.

000140

000150 PROCEDURE DIVISION.

000160 INITIALIZE SQLSTATE.

000170 INITIALIZE SQLMSG.

000180 INITIALIZE DATA1.

000190*

000200 EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR END-EXEC.

000210*

000220* CONNECT

000230 DISPLAY "CONNECT TO DEFAULT"

000240 EXEC SQL

000250 CONNECT TO 'DB1'

000260 END-EXEC.

000270 EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR END-EXEC.

000280 EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR END-EXEC.

000290*

000300 EXEC SQL

000310 SELECT COL01, COL02, COL03, COL04

000320 INTO :DATA1

000330 FROM SCH.TBL

000340 WHERE COL = 100

000350 END-EXEC.

000360*

000370 DISPLAY "COL1=" NUM.

000380 DISPLAY "COL2=" NAME.

000390 DISPLAY "COL3=" ATTA.

000400 DISPLAY "COL4=" YEAR.

000410*

000420 EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.

000430* COMMIT

000440 EXEC SQL COMMIT WORK END-EXEC.

000450* DISCONNECT

000460 EXEC SQL DISCONNECT DEFAULT END-EXEC.

000470 EXIT PROGRAM.

000480*

000490 STM_ERROR.

000500 DISPLAY "SQLSTATE " SQLSTATE

000510 DISPLAY "SQLMSG " SQLMSG

000520 EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.

000530*

000540* COMMIT

000550 EXEC SQL COMMIT WORK END-EXEC.

000560* DISCONNECT

000570 EXEC SQL DISCONNECT DEFAULT END-EXEC.

000580 EXIT PROGRAM.

000590*

000600 NOT_FOUND_ERROR.

- 316 -

000610 DISPLAY "SQLSTATE " SQLSTATE

000620 DISPLAY "SQLMSG " SQLMSG

000630 EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.

000640*

000650* COMMIT

000660 EXEC SQL COMMIT WORK END-EXEC.

000670* DISCONNECT

000680 EXEC SQL DISCONNECT DEFAULT END-EXEC.

000690 EXIT PROGRAM.

000700

000710 CONNECT_ERROR.

000720 DISPLAY "SQLSTATE " SQLSTATE

000730 DISPLAY "SQLMSG " SQLMSG

000740 EXIT PROGRAM.

B.5 拡張カーソルを使用したカーソル操作の使用例

拡張カーソルを使用したカーソル操作の使用例を以下に示します。

000010 IDENTIFICATION DIVISION.

000020 PROGRAM-ID. DYNCUR.

000030 DATA DIVISION.

000040 WORKING-STORAGE SECTION.

000050*

000060 EXEC SQL BEGIN DECLARE SECTION END-EXEC.

000070 01 SQLSTATE PIC X(5).

000080 01 SQLMSG PIC X(255).

000090 01 STRSQL.

000100 49 STRSQL-L PIC S9(4) BINARY.

000110 49 STRSQL-D PIC X(28).

000120 01 CMD.

000130 49 CMD-L PIC S9(4) BINARY.

000140 49 CMD-D PIC X(5).

000150 01 CUR.

000160 49 CUR-L PIC S9(4) BINARY.

000170 49 CUR-D PIC X(5).

000180 01 COUNTRY.

000190 49 COUNTRY-L PIC S9(4) BINARY.

000200 49 COUNTRY-D PIC X(100).

000210 01 COUNTRY_NUM PIC S9(4) BINARY.

000220 EXEC SQL END DECLARE SECTION END-EXEC.

000230*

000240 01 ENDFLAG PIC X(2).

000250 01 INDATA PIC X(2).

000260 01 INNUM PIC S9(2).

000270 01 LOOP PIC S9(2).

000280*

000290 PROCEDURE DIVISION.

000300*

000310 EXEC SQL WHENEVER SQLERROR GOTO :CONNECT-ERROR END-EXEC.

000320 EXEC SQL WHENEVER NOT FOUND GOTO :NOT-FOUND-ERROR END-EXEC.

000330 EXEC SQL CONNECT TO 'DB01' END-EXEC.

000340*

000350 EXEC SQL WHENEVER SQLERROR GOTO :STM-ERROR END-EXEC.

000360 EXEC SQL WHENEVER NOT FOUND GOTO :NOT-FOUND-ERROR END-EXEC.

000370*

000380 PERFORM TEST BEFORE

000390 VARYING LOOP FROM 0 BY 1

000400 UNTIL LOOP > 9

000410*

000420 MOVE LOOP TO INDATA

000430 STRING "SELECT COUNTRY FROM SCH.TBL" INDATA DELIMITED BY "#"

- 317 -

000440 INTO STRSQL-D

000450 MOVE FUNCTION LENG(STRSQL-D) TO STRSQL-L

000460*

000470 STRING "CMD" INDATA DELIMITED BY "#"

000480 INTO CMD-D

000490 MOVE FUNCTION LENG(CMD-D) TO CMD-L

000500 STRING "CUR" INDATA DELIMITED BY "#"

000510 INTO CUR-D

000520 MOVE FUNCTION LENG(CUR-D) TO CUR-L

000530*

000540 EXEC SQL PREPARE :CMD FROM :STRSQL END-EXEC

000550*

000560 EXEC SQL ALLOCATE :CUR CURSOR FOR :CMD END-EXEC

000570 END-PERFORM.

000580*

000590 EXEC SQL WHENEVER NOT FOUND GOTO :NODATA END-EXEC.

000600*

000610 GET-DATA.

000620 DISPLAY "何番目の表のデータを表示するか入力してください (0-9)>> ".

000630 ACCEPT INNUM.

000640 IF INNUM < 0 AND INNUM > 9

000650 DISPLAY "入力されたデータに誤りがあります"

000660 GO TO GET-DATA

000670 END-IF.

000680*

000690 MOVE INNUM TO INDATA.

000700 STRING "CUR" INDATA DELIMITED BY "#"

000710 INTO CUR-D.

000720 MOVE FUNCTION LENG(CUR-D) TO CUR-L.

000730 EXEC SQL OPEN :CUR END-EXEC.

000740*

000750 PERFORM TEST BEFORE

000760 VARYING COUNTRY_NUM FROM 1 BY 1

000770 UNTIL COUNTRY_NUM < 0

000780 EXEC SQL FETCH :CUR INTO :COUNTRY END-EXEC

000790 DISPLAY COUNTRY_NUM "件目の国名は" COUNTRY-D "です"

000800 END-PERFORM.

000810*

000820 NODATA.

000830 EXEC SQL CLOSE :CUR END-EXEC.

000840 EXEC SQL COMMIT WORK END-EXEC.

000850*

000860 DISPLAY "終了しますか?(Y/y) >>".

000870 ACCEPT ENDFLAG.

000880 IF ENDFLAG NOT = "Y" AND ENDFLAG NOT = "y"

000890 GO TO GET-DATA

000900 END-IF.

000910*

000920 EXEC SQL COMMIT WORK END-EXEC.

000930 EXEC SQL DISCONNECT 'DB01' END-EXEC.

000940*

000950 EXIT PROGRAM.

000960*

000970 NOT-FOUND-ERROR.

000980 STM-ERROR.

000990 DISPLAY "SQLSTATE :" SQLSTATE.

001000 DISPLAY "SQLMSG : " SQLMSG.

001010*

001020 EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.

001030 EXEC SQL COMMIT WORK END-EXEC.

001040 EXEC SQL DISCONNECT 'DB01' END-EXEC.

001050*

001060 EXIT PROGRAM.

- 318 -

001070*

001080 CONNECT-ERROR.

001090 DISPLAY "SQLSTATE :" SQLSTATE.

001100 DISPLAY "SQLMSG : " SQLMSG.

001110 EXIT PROGRAM.

- 319 -

付録C 環境変数

アプリケーションのコンパイル・リンク時および実行時の動作環境のチューニングは、環境変数で指定できます。

アプリケーションのコンパイル・リンク時に指定する環境変数

・ LANG(Solaris/Linuxの場合)

・ RDBDB

・ SQLPC

・ SQLPCOB

・ INCDIR(Solaris/Linuxの場合)

・ INCLUDE(Windows(R)の場合)

アプリケーションの実行時に指定する環境変数

・ LD_LIBRARY_PATH_64(Solarisの場合)

・ LD_LIBRARY_PATH

・ RDBNAME

・ SQLRTENV

このほかに、アプリケーションの動作環境ファイルの実行パラメタに関する環境変数もあります。アプリケーションの動作

環境のチューニングは、主に動作環境ファイルで行いますが、一部の環境については、環境変数で指定することもでき

ます。環境変数に指定するパラメタはrdbuptコマンドおよびrdbunlsqlコマンドでも有効になります。

動作環境のチューニングの優先順位

環境変数による指定と動作環境ファイルによる指定が重複する場合は、環境変数による指定が優先されます。

環境変数による指定を省略した場合は、動作環境ファイルの指定に従います。

環境変数と動作環境ファイルの実行パラメタの対応

環境変数と動作環境ファイルの実行パラメタの対応を以下に示します。

表C.1 アプリケーション実行時に指定する環境変数と動作環境ファイルの実行パラメタの対応

環境変数名 動作環境ファイルの実行パラメタ

RDBCHARSET CHAR_SET

RDBCOREPATH(Windows(R)の場合)

COREFILE_PATH

RDBCSNAME(注) CLUSTER_SERVICE_NAME

RDBDIVTRC DIV_TRACE_FILE

RDBDSI(注) INCLUSION_DSI

RDBDSO(注) DSO_LOCK

RDBLOCK ISOLATION_WAIT

RDBLSQL SQL_LEVEL

RDBMSG MSG_PRINT

RDBNCHAR NCHAR_CODE

RDBOBJTB(注) DEFAULT_OBJECT_TABLE_SIZE

RDBODBIX(注) DEFAULT_INDEX_SIZE

- 320 -

環境変数名 動作環境ファイルの実行パラメタ

RDBODBTB(注) DEFAULT_TABLE_SIZE

RDBODBTY(注) DEFAULT_DSI_TYPE

RDBPSCAN(注) PARALLEL_SCAN

RDBRCVL(注) RCV_MODE

RDBRLOCK R_LOCK

RDBRTRC ROUTINE_SNAP

RDBSIGINF(Solaris/Linuxの場合)

SIGNAL_INF

RDBSETCALLBACK SET_CALLBACK

RDBSMEM SORT_MEM_SIZE

RDBSYDSI(注) DSI_EXPAND_POINT

RDBTRAN TRAN_SPEC

RDBTRC SQL_SNAP

RDBWMEM WORK_MEM_SIZE

RDBWPATH WORK_PATH

注)データベース簡単運用の場合は、指定できません。

各環境変数の指定形式と意味は、以下のとおりです。

LANG

【指定形式】

Solarisの場合

LANG = {ja | ja_JP.eucJP | ja_JP.PCK | ja_JP.UTF-8 | C}

Linuxの場合

LANG = {ja_JP.UTF-8 | C}

【環境変数の意味】

UNIX系システムにおいて、アプリケーションのロケールを指定します。

【パラメタの意味】

指定したロケールからアプリケーションの言語や文字コード系が決まります(下表参照)。具体的には、以下に影響を

与えます。

- アプリケーションのソースコード

- アプリケーションの入出力ファイル

- クライアント用の動作環境ファイル

- SQLメッセージ(SQLMSG)

SQLメッセージは、以下のロケールの強度に従ってロケールが決まります。

(強い)LC_ALL > LC_MESSAGE > LANG(弱い)

Symfoware/RDBは、ロケールの言語がjaで始まる場合は日本語のメッセージを出力し、それ以外のロケール(Cロケー

ルなど)の場合は英語でメッセージを出力します。

- 321 -

表C.2 ロケールと文字コード系の関係

対象OS ロケール 文字コード系

[Solaris] ja EUCコード

ja_JP.eucJP

ja_JP.PCK シフトJISコード

ja_JP.UTF-8 UNICODE

C インストール時の文字コード系が設定され

ます。(注)

[Linux] ja_JP.UTF-8 UNICODE

C インストール時の文字コード系が設定され

ます。(注)

注) アプリケーションのデフォルトの文字コード系は、アプリケーションが動作する環境により決まります。

アプリケーションが動作する環境 アプリケーションのデフォルトの文字コード系

Symfoware/RDBと同一サーバのアプリ

ケーション

データベースの文字コード系

Connection Managerを利用するアプリ

ケーション

Connection Managerインストール時の文字

コード系

クライアント端末のアプリケーション Symfoware Server クライアント機能インス

トール時の文字コード系

RDBCHARSET

【指定形式】

RDBCHARSET = {EUC_S90|EUC_U90|EUC|SJIS|UTF8}

【環境変数の意味】

文字列型のホスト変数、文字列型の動的パラメタ、および、SQLMSGの文字コード系を指定します。この指定は、ア

プリケーションをC言語で記述している場合に有効です。

データベースに格納される文字列型データの文字コード系とRDBCHARSETとの関係を以下に示します。

表C.3 データベースの文字コード系との関係

データベースの文字コード系 RDBCHARSETの指定

EUC_S90 EUC_U90 EUC SJIS UTF8

EUCコードのS90コード ○ × ○ ○

EUCコードのU90コード × ○ ○ ○

シフトJISコード ○ ○ ○ ○

UNICODE ○ ○ ○ ○

○:指定可能

×:指定不可能

【パラメタの意味】

EUC_S90:

ホスト変数内文字列のデータの文字コード系がEUCコードのS90コードの場合に指定します。

- 322 -

EUC_U90またはEUC:

ホスト変数内文字列のデータの文字コード系がEUCコードのU90コードの場合に指定します。EUCは互換として

存在します。

SJIS:

ホスト変数内文字列のデータの文字コード系がシフトJISコードの場合に指定します。

UTF8:

ホスト変数内文字列のデータの文字コード系がUTF-8形式の場合に指定します。

注意

アプリケーションをCOBOLで記述している場合は、本パラメタは無視されます。詳細は、“2.3.1 文字コード系の決定”

を参照してください。

RDBCOREPATH(Windows(R)の場合)

【指定形式】

RDBCOREPATH = 絶対パス名

【環境変数の意味】

アプリケーションまたはRDBコマンドで異常が発生した場合のダンプ出力先ディレクトリを指定します。

【パラメタの意味】

絶対パス名:

ダンプ出力先ディレクトリを指定します。

RDBCSNAME

【指定形式】

RDBCSNAME = クラスタサービス名

【環境変数の意味】

PRIMECLUSTERまたはSafeCLUSTERと連携する場合、アプリケーションが登録されている、クラスタシステム上のク

ラスタサービス名を指定します。

【パラメタの意味】

クラスタサービス名:

PRIMECLUSTERまたはSafeCLUSTERと連携する場合、クラスタシステムに登録されているクラスタサービス名を

記述します。

RDBDIVTRC

【指定形式】

RDBDIVTRC = ({YES | NO})

【環境変数の意味】

複数のアプリケーションが動作する場合、出力ファイル名(SQL_SNAP機能やROUTINE_SNAP機能によって出力さ

れるファイル、および、アクセスプラン情報やSQL性能情報を取得するファイル)の後ろに、プロセスIDなどの情報を

付加して個別のトレース情報を出力するか否かを指定します。

【パラメタの意味】

YES:

出力ファイル名の後に以下の情報を付加して個別のトレース情報を取得します。

- ログイン名

- 323 -

- プロセスID

- セション開始時間

出力ファイル名をsqlsnap.lstとし、ログイン名がtest、プロセスIDが288、セション開始時間が2007年4月16日12時34分56秒であるとした場合、以下のファイルに情報が出力されます。

sqlsnap_test_288_20070416123456.lst

NO:

個別のトレース情報を取得しません。

注意

アプリケーションがマルチスレッド環境で動作する場合は、RDBDIVTRCの指定に関係なく、自動的に以下の情

報を出力ファイル名の後に付加して、個別のトレース情報を出力します。

- ログイン名

- プロセスID

- セションID

- セション開始時間

RDBDSI

【指定形式】

RDBDSI = データベース名.DSI名[,データベース名.DSI名・・・]

【環境変数の意味】

アプリケーションで、DSIを限定したい表のDSI名を指定します。

アプリケーションでは、限定されたDSIを含む表に対しては、そのDSIだけがデータ操作の範囲となります。また、本実

行パラメタの指定により、アプリケーション中での探索条件の記述が省略できます。なお、アプリケーションでDSIを限

定していない表に対しては、データ操作をすることができます。

【パラメタの意味】

データベース名.DSI名:

DSIを限定したい表のDSI名を指定します。

RDBDSO

【指定形式】

RDBDSO = DSO名[/[P][占有モード]][,DSO名[/[P][占有モード]]・・・]

【環境変数の意味】

アプリケーションで使用するDSOおよびその占有の単位、占有モードを指定します。RDBDSOが指定された場合、

SET TRANSACTION 文 、 ク ラ イ ア ン ト 用 の 動 作 環 境 フ ァ イ ル の DEFAULT_ACCESS_MODE お よ び

DEFAULT_ISOLATIONは指定できません。

また、環境変数RDBRLOCK=YESを指定することはできません。

【パラメタの意味】

DSO名:

アプリケーションで使用するDSO名を以下の形式で指定します。

データベース名.DSO名

- 324 -

P:

DSOの占有の単位をページとします。省略した場合は、占有の単位はDSIとなります。

DSO名に指定されたDSOにPRECEDENCE(1)が指定されている場合、本パラメタは指定できません。

占有モード:

占有のモードとして以下のいずれかを指定します。省略した場合は、EXが指定されたとみなします。

- EX:

非共有モードの排他を行います。

- SH:

共有モードの排他を行います。

RDBLOCK

【指定形式】

RDBLOCK = DYNAM[,{WAIT | REJECT}]

【環境変数の意味】

あるトランザクションで資源にアクセスしようとしたとき、別のトランザクションがその資源を占有していた場合に、資源

の占有が解除されるまで待つか否かを指定します。

【パラメタの意味】

DYNAM:

この環境変数を指定する場合には必ず指定します。

WAIT:

資源の占有が解除されるまで待ちます。

REJECT:

エラーとしてアプリケーションに復帰します。

RDBLSQL

【指定形式】

RDBLSQL = ({SQL88 | SQL92 | SQL95 | SQL96 | SQL2000 | SQL2007})

【環境変数の意味】

アプリケーションの予約語とSQL機能のレベルを設定します。

予約語とSQL機能のレベルを設定することで、キーワードの範囲と利用可能なSQLの機能を変更できます。

SQLの機能とそれを利用可能なレベルとの関係を以下に示します。

表に記載のない機能は、RDBLSQLに関係なく利用可能です。

表C.4 RDBLSQLと利用可能なSQLの機能一覧

RDBLSQL SQLの機能

SQL2007 数値関数 ACOS

ASIN

ATAN

ATAN2

COS

EXP

LN

POWER

- 325 -

RDBLSQL SQLの機能

SIGN

SIN

SQRT

TAN

ASCII

OCTET_POSITION

データ列値関数 LTRIM

RTRIM

OCTET_SUBSTRING

CHR

日時値関数 CNV_TIME

CNV_TIMESTAMP

XMLQUERY関数

述語 XMLEXISTS述語

ROWNUM

SQL2000以上 ファンクションルーチン

ロール

プロシジャ例外事象 条件宣言

ハンドラ宣言

SIGNAL文

RESIGNAL文

SQL96以上 トリガ

行識別子

並列指定

SQL95以上 プロシジャルーチン

SQL92以上 定数 日時定数

時間隔定数

データ型 日時型

時間隔型

BLOB型

順序定義

一時表定義

数値関数 POSITION

EXTRACT

CHAR_LENGTH

CHARACTER_LENGTH

OCTET_LENGTH

データ列値関数 SUBSTRING

UPPER

- 326 -

RDBLSQL SQLの機能

LOWER

TRIM

日時値関数 CURRENT_DATE

CURRENT_TIME

CURRENT_TIMESTAMP

CAST指定

CASE式 NULLIF

COALESCE

CASE

結合表

カーソルのSCROLL指定

ポイント

SQL2007の関数名と同名のファンクションルーチンを定義している場合、関数とファンクションルーチンの動作の優先

順位は以下になります。

ファンクションルーチン

名へのスキーマ名修

飾の有無

RDBLSQL

SQL2007 SQL2000

スキーマ名修飾有 ファンクションルーチン ファンクションルーチン

スキーマ名修飾無 関数 ファンクションルーチン

SQL文にSQL2007の関数名と同名のファンクションルーチンを指定している場合、関数が優先して動作することで、

ファンクションルーチンの結果と異なる結果になる場合があります。

ファンクションルーチンの動作を優先する場合は、RDBLSQLにSQL2000を指定するか、ファンクションルーチン名を

スキーマ名修飾してください。

【パラメタの意味】

SQL88:

予約語とSQL機能のレベルをSQL88とします。

SQL92:

予約語とSQL機能のレベルをSQL92とします。

SQL95:

予約語とSQL機能のレベルをSQL95とします。

SQL96:

予約語とSQL機能のレベルをSQL96とします。

SQL2000:

予約語とSQL機能のレベルをSQL2000とします。

SQL2007:

予約語とSQL機能のレベルをSQL2007とします。

- 327 -

参照

各予約語とSQL機能のレベルと、キーワードの関係については、“SQLリファレンス”を参照してください。

RDBMSG

【指定形式】

RDBMSG = E

【環境変数の意味】

SQL文実行時に、エラーメッセージを標準エラー出力に出力するか否かを指定します。エラーメッセージを出力する

場合は、Eを指定します。エラーメッセージを標準エラー出力に出力しない場合は、この環境変数を指定しません。

RDBNCHAR

【指定形式】

RDBNCHAR = {EUC_S90|EUC_U90|EUC|COBOL_EUC_S90|COBOL_EUC_U90|COBOL_EUC|SJIS|UTF8|UCS2|UCS2B}

【環境変数の意味】

各国語文字列型のホスト変数、各国語文字列型の動的パラメタの文字コード系を指定します。この指定は、アプリケー

ションをC言語で記述している場合に有効です。

アプリケーションをC言語で記述している場合の、RDBCHARSETとRDBNCHARの関係を以下に示します。

表C.5 RDBCHARSETとRDBNCHARの関係

RDBNCHARの指定

RDBCHARSET

の指定

EUC_S90

COBOL_EUC_S90

EUC_U90

EUC COBOL_EUC_U90

COBOL_EUC

SJIS UTF8 UCS2 UCS2B

EUC_S90 ○ × × ×

EUC_U90× ○ × ×

EUC

SJIS × × ○ ×

UTF8 × × × ○

○:有効

×:無効

データベースに格納される各国語文字列型データの文字コード系とRDBNCHARとの関係を以下に示します。

表C.6 データベースの文字コード系との関係

データベースの文字コー

ド系

RDBNCHARの指定

EUC_S90

COBOL_EUC_S9

0

EUC_U9

0

EUC COBOL_EUC_U9

0

COLBOL_EU

C

SJIS UTF8

UCS2

UCS2B

EUCコードのS90コード ○ × ○ ○

EUCコードのU90コード × ○ ○ ○

シフトJISコード ○ ○ ○ ○

UNICODE ○ ○ ○ ○

- 328 -

○:指定可能

×:指定不可能

【パラメタの意味】

EUC_S90:

ホスト変数内文字列のデータの文字コード系がEUCコードのS90コードの場合に指定します。

EUC_U90またはEUC:

ホスト変数内文字列のデータの文字コード系がEUCコードのU90コードの場合に指定します。EUCは互換として

存在します。

COBOL_EUC_S90:

ホスト変数内文字列のデータの文字コード系がEUCコードのS90コードのCOBOLの内部表現形式(COBOL_EUC)の場合に指定します。

COBOL_EUC_U90またはCOBOL_EUC:

ホスト変数内文字列のデータの文字コード系がEUCコードのU90コードのCOBOLの内部表現形式(COBOL_EUC)場合に指定します。COBOL_EUCは下位互換として存在します。

SJIS:

ホスト変数内文字列のデータの文字コード系がシフトJISコードの場合に指定します。

UTF8:

ホスト変数内文字列のデータの文字コード系がUTF-8形式の場合に指定します。

UCS2:

ホスト変数内文字列のデータの文字コード系がUCS-2形式の場合に指定します。

UCS2B:

ホスト変数内文字列のデータの文字コード系がバイトスワップしたUCS-2形式の場合に指定します。

注意

アプリケーションをCOBOLで記述している場合は、本パラメタは無視されます。詳細は、“2.3.1 文字コード系の決定”

を参照してください。

RDBOBJTB

【指定形式】

RDBOBJTB = ページ長,初期量[,拡張量,拡張契機]

【環境変数の意味】

格納構造定義を行わない表を作成する場合、OBJECT構造の表のデータ格納域の割付け量、ページ長などを指定

します。単位はキロバイトです。

【パラメタの意味】

ページ長:

データ格納域のページ長を指定します。必ず32を指定します。

初期量:

データ格納域の初期量を2~2097150の範囲で指定します。

拡張量:

データ格納域の拡張量を1~2097150の範囲で指定します。省略した場合は、32768が指定されたとみなします。

- 329 -

拡張契機:

データ格納域の拡張を行うタイミングとして、表のDSIの空き容量を0~2097150の範囲で指定します。つまり、表

のDSIの空き容量がここで指定した値になると、表のデータ格納域の拡張が行われます。省略した場合は、0が指

定されたとみなします。

注意

自動容量拡張の拡張量と拡張契機は、ページ長単位に繰り上げますので、ページ長の倍数で指定してください。

RDBODBIX

【指定形式】

RDBODBIX = ベース部ページ長,インデックス部ページ長,ベース部初期量,インデックス部初期量[,拡張量,拡張契

機]

【環境変数の意味】

格納構造定義を行わないインデックスを作成する場合、インデックスのベース部とインデックス部の割付け量、ページ

長などを指定します。単位はキロバイトです。

【パラメタの意味】

ベース部ページ長:

ベース部のページ長を1、2、4、8、16、32の中から指定します。

インデックス部ページ長:

インデックス部のページ長を1、2、4、8、16、32の中から指定します。

ベース部初期量:

ベース部の初期量を2~2097150の範囲で指定します。

インデックス部初期量:

インデックス部の初期量を2~2097150の範囲で指定します。

拡張量:

ベース部の拡張量を1~2097150の範囲で指定します。省略した場合は、10240が指定されたとみなします。イン

デックス部の拡張量は、ベース部の5分の1の値となります。

拡張契機:

インデックスのベース部およびインデックス部の拡張を行うタイミングとして、DSIの空き容量を0~2097150の範囲

で指定します。つまり、インデックスのDSIの空き容量がここで指定した値になると、インデックスのベース部とイン

デックス部の拡張が行われます。省略した場合は、3072が指定されたとみなします。

注意

- 自動容量拡張の拡張量と拡張契機は、ページ長単位に繰り上げますので、ページ長の倍数で指定してくださ

い。

- ベース部の5分の1がインデックス部のページ長の倍数でない場合、インデックス部のページ長の倍数に繰り上げ

ます。

- インデックス定義時には、容量拡張を行いません。拡張量および拡張契機は、インデックス定義した後に有効と

なります。

- 330 -

RDBODBTB

【指定形式】

RDBODBTB = ページ長,初期量[,拡張量,拡張契機]

【環境変数の意味】

格納構造定義を行わない表を作成する場合、表のデータ格納域の割付け量、ページ長などを指定します。単位は

キロバイトです。

【パラメタの意味】

ページ長:

データ格納域のページ長を1、2、4、8、16、32の中から指定します。

初期量:

データ格納域の初期量を2~2097150の範囲で指定します。

拡張量:

データ格納域の拡張量を1~2097150の範囲で指定します。省略した場合は、10240が指定されたとみなします。

拡張契機:

データ格納域の拡張を行うタイミングとして、表のDSIの空き容量を0~2097150の範囲で指定します。つまり、表

のDSIの空き容量がここで指定した値になると、表のデータ格納域の拡張が行われます。省略した場合は、3072が指定されたとみなします。

注意

自動容量拡張の拡張量と拡張契機は、ページ長単位に繰り上げますので、ページ長の倍数で指定してください。

RDBODBTY

【指定形式】

RDBODBTY = {SEQUENTIAL | OBJECT}

【環境変数の意味】

格納構造定義を行わない表を作成する場合に、Symfoware/RDBが自動的に生成する表のDSOの格納構造を選択

します。本パラメタにより格納構造の選択ができるのは、表の形式が以下の条件をすべて満たしている場合のみで

す。

- 表の 後に1つだけ、BLOB型でサイズに32キロバイト以上を指定している場合

- BLOB型以外の列は固定長属性の場合

- BLOB型の列にNOT NULL制約を指定している場合

上記以外の場合は、表のDSOはSEQUENTIAL型となります。

【パラメタの意味】

SEQUENTIAL:

表のDSOとしてSEQUENTIAL格納構造のDSOを定義します。

OBJECT:

表のDSOとしてOBJECT格納構造のDSOを定義します。

RDBPSCAN

【指定形式】

RDBPSCAN = {YES | NO}

- 331 -

【環境変数の意味】

アプリケーション単位またはコネクション単位に、データベースを並列に検索するか否かを指定します。

【パラメタの意味】

YES:

データベースを並列に検索します。この場合、そのアプリケーションの問合せを並列検索で実行できます。ただ

し、以下のいずれかの条件を満たす場合、並列検索は実行されず従来のアクセス手順でデータベースをアクセ

スします。

- 表がDSI分割されていない、または1つのDSIに対するアクセスの場合

- クラスタキーを利用したデータベースアクセスが可能な場合

- 探索条件にROW_IDを指定した検索の場合

- インデックスを利用したデータベースアクセスが可能な場合

NO:

データベースを並列に検索しません。

RDBRCVL

【指定形式】

RDBRCVL = {RCV | NRCV}

【環境変数の意味】

アプリケーションのリカバリ水準を指定します。

【パラメタの意味】

RCV:

リカバリ機能を利用します。この場合、リカバリを適用しない(rdbrtrコマンドで利用規定にnオプションを指定してい

る)データベースをアクセスすることはできますが、ログは取得されません。

NRCV:

リカバリ機能を利用しません。この場合、リカバリを適用する(rdbrtrコマンドで利用規定にnオプションを指定してい

ない)データベースを更新することはできません。

RDBRLOCK

【指定形式】

RDBRLOCK = {YES | NO}

【環境変数の意味】

占有の単位を行とするかどうかを指定します。

【パラメタの意味】

YES:

占有の単位を行とします。このパラメタを指定した場合、環境変数RDBDSOおよび動作環境ファイルのDSO_LOCKパラメタを指定することはできません。

NO:

占有の単位は、RDBDSOの指定に従います。このパラメタを指定し、かつRDBDSOが指定されていない場合は、

Symfoware/RDBによって自動的に占有の単位が選択されます。

参照

占有の単位の詳細については、“アプリケーション開発ガイド(共通編)”の“排他制御”を参照してください。

- 332 -

注意

- RDBRLOCKがNOの場合、動作環境ファイルのDEFAULT_ISOLATIONにREPEATABLE_READを指定、また

はSET TRANSACTION文にREPEATABLE READを指定しても、独立性水準はSERIALIZABLEになります。

- RDBRLOCKがYESの場合、動作環境ファイルのDEFAULT_ISOLATIONまたはSET TRANSACTION文に

SERIALIZABLEを指定しても、独立性水準はREPEATABLE READになります。

- データベース簡単運用でない場合、RDBRLOCKがNOのときには、DSO定義でPRECEDENCE(1)が指定された

SEQUENTIAL構造の表にアクセスするアプリケーションの占有の単位はDSIになります。

RDBRTRC

【指定形式】

RDBRTRC = 出力レベル,ファイル名

【環境変数の意味】

ROUTINE_SNAP機能の出力レベルと、ファイル名を指定します。

ROUTINE_SNAP機能は、SQL手続き文の実行情報をファイルに出力する機能です。ROUTINE_SNAP機能の詳細

および使用方法については、“7.2 アプリケーションのデバッグ”を参照してください。

【パラメタの意味】

出力レベル:

出力する情報のレベルとして、1または2を指定します。省略した場合は、2が指定されたとみなします。出力レベ

ルの指定と出力情報の対応については、“7.2.3 ROUTINE_SNAP機能の利用方法”を参照してください。

ファイル名:

SQL手続き文の実行情報の出力先のサーバ側のファイル名を、絶対パスで指定します。指定されたファイルがす

でに存在する場合は、情報を追加して出力します。

複数のアプリケーションが動作する場合は、環境変数RDBDIVTRCの指定により、出力ファイル名の後にプロセ

スIDなどの情報を付加して、個別のトレース情報を出力します。

アプリケーションがマルチスレッド環境で動作する場合は、RDBDIVTRCの指定に関係なく、出力ファイル名の後

にプロセスIDやセションIDなどの情報を自動的に付加して、個別のトレース情報を出力します。

RDBSIGINF(Solaris/Linuxの場合)

【指定形式】

RDBSIGINF = {YES | NO}

【環境変数の意味】

シグナルをアプリケーションで利用するか否かを指定します。

なお、本実行パラメタは、トランザクションモニタ配下では指定できません。

【パラメタの意味】

YES:

アプリケーションでシグナルを利用します。

NO:

アプリケーションでシグナルを利用しません。

RDBSETCALLBACK

【指定形式】

RDBSETCALLBACK = ライブラリ名

- 333 -

【環境変数の意味】

アプリケーションの起動時にコールバック関数を登録する場合、動的ライブラリ名を指定します。

動的ライブラリ名が絶対パスでの指定でない場合は、以下のディレクトリにライブラリを格納する必要があります。

Solaris/Linuxの場合

環境変数LD_LIBRARY_PATHに指定したディレクトリ

Windows(R)の場合

PATHに指定したディレクトリ

【パラメタの意味】

ライブラリ名:

動的ライブラリ名を指定します。

RDBSMEM

【指定形式】

RDBSMEM = メモリサイズ

【環境変数の意味】

ソート処理のために作業用ソート領域としてサーバ側で使用するメモリの大きさを指定します。この領域は、RDBプロ

セスのローカルメモリにセション単位に獲得されます。

ソート処理のデータ量が環境変数に指定した値を超えると、二次記憶の作業用ソート領域にデータを書き出し、書き

出したデータのソートを行います。このとき、二次記憶からのソートデータの読み込み回数はソートデータの全体量と

環境変数に指定した値に依存します。このため、ソートデータの全体量に応じて、環境変数に指定する値を見積もっ

てください。

ソート処理のデータ量が環境変数に指定した値の1万倍以上になると、ソート処理で必要なメモリが不足し、「JYP2221E実行時の制限値を超えました.code:“4”」のエラーとなる場合があります。ただし、メモリ上の作業域の必要 低限な

サイズは、作業用ソート領域へのレコードの格納順に依存するため、環境変数に指定した値の1万倍は目安となりま

す。

【パラメタの意味】

メモリサイズ:

サーバ側で使用するメモリの大きさを64~2097150の範囲で指定します。単位はキロバイトです。

RDBSYDSI

UNIX系の場合(Solaris/Linuxの場合)

【指定形式】

RDBSYDSI

【環境変数の意味】

アプリケーションによるデータ操作で、DSIに定義された拡張契機(rdbalmdsiコマンドまたはDSI定義文で定義しま

す)を無効とする場合に、この環境変数を指定します。パラメタはありません。

Windows(R)の場合

【指定形式】

RDBSYDSI = {YES | NO}

【環境変数の意味】

アプリケーションによるデータ操作で、DSIに定義された拡張契機(rdbalmdsiコマンドまたはDSI定義文で定義しま

す)を無効とするか否かを指定します。

- 334 -

【パラメタの意味】

YES:

DSIに定義された拡張契機を無効とする。

NO:

DSIに定義された拡張契機を有効とする。

RDBTRAN

【指定形式】

RDBTRAN = {SC | TC}

【環境変数の意味】

SQL文が実行中にエラーとなった場合のトランザクションの対処方法を指定します。

なお、本実行パラメタは、トランザクションモニタ配下では指定できません。

【パラメタの意味】

SC:

各プラットフォームのトランザクションの仕様に従います。

TC:

SQL文の実行がエラーとなった場合に、トランザクションをロールバックします。

RDBTRC

【指定形式】

RDBTRC = 出力レベル,ファイル名[,繰り返し幅]

【環境変数の意味】

SQL_SNAP機能の出力レベルと、出力先ファイル名を指定します。

SQL_SNAP機能は、アプリケーションが実行したSQL文の情報をファイルに出力する機能です。ROUTINE_SNAP機能の詳細および使用方法については、“7.2 アプリケーションのデバッグ”を参照してください。

注意

本機能の利用は性能に影響を与えるため、デバッグ作業が終了したら、本環境変数の設定を解除してください。

【パラメタの意味】

出力レベル:

出力する情報のレベルとして、1から3または、PRC1、PRC2のいずれかを指定します。ただし、レベル2とレベル3の出力情報は同じです。出力レベルの指定と出力情報の対応については、“7.2 アプリケーションのデバッグ”を

参照してください。

ファイル名:

SQL_SNAP機能が出力するSQL文の実行情報の出力先ファイル名を指定します。ファイル名にディレクトリの指

定がない場合は、カレントディレクトリが指定されたとみなします。指定されたファイルがすでに存在する場合は、

情報を追加して出力します。

複数のアプリケーションが動作する場合は、環境変数RDBDIVTRCの指定により、出力ファイル名の後にプロセ

スIDなどの情報を付加して、個別のトレース情報を出力します。

アプリケーションがマルチスレッド環境で動作する場合は、RDBDIVTRCの指定に関係なく、出力ファイル名の後

にプロセスIDやセションIDなどの情報を自動的に付加して、個別のトレース情報を出力します。

- 335 -

繰り返し幅:

出力する情報の繰り返し幅として、1から32767を指定します。1つのSQL文の出力を1とします。繰り返し幅を指定

した場合は、その幅でサイクリックに情報を出力します。省略した場合は、先頭からの情報をすべて出力します。

RDBWMEM

【指定形式】

RDBWMEM = メモリサイズ

【環境変数の意味】

作業用テーブルとしてサーバ側で使用するメモリの大きさを指定します。この領域は、RDBプロセスのローカルメモリ

にセション単位に獲得されます。

【パラメタの意味】

メモリサイズ:

サーバ側で使用するメモリの大きさを64~2097150の範囲で指定します。単位はキロバイトです。

RDBWPATH

【指定形式】

RDBWPATH = パス名[[:パス名]・・・]

【環境変数の意味】

サーバ側で使用するソート作業域、作業用テーブル域の獲得先ディレクトリを指定します。“Symfoware/RDBを起動

するユーザID”および“RDBコマンドを実行するユーザID”には、指定するディレクトリへの書込み権が必要です。

【パラメタの意味】

パス名:

獲得先ディレクトリを指定します。

- 336 -

付録D SQL文の使用範囲

以下に、Symfoware/RDBがコンパイル・実行時にサポートするSQL文の使用範囲を示します。

データベース簡単運用の場合には、使用可能なSQL文の範囲が異なります。データベース簡単運用ガイドを参照し、使

用可能なSQL文の範囲を確認してください。

表D.1 アプリケーションに記述できるSQL文の範囲

分類

コンパイル時のサ

ポート範囲実行時のサポート範囲

対象O

S

クライ

アント

SolarisLinux

Windows

SolarisLinux

Windows

サーバ -

SolarisLinux

Windows

データ型(BLOB) ○ ○

データ型(DATE、TIME、TIMESTAMP) ○ ○

データ型(INTERVAL) ○ ○

データ型(上記以外) ○ ○

値指定と相手指定 ○ ○

項目参照 ○ ○

列指定 ○ ○

関数 ○ ○

集合関数指定 ○ ○

数値関数 ○ ○

データ列値関数 ○ ○

日時値関数 ○ ○

XMLQUERY関数 ○ ○

CAST指定 ○ ○

行識別子(ROW_ID) ○ ○

ROWNUM ○ ○

値式 ○ ○

行値構成子 ○ ○

数値式 ○ ○

データ列値式 ○ ○

日時値式 ○ ○

時間隔値式 ○ ○

CASE式 ○ ○

述語 ○ ○

比較述語 ○ ○

BETWEEN述語 ○ ○

IN述語 ○ ○

LIKE述語 ○ ○

- 337 -

分類

コンパイル時のサ

ポート範囲実行時のサポート範囲

対象O

S

クライ

アント

SolarisLinux

Windows

SolarisLinux

Windows

サーバ -

SolarisLinux

Windows

NULL述語 ○ ○

限定述語 ○ ○

EXISTS述語 ○ ○

XMLEXISTS述語 ○ ○

探索条件 ○ ○

表式 ○ ○

FROM句 ○ ○

WHERE句 ○ ○

GROUP BY句 ○ ○

HAVING句 ○ ○

問合せ指定 ○ ○

問合せ式 ○ ○

副問合せ ○ ○

ASSIST指定 ○ ○

システム

制御文SET SYSTEM PARAMETER文 ○(注1) ○(注1)

利用者

制御文

利用者定義文(CREATE USER) ○(注1) ○(注1)

利用者変更文(ALTER USER) ○(注1) ○(注1)

利用者削除文(DROP USER) ○(注1) ○(注1)

SET USER PASSWORD文 ○ ○(注2)

データベース定義文

データベース定義

(CREATE DATABASE)○(注1) ○(注1)

データベーススペース定義

(CREATE DBSPACE)○(注1) ○(注1)

データベース操作文

データベース削除文 (DROP DATABASE)

○(注1) ○(注1)

データベーススペース削除文

(DROP DBSPACE)○(注1) ○(注1)

- 338 -

分類

コンパイル時のサ

ポート範囲実行時のサポート範囲

対象O

S

クライ

アント

SolarisLinux

Windows

SolarisLinux

Windows

サーバ -

SolarisLinux

Windows

スキーマ定義文

スキーマ定義(CREATE SCHEMA) ○(注1) ○(注1)

順序定義(CREATE SEQUENCE) ○(注1) ○(注1)

表定義(CREATE TABLE) ○(注1) ○(注1)

ビュー定義(CREATE VIEW) ○(注1) ○(注1)

プロシジャルーチン定義 (CREATE PROCEDURE)

○(注1) ○(注1)

ファンクションルーチン定義

(CREATE FUNCTION)○(注1) ○(注1)

インデックス定義(CREATE INDEX) ○(注1) ○(注1)

トリガ定義(CREATE TRIGGER) ○(注1) ○(注1)

スキーマ操作文

スキーマ削除文(DROP SCHEMA) ○(注1) ○(注1)

順序削除文(DROP SEQUENCE) ○(注1) ○(注1)

表削除文(DROP TABLE) ○(注1) ○(注1)

ビュー削除文(DROP VIEW) ○(注1) ○(注1)

表定義変更文(ALTER TABLE) ○(注1) ○(注1)

プロシジャルーチン削除文 (DROP PROCEDURE)

○(注1) ○(注1)

ファンクションルーチン削除文

(DROP FUNCTION)○(注1) ○(注1)

インデックス削除文(DROP INDEX) ○(注1) ○(注1)

トリガ削除文(DROP TRIGGER) ○(注1) ○(注1)

表交換文(SWAP TABLE) ○(注1) ○(注1)

格納構造定義文

表のDSO定義文(CREATE DSO) ○(注1) ○(注1)

インデックスのDSO定義文(CREATEDSO)

○(注1) ○(注1)

表のDSI定義文(CREATE DSI) ○(注1) ○(注1)

インデックスのDSI定義文

(CREATE DSI)○(注1) ○(注1)

スコープ定義文(CREATE SCOPE) ○(注1) ○(注1)

格納構造操作文

DSO削除文(DROP DSO) ○(注1) ○(注1)

DSI削除文(DROP DSI) ○(注1) ○(注1)

DSI変更文(ALTER DSI) ○(注1) ○(注1)

スコープ削除文(DROP SCOPE) ○(注1) ○(注1)

スコープ適用文(APPLY SCOPE) ○(注1) ○(注1)

スコープ解除文(RELEASE SCOPE) ○(注1) ○(注1)

適化情報設定文(SET STATISTICS) ○(注1) ○(注1)

- 339 -

分類

コンパイル時のサ

ポート範囲実行時のサポート範囲

対象O

S

クライ

アント

SolarisLinux

Windows

SolarisLinux

Windows

サーバ -

SolarisLinux

Windows

適化情報表示文(PRINTSTATISTICS)

○(注1) ○(注1)

アクセス

制御文

ロール定義文 (CREATE ROLE) ○(注1) ○(注1)

ロール削除文 (DROP ROLE) ○(注1) ○(注1)

SET ROLE文 ○ ○(注2)

GRANT文 ○(注1) ○(注1)

REVOKE文 ○(注1) ○(注1)

データ操作文

単一行SELECT文 ○ ○

並列指定 ○ ○

占有モード指定 ○ ○

大件数指定 ○ ○

DELETE文:探索 ○ ○

占有モード指定 ○ ○

INSERT文 ○ ○

占有モード指定 ○ ○

UPDATE文:探索 ○ ○

占有モード指定 ○ ○

カーソル宣言 ○ ○

更新可能性句 ○ ○

SCROLL ○ ○

並列指定 ○ ○

占有モード指定 ○ ○

カーソルモード指定 ○ ○

大件数指定 ○ ○

OPEN文 ○ ○

CLOSE文 ○ ○

FETCH文 ○ ○

DELETE文:位置づけ ○ ○

UPDATE文:位置づけ ○ ○

表宣言 ○ ○

資源

操作文

RELEASE TABLE文 ○ ○(注2)

トランザ

クション

管理文

SET TRANSACTION文 ○ ○

COMMIT文 ○ ○

- 340 -

分類

コンパイル時のサ

ポート範囲実行時のサポート範囲

対象O

S

クライ

アント

SolarisLinux

Windows

SolarisLinux

Windows

サーバ -

SolarisLinux

Windows

ROLLBACK文 ○ ○

コネクション管理文

CONNECT文 ○ ○

SET CONNECTION文 ○ ○

DISCONNECT文 ○ ○

セション管理文

SET CATALOG文 ○ ○

SET SCHEMA文 ○ ○

SET SESSION AUTHORIZATION文 ○ ○

動的SQL文

USING句 ○ ○

ALLOCATE DESCRIPTOR文 ○ ○

DEALLOCATE DESCRIPTOR文 ○ ○

DESCRIPTOR 取得文 ○ ○

DESCRIPTOR 設定文 ○ ○

PREPARE文 ○ ○

DEALLOCATE PREPARE文 ○ ○

DESCRIBE文 ○ ○

EXECUTE文 ○ ○

EXECUTE IMMEDIATE文 ○ ○

動的カーソル宣言 ○ ○

動的OPEN文 ○ ○

動的FETCH文 ○ ○

動的CLOSE文 ○ ○

動的DELETE文:位置づけ ○ ○

動的UPDATE文:位置づけ ○ ○

準備可能動的DELETE文:位置づけ ○ ○

準備可能動的UPDATE文:位置づけ ○ ○

プロシジャ

実行

CALL文 ○ ○

埋込み

SQL

埋込み例外宣言 ○ ○

INCLUDE文 ○ ○

- 341 -

○:サポートする

注1)動的SQLの準備可能文の場合のみ指定できます。

注2)動的SQL文では利用できません。

- 342 -

付録E SQLのデータ型と対応するホスト変数のデータ型

SQLのデータ型と対応するCホスト変数のデータ型を以下に示します。

表E.1 SQLのデータ型と対応するCホスト変数のデータ型

SQLデータ型 C変数定義

文字列

CHARACTER(n)char 変数名[n+1]char * 変数名[n+1] (注1)

CHARACTERVARYING(n)

VARCHAR 変数名[n+1] (注2)VARCHAR * 変数名[n+1] (注1)(注3)

各国語 文字列

NATIONALCHARACTER(n)

char CHARACTER SET[IS]NCHAR 変数名[n*2+1]char CHARACTER SET[IS]NCHAR * 変数名 (注1)

NATIONALCHARACTERVARYING(n)

VARCHAR CHARACTER SET[IS]NCHAR変数名[n*2+1] (注2)VARCHAR CHARACTER SET[IS]NCHAR* 変数名 (注1)(注3)

真数型

NUMERIC(p,q)NUMERIC(p,q) 変数名 (注4)NUMERIC(p,q) * 変数名 (注1)

DECIMAL(p,q)DECIMAL(p,q) 変数名 (注5)DECIMAL(p,q) * 変数名 (注1)

SMALLINTshort 変数名

short * 変数名 (注1)

INTEGERlong 変数名 (注6)long * 変数名 (注1)

概数型

REALfloat 変数名

float * 変数名 (注1)

DOUBLEPRECISION

double 変数名

double * 変数名 (注1)

日時型

DATE char 変数名[11]

TIME char 変数名[9]

TIMESTAMP char 変数名[20]

時間隔

型INTERVAL “表E.2 時間隔型と対応するCホスト変数のデータ型”参照

BLOB型BINARY LARGEOBJECT(n単位)

SQL TYPE IS BLOB(n単位) 変数名 (注7)SQL TYPE IS BLOB * 変数名 (注1) (注8)

ROW_ID

ROW_IDROW_ID 変数名

ROW_ID * 変数名 (注1)

n:長さ、p:精度、q:位取り、単位:K(キロバイト)、 M(メガバイト)、G(ギガバイト)

注1) 各型のポインタ変数を宣言する場合は、変数名の前に*を指定します。

注2) 可変長文字列の場合、コンパイル時に以下の構造体に展開されます。

struct {

short sqllen;

char sqlvar[n+1];

} 変数名

注3) 可変長文字列のポインタ変数の場合、コンパイル時に以下の構造体に展開されます。

- 343 -

struct 変数名_SQLVAR{

short sqllen;

char sqlvar[1];

} *変数名

注4) NUMERIC型の場合、コンパイル時に以下のように展開されます。

char 変数名 [p+1];

注5) DECIMAL型の場合、コンパイル時に以下のように展開されます。

char 変数名 [(p÷2)+1];

注6) 64ビットのSQL埋込みCプログラムの場合、対応するC変数定義はintです。

注7) BLOB型の場合、コンパイル時に以下の構造体に展開されます。

struct {

long 変数名_reserved; 注)

unsigned long 変数名_length; 注)

char 変数名_data[n*1024];

} 変数名

注8) BLOB型のポインタ変数の場合、コンパイル時に以下の構造体に展開されます。

struct 変数名_SQLBLOB{

long 変数名_reserved; 注)

unsigned long 変数名_length;

char 変数名_data[1];

} *変数名

注)64ビットのSQL埋込みCプログラムの場合、longはintに展開されます。

時間隔型と対応するCホスト変数のデータ型を以下に示します。

表E.2 時間隔型と対応するCホスト変数のデータ型

時間隔型 C変数定義

年月型

INTERVAL YEAR[(n)] TO MONTH char 変数名[n+5]

INTERVAL YEAR[(n)]char 変数名[n+2]long 変数名 (注)

INTERVAL MONTH[(n)]char 変数名[n+2]long 変数名 (注)

日時型

INTERVAL DAY[(n)] TO HOUR char 変数名[n+5]

INTERVAL DAY[(n)] TO MINUTE char 変数名[n+8]

INTERVAL DAY[(n)] TO SECOND char 変数名[n+11]

INTERVAL DAY[(n)]char 変数名[n+2]long 変数名 (注)

INTERVAL HOUR[(n)] TO MINUTE char 変数名[n+5]

INTERVAL HOUR[(n)] TO SECOND char 変数名[n+8]

INTERVAL HOUR[(n)]char 変数名[n+2]long 変数名 (注)

INTERVAL MINUTE[(n)] TO SECOND char 変数名[n+5]

INTERVAL MINUTE[(n)]char 変数名[n+2]long 変数名 (注)

INTERVAL SECOND[(n)]char 変数名[n+2]long 変数名 (注)

- 344 -

n:桁数(1~9)

注) 位取り0の真数型が指定可能なので、以下のデータ型も指定できます。

short 変数名 ( n<5の場合 )

SQLのデータ型と対応するCOBOLホスト変数のデータ型を以下に示します。

表E.3 SQLのデータ型と対応するCOBOLホスト変数のデータ型

SQLデータ型 COBOL変数定義

文字列

CHARACTER(n) 01 変数名 PIC X(n).

CHARACTERVARYING(n)

01 変数名-1.49 変数名-2 PIC S9({4|9}) {BINARY|COMP}.49 変数名-3 PIC X(n).

各国語 文字列

NATIONALCHARACTER(n)

01 変数名 PIC N(n).

NATIONALCHARACTERVARYING(n)

01 変数名-1.49 変数名-2 PIC S9({4|9}) {BINARY|COMP}.49 変数名-3 PIC N(n).

真数型

NUMERIC(p,q)01 変数名 PIC S9(p-q)V9(q) DISPLAY [SIGN] {LEADINGSEPARATE [CHARACTER]|TRAILING}.

DECIMAL(p,q)01 変数名 PIC S9(p-q)V9(q) {PACKED-DECIMAL|COMP-3}.

SMALLINT 01 変数名 PIC S9(4) {BINARY|COMP}.

INTEGER 01 変数名 PIC S9(9) {BINARY|COMP}.

概数型REAL 01 変数名 COMP-1.

DOUBLE PRECISION 01 変数名 COMP-2.

日時型

DATE 01 変数名 PIC X(10).

TIME 01 変数名 PIC X(8).

TIMESTAMP 01 変数名 PIC X(19).

時間隔

型INTERVAL

“表E.4 時間隔型と対応するCOBOLホスト変数のデータ型”

参照

BLOB型

BINARY LARGEOBJECT(n単位)

01 変数名 SQL TYPE IS BLOB(n単位). (注)

ROW_ID

ROW_ID 01 変数名 ROW_ID.

n:長さ、p:精度、q:位取り、単位:K(キロバイト)、M(メガバイト)、G(ギガバイト)

注) BLOB型の場合、コンパイル時に以下の構造体に展開されます(単位がKの場合)。

01 変数名.

49 変数名-RESERVED PIC S9(9) USAGE IS BINARY.

49 変数名-LENGTH PIC S9(9) USAGE IS BINARY.

49 変数名-DATA PIC X(n*1024).

時間隔型と対応するCOBOLホスト変数のデータ型を以下に示します。

- 345 -

表E.4 時間隔型と対応するCOBOLホスト変数のデータ型

時間隔型 COBOL変数定義

年月

INTERVAL YEAR[(n)] TOMONTH

01 変数名 PIC X(n+4).

INTERVAL YEAR[(n)]01 変数名 PIC X(n+1).01 変数名 PIC S9(9) {BINARY|COMP}. (注)

INTERVAL MONTH[(n)]01 変数名 PIC X(n+1).01 変数名 PIC S9(9) {BINARY|COMP}. (注)

日時

INTERVAL DAY[(n)] TOHOUR

01 変数名 PIC X(n+4).

INTERVAL DAY[(n)] TOMINUTE

01 変数名 PIC X(n+7).

INTERVAL DAY[(n)] TOSECOND

01 変数名 PIC X(n+10).

INTERVAL DAY[(n)]01 変数名 PIC X(n+1).01 変数名 PIC S9(9) {BINARY|COMP}. (注)

INTERVAL HOUR[(n)] TOMINUTE

01 変数名 PIC X(n+4).

INTERVAL HOUR[(n)] TOSECOND

01 変数名 PIC X(n+7).

INTERVAL HOUR[(n)]01 変数名 PIC X(n+1).01 変数名 PIC S9(9) {BINARY|COMP}. (注)

INTERVAL MINUTE[(n)] TOSECOND

01 変数名 PIC X(n+4).

INTERVAL MINUTE[(n)]01 変数名 PIC X(n+1).01 変数名 PIC S9(9) {BINARY|COMP}. (注)

INTERVAL SECOND[(n)]01 変数名 PIC X(n+1).01 変数名 PIC S9(9) {BINARY|COMP}. (注)

n:桁数(1~9)

注) 位取り0の真数型が指定可能なので、以下のデータ型も指定できます。

01 変数名 PIC S9(n) DISPLAY [SIGN] {LEADING SEPARATE [CHARACTER]|TRAILING}.

01 変数名 PIC S9(n) {PACKED-DECIMAL|COMP-3}.

01 変数名 PIC S9(4) {BINARY|COMP}. ( n<5の場合 )

- 346 -

索 引[数字]

64ビットで実行するSQL埋込みCOBOLプログラムをコンパイ

ル・リンクする................................................................... 180,19964ビットで実行するSQL埋込みCプログラムをコンパイル・リンク

する.................................................................................. 179,19864ビットで実行するアプリケーションを動的リンクする.......... 19064ビットで実行するアプリケーションを静的リンクする.......... 18664ビットで実行するアプリケーションを動的リンクする.......... 189

[A]ACCESS_PLAN.....................................................................264ALLOCATE DESCRIPTOR文.......................................111,244ALTER_CHECK...............................................................38,271ARC_FULL............................................................................ 271

[B]BLOB型のコンパイル時の展開方法................................. 65,80BLOB型を含む構造体型ホスト変数の使用例..................... 292BTREE構造............................................................................228BUFFER_SIZE.......................................................................239

[C]CAL_ERROR.........................................................................249CALL文..................................................................................144ccコマンド............................................................................... 179CHARACTER_TRANSLATE..........................................24,250CHAR_SET............................................................................ 250CLUSTER_SERVICE_NAME.............................................. 240clコマンド................................................................................ 199cobol32コマンド...................................................................... 199COBOL言語のサンプルプログラム.......................................310cobolコマンド.......................................................................... 180COBOLプログラム作成時の注意事項....................................83COBOLホスト変数................................................................. 345COBOL用の標準シェルプロシジャ.......................................179COBOLを使用する場合........................................................ 199COMMIT文............................................................................149CONNECT文...................................................................... 8,241COREFILE_PATH.................................................................262C言語のサンプルプログラム..................................................275C言語の標準関数..................................................................156C言語用の標準シェルプロシジャ..........................................178C言語を使用する場合...........................................................198Cホスト変数............................................................................ 343

[D]DATA DIVISION.................................................................... 74DEALLOCATE DESCRIPTOR文........................................ 111DEALLOCATE PREPARE文........................................ 102,111DECIMAL型のデータ形式..................................................... 66DECIMAL型またはNUMERIC型として宣言したホスト変数のコ

ンパイル時の展開方法............................................................ 66DEFAULT_ACCESS_MODE............................................... 260DEFAULT_CONNECTION..................................... 9,10,14,240DEFAULT_DSI_TYPE..........................................................254DEFAULT_INDEX_SIZE..................................................... 254

DEFAULT_ISOLATION.......................................................261DEFAULT_OBJECT_TABLE_SIZE.................................... 255DEFAULT_TABLE_SIZE.....................................................255“DEFAULT”を指定したCONNECT文を実行する............. 9,10DESCRIBE文....................................................102,111,119,128DESCRIPTOR_SPEC............................................................ 244DESCRIPTOR取得文.....................................................112,128DESCRIPTOR設定文.....................................................113,129DIV_TRACE_FILE....................................220,224,262,263,264DSI...................................................................................256,324DSI_EXPAND_POINT..........................................................256DSO_LOCK........................................................................... 258

[E]END-EXEC.............................................................................. 72EXEC SQL.......................................................................... 44,72EXECUTE IMMEDIATE文.................................................. 142EXECUTE文.............................................. 117,125,135,136,138EXECUTE文.......................................................................... 106exec関数...................................................................................36

[F]fccコマンド.............................................................................. 179FETCH文...........................................................................90,247fork関数....................................................................................36

[G]gccコマンド............................................................................. 179

[I]INCLUDE文の指定位置....................................................47,76INCLUSION_DSI........................................................... 256,273INSERT文................................................................................ 80ISOLATION_WAIT.............................................................. 259

[L]LANG..................................................................................... 321LD_LIBRARY_PATH...........................................................212LD_LIBRARY_PATH_64.....................................................212LINKAGE SECTION...............................................................74long long型および、8バイトで実装されるlong型のホスト変数の

利用について........................................................................... 50

[M]MAX_PARALLEL................................................................ 270MAX_SQL............................................................................. 244MSG_LANG.......................................................................... 266MSG_PRINT.......................................................................... 267

[N]NCHAR_CODE..................................................................... 251NUMERIC型のデータ形式.....................................................67

[O]OBJECT構造..........................................................................228OPL_BUFFER_SIZE............................................................. 245

- 347 -

[P]PARALLEL_SCAN............................................................... 270PATH......................................................................................215PREPARE文....................................................................101,110PROCEDURE DIVISION........................................................75

[R]RANDOM構造...................................................................... 228RCV_MODE.......................................................................... 267rdbalmdsiコマンド............................................................ 256,334RDBCHARSET......................................................................322RDBCOREPATH...................................................................323RDBCSNAME....................................................................... 323RDBDB........................................................................... 176,196RDBDIVTRC......................................................................... 323RDBDSI..................................................................................324RDBDSO................................................................................ 324rdbexdsiコマンド..................................................................... 273RDBLOCK............................................................................. 325RDBLSQL.............................................................................. 325RDBMSG............................................................................... 328RDBNAME..................................................................... 213,217RDBNCHAR.......................................................................... 328RDBOBJTB............................................................................329RDBODBIX........................................................................... 330RDBODBTB.......................................................................... 331RDBODBTY.......................................................................... 331RDBPSCAN........................................................................... 331RDBRCVL............................................................................. 332RDBRLOCK.......................................................................... 332RDBRTRC..............................................................................333rdbrtrコマンド...................................................................267,332RDBSETCALLBACK........................................................... 333RDBSIGINF........................................................................... 333RDBSMEM............................................................................ 334RDBSYDSI............................................................................ 334RDBTRAN............................................................................. 335RDBTRC................................................................................ 335rdbupsコマンド........................................................................ 228rdbupsコマンドによる 適化情報の更新.............................. 226RDBWMEM...........................................................................336RDBWPATH..........................................................................336RELEASE TABLE文...............................................................92RESULT_BUFFER................................................................247R_LOCK.................................................................................259ROLLBACK文.......................................................................149ROUTINE_SNAP.................................................................. 263ROUTINE_SNAP機能.......................................................... 223ROUTINE_SNAP機能の出力形式.......................................223ROUTINE_SNAP機能の利用方法.......................................223ROUTINE_SNAP機能.......................................................... 333ROW_ID...................................................................................90

[S]SERVER_ENV_FILE............................................................ 241SERVER_SPEC................................................... 2,8,10,211,241SET_CALLBACK..................................................................263SET CATALOG文................................................................. 143

SET CONNECTION文............................................................ 12SET ROLE文............................................................................91SET SCHEMA文................................................................... 143SET TRANSACTION文.................................................258,324SIGNAL_INF......................................................................... 272signal関数.................................................................................37SORT_MEM_SIZE................................................................ 247SQL2000..........................................................................270,327SQL2007..........................................................................270,327SQL88..............................................................................270,327SQL92..............................................................................270,327SQL95..............................................................................270,327SQL96..............................................................................270,327sqlcc.......................................................................... 172,178,198sqlcobol.....................................................................172,179,199SQLDA構造体....................................................................94,97SQLDA構造体を操作するSQL文..................................102,119sqlfcc................................................................................172,178SQL_LEVEL.......................................................................... 267SQLMSG............................................................ 46,51,75,77,147SQLRTENV.................................................................... 214,217SQLRT.ENV.......................................................................... 217SQL_SNAP............................................................................ 264SQL_SNAP機能............................................................. 219,335SQL_SNAP機能の出力形式.................................................220SQL_SNAP機能の利用方法.................................................219SQLSTATE........................................................ 46,51,75,77,147SQLSTATE値およびメッセージの取得方法........................ 219SQL_TRACE..........................................................................265SQL埋込みCOBOLプログラムの作成方法............................ 72SQL埋込みCプログラムの作成方法....................................... 44SQL埋込みホストプログラム.................................................... 44SQL記述子.............................................................................244SQL記述子域...........................................................................94SQL記述子域のオクテット長................................................... 54SQL記述子域を操作するSQL文................................... 111,127SQLサーバ名.........................................................................242“SQLサーバ名”を指定したCONNECT文を実行する........... 10SQL手続き文の実行情報をファイルに出力する..................263SQL文の一覧......................................................................44,73SQL文の解放..................................................................102,111SQL文の数.............................................................................244SQL文の指定位置および指定順序...................................44,73SQL文の準備..................................................................101,110SQL文の条件を動的に変更して実行する............................118SQL文の使用範囲.................................................................337SQL文の情報をファイルに出力する..................................... 264SQL文の処理結果の確認.................................................. 51,77SQL文変数......................................................................101,110SQL文を使用しないコンパイル単位................ 185,188,203,205SQL文を使用するコンパイル単位..... 185,188,191,203,205,208SQL文を即時実行する.......................................................... 142SQL文を動的に変更して実行する..........................................97SQL記述子域.........................................................................107Symfoware/RDBの起動操作..........................................211,215

- 348 -

[T]TEMPORARY_INDEX_SIZE...............................................257TEMPORARY_TABLE_SIZE.............................................. 258TRAN_SPEC..........................................................................242TRAN_TIME_LIMIT............................................................ 243

[U]UNICODE.............................................................................. 199UNICODEを使用する場合のエンディアンの選択................. 84UNICODEを使用する場合のコード系の選択........................ 86USING記述子.......................................................................... 97USING句........................................................................... 96,136USING引数....................................................................... 97,138

[W]WAIT_TIME.......................................................................... 243WHENEVER文..............................................................51,52,77WHENEVER文の有効範囲....................................................78WORK_ALLOC_SPACESIZE..............................................248WORK_MEM_SIZE.............................................................. 248WORK_PATH........................................................................249

[あ]相手指定........................................................................... 97,107値指定...................................................................................... 96アプリケーション開発作業の流れ..............................................3アプリケーション開発の概要......................................................1アプリケーションで使用可能な文字コード系.......................... 15アプリケーションの起動...................................................214,217アプリケーションの起動(UNIX系の場合)............................. 211アプリケーションの起動(Windows(R)の場合)...................... 214アプリケーションの起動操作...........................................211,215アプリケーションのコンパイル・リンク..................................... 171アプリケーションの作成............................................................44アプリケーションの実行.......................................................4,210アプリケーションの設計...........................................................4,6アプリケーションをUNICODE環境で起動した時の注意事項25アプリケーションを起動するときの注意事項......................... 217アーカイブログファイル.......................................................... 271一意性............................................................................ 30,31,33一時表の使用方法.................................................................. 92インクルードファイル........................................................... 47,76埋込みCOBOLプログラムの場合............................................33埋込みCプログラムの場合.......................................................31埋込みSQL...............................................................................94埋込みSQL宣言節..............................................................46,74埋込みSQL宣言節の指定位置..........................................46,74埋込みSQLの概要.....................................................................1埋込み例外宣言............................................. 31,33,47,51,75,77埋込み例外宣言の指定位置............................................. 47,75エラーメッセージ............................................................. 267,328オクテット長...............................................................................54オブジェクト指向プログラミング機能........................................83オーバフローが発生した場合の処理....................................249

[か]拡張SQL文識別子..............................................................68,87拡張SQL文識別子の有効範囲..........................................69,88

拡張SQL文識別子を使用した動的SQL文の実行方法.... 68,87拡張カーソル.......................................................................70,88拡張カーソル名の有効範囲...............................................71,89拡張カーソル名を使用したカーソル操作.......................... 70,88拡張カーソルを使用したカーソル操作の使用例.......... 307,317拡張契機......................................................................... 256,334格納構造................................................................................ 228格納構造定義.......................................................................... 95格納構造の選択............................................................. 254,331可変長文字列のデータ操作.............................................. 55,79可変長文字列のデータ操作例...................................... 275,310環境変数................................................................................ 320環境変数と動作環境ファイルの実行パラメタの対応............320環境変数の設定............................................................. 171,193環境変数を設定する.......................................................212,215カーソル宣言.......................................................................47,75カーソル宣言とホスト変数の関係.......................................33,35カーソル宣言の指定位置...................................................47,75行識別子.................................................................................. 90行識別子の使用時の注意事項...............................................90クライアント..................................................................................1クライアント・サーバモデルの概要............................................ 1クライアント・サーバモデルの利用パターン..............................2クライアント用の動作環境ファイル........................................ 234クラスタサービス名.......................................................... 240,323クラス定義.................................................................................83結果USING句.......................................................................... 97言語種.................................................................................... 266言語種の選択............................................................................ 4構造体型標識変数の使用例................................................ 293構造体型ホスト変数の使用例............................................... 290構造体として宣言したホスト変数の使用方法.........................59構造体標識変数...................................................................... 62構造体ホスト変数の使用方法................................................. 60項目記述子域........................................................................ 107コネクション..............................................................8,11,192,209コネクションとSQL文の実行.....................................................11コネクションの接続方法............................................................. 8コネクションの変更................................................................... 12コネクションを意識しないデータ操作の方法.......................... 14個別のトレース情報を出力する......................................262,323コンパイル・実行時にサポートするSQL文............................ 337コンパイル時にデータベースを指定する.......................192,209コンパイル時のコネクション先の指定.............................192,209コンパイル単位..................................................184,187,202,205コンパイル・リンク.............................................................171,192コンパイル・リンクのための環境設定..............................171,193コンパイル・リンクの流れ................................................. 171,192コンパイル・リンクの方法...................................177,184,197,202コーディング............................................................................... 4コーディング規則................................................................ 44,72コード変換.............................................................................. 250コード変換指定に従わないもの.............................................. 24コード変換と文字列長............................................................. 21コード変換と文字列の拡大・縮小............................................21コード変換の考慮.................................................................... 18コード変換の発生条件............................................................ 18

- 349 -

コールバック関数..................................................................... 39コールバック関数の概要......................................................... 38コールバック関数の登録方法................................................. 40コールバック機能の利用方法................................................. 38コールバック機能の利用例................................................... 300

[さ]適化情報............................................................................ 227適化情報の更新................................................................ 226適化情報の更新契機........................................................ 226適化情報の出力................................................................ 228

作業用ソート領域............................................................247,334作業用テーブル..............................................................248,336作業用テーブル域..........................................................249,336作業用のディレクトリ構成................................................177,197サーバ........................................................................................ 1サーバとの接続情報..............................................................240サーバの種類と接続方法..........................................................2サーバの情報を定義する........................................................ 10サーバ用の動作環境ファイル名........................................... 241シグナル.......................................................................... 272,333シグナル操作........................................................................... 37シグナルの抑止....................................................................... 38システムコールを使用する場合の注意事項...........................36実行文の指定位置............................................................. 47,75集団項目繰り返し指定.............................................................81集団項目指定.......................................................................... 80集団項目の使用例................................................................ 314集団項目ホスト変数の記述方法............................................. 80出力DESCRIBE文..........................................................102,111準備可能文.............................................................................. 95状態コード........................................................................... 46,75状態変数................................................................... 46,51,75,77状態変数およびメッセージ変数の使用例..................... 305,314状態変数およびメッセージ変数の利用方法........................ 219状態変数の宣言................................................................. 46,75スキーマ名の変更..................................................................143スコープ..................................................................................273スナップファイル..............................................................219,264スレッド......................................................................................26静的リンクする場合に必要なオプション................................203静的リンクする場合に必要なオプション................................185静的リンクする場合のコンパイル・リンク.........................184,202セション.................................................................................. 6,26セションID...................................................................26,220,224セションとスレッドの使用方法.................................................. 27接続サーバ種別.................................................................... 242占有の単位....................................................... 258,259,324,332占有モード.......................................................................258,324ソート作業域....................................................................249,336

[た]ダミーSQLSignalMSG関数のライブラリ作成................. 166,168単一行SELECT文....................................................................90ダンプ出力先ディレクトリ.................................................262,323通信データを暗号化する場合の設定.....................................25通信方法................................................................................ 241通信方法とSERVER_SPECの指定...........................................2

通信方法の選択........................................................................ 2ディレクトリ構成............................................................... 177,197テストドライバの作成および単体テストの実施...................... 163テストドライバの実行形式作成....................................... 164,168デバッグ..................................................................................218デフォルトロール...................................................................... 91データ資源名......................................................................... 242データ操作のSQL文の選択......................................................4データ操作の範囲を限定する場合の注意事項...................273データ操作範囲の限定方法................................................. 273データ操作文に関する注意事項............................................ 38データベース名の変更.......................................................... 143“データベース名”を指定したCONNECT文を実行する.......... 9動作環境のチューニングの優先順位...................................320動作環境ファイルの記述形式............................................... 233動作環境ファイルを指定する......................................... 214,217動的FETCH文........................................................................140動的OPEN文..........................................................................140動的SELECT文を準備して実行する............... 103,113,120,129動的SQL...................................................................................94動的SQLを利用するアプリケーションの作成......................... 94動的単一行SELECT文を準備して実行する... 106,117,125,135動的パラメタ指定..................................................................... 96動的プログラム構造(DLOAD)オプション..............................218動的プログラム構造のアプリケーション実行時の注意事項.213動的プログラム構造のコンパイル・リンク........................ 191,207動的ライブラリを使用して登録する方法................................. 41動的リンクする場合に必要なオプション...........188,191,206,208動的リンクする場合のコンパイル・リンク.........................187,205トランザクション.................................................................... 4,149トランザクションの対処方法............................................ 242,335

[な]名前の一意性と有効範囲........................................................30日本語可変長文字列のデータ操作....................................... 55日本語可変長文字列のデータ操作例................................. 281日本語文字使用時の注意事項.............................................. 53入力DESCRIBE文..........................................................119,128ネットワーク構成を設定する.................................................. 215

[は]配列型標識変数の使用例.................................................... 294配列指定の標識変数.............................................................. 62バッファサイズ................................................................. 239,247パラメタUSING句..................................................................... 97被準備文.................................................................................. 95被準備文を実行する.......................................................136,138標識変数............................................................................. 47,76標準関数................................................................................ 156標準シェルプロシジャ............................................................ 178表宣言................................................................................. 47,76ファンクションルーチンからの異常通知................................ 161ファンクションルーチンの実行...............................................159ファンクションルーチンのライブラリ作成........................ 164,168ファンクションルーチンを利用する........................................ 150ファンクションルーチンを利用するアプリケーションの作成の流

れ............................................................................................ 150複数コネクション.......................................................................11

- 350 -

複数のコンパイル単位....................................................184,202プロシジャルーチン内での処理結果の確認........................ 147プロシジャルーチンの実行....................................................144プロシジャルーチンの処理結果............................................147プロシジャルーチンの呼出し元での処理結果の確認......... 148プロシジャルーチン利用時のトランザクション.......................149プロシジャルーチンを利用する............................................. 144プロシジャルーチンを利用するアプリケーションの作成の流れ144プロセスID....................................................................... 220,224プロセスの生成方法................................................................ 36ポインタ型ホスト変数(BLOB型)の使用例............................ 289ポインタ型ホスト変数(可変長文字列型)の使用例............... 288ポインタ型ホスト変数(文字列型)の使用例........................... 287ポインタ変数として宣言したホスト変数の使用方法................55ポインタ変数の使用方法......................................................... 58ポインタ変数のデータ領域の設定とサイズ.............................55ホスト言語................................................................................. 44ホスト言語を混在する場合の注意事項...................................24ホスト変数........................................................ 31,34,46,47,74,76ホスト変数および標識変数の指定方法............................. 47,76ホスト変数の宣言................................................................ 46,74ホスト変数のデータ型............................................................ 343ホスト変数の長さ...................................................................... 54ホスト変数へ入出力するデータの文字コード系の考慮......... 48ホスト変数を使用する場合の注意事項...................................48ホスト名................................................................................... 242ポート番号.............................................................................. 242

[ま]待ち時間.................................................................................243マルチスレッド環境.................................................................. 31マルチスレッド環境で動作するSQL埋込みCOBOLプログラムを

コンパイル・リンクする......................................................180,199マルチスレッド環境で動作するアプリケーションの例....296,312マルチスレッド環境で動作するアプリケーションを作成する場合

の注意事項..................................................................... 300,313マルチスレッド環境でのホスト変数の宣言..............................49マルチスレッド環境におけるデータ操作.................................25メッセージ変数.......................................................... 46,51,75,77メッセージ変数の宣言........................................................ 46,75文字コード系......................................... 48,178,181,198,199,200文字コード系ごとの使用できる文字列長................................ 23文字コード系における1文字のバイト数.................................. 21文字コード系の決定................................................................ 15文字コード系の考慮................................................................ 15

[ら]ライブラリで使用可能な標準関数......................................... 156ライブラリとして登録するCプログラムのコンパイル・リンク.... 156ライブラリとして登録するCプログラムの作成方法.................150ライブラリの作成.....................................................................150ライブラリを作成する場合の注意事項.................................. 159リカバリ水準.....................................................................267,332リモートアクセス.......................................................................... 1リモートアクセスする場合の注意事項..................................... 25リンクするライブラリの再設定..........................................167,169リンクするライブラリの設定.....................................................167ルーチンスナップファイル......................................................223

ルーチンを利用するアプリケーションの作成........................144ローカルアクセス........................................................................ 1ロードモジュール.............................................................171,193ロール使用時の記述方法....................................................... 91

- 351 -