Comments
Description
Transcript
チュートリアル
組み込みデータベース Entier チュートリアル 株式会社 日立製作所 ソフトウェア事業部 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. ご使用になる前に 本書をご使用になる前に,次の内容をご一読しご理解いただいてから,本書をご使用くだ さい。 当社は,本書について一切の責めを負わないものとします。また,当社及び本書の著作 権者は,本書に関し,お客様に生じた損害に対する賠償その他一切の責めを負わないもの とします。 お客様は,自己の負担と責任により,本書のサンプルプログラムを複製及び改変するこ とができます。ただし,当該改変部分について,当社は,補修,損害賠償その他一切の責 任を負わないものとします。 当社は,本書の内容,サンプルプログラム及びお客様が作成したサンプルプログラムの 改変物に関するサポートサービスは一切行っておりません。 本書の内容は,特定の設定に基づいた環境を使用して再現される一例であり,開発環境 や開発ツールとして本書で使用する当社製品以外のソフトウェアに対する当社製品の動 作保証をするものではありません。 本書のサンプルプログラムについて,その脆弱性並びにお客様が開発に使用するソフト ウェア及び開発するソフトウェア並びに実装する機器に対する適合性を,当社は一切保証 しません。 本書は予告なく内容を変更することがあります。 本書に掲載されているサンプルプログラム,スクリプト,実行結果を記した画面イメー ジなどは,特定の設定に基づいた環境を使用して再現される一例です。 本書に関する著作権は当社及び本書の著作権者にあり,本書のすべての内容は著作権法 に基づいて保護されています。そのため,サンプルプログラムを除き,お客様は,本書の 全部又は一部を複製及び改変することはできません。 お客様は,本書の全部若しくは一部を単独で,又は他の製品と組み合わせ,若しくは他 の製品の一部として,直接又は間接に次の各号に該当する取扱いをする場合,「外国為替 及び外国貿易法」の規制及び米国輸出管理規則等外国の輸出関連法規を確認の上,必要な 手続をとるものとします。 (1)輸出するとき。 (2)海外へ持ち出すとき。 (3)非居住者へ提供し,又は使用させるとき。 (4)前3号に定めるほか,「外国為替及び外国貿易法」又は外国の輸出関連法規に定 めがあるとき。 他社所有名称に対する表示 • Microsoft は,米国及びその他の国における米国 Microsoft Corp.の登録商標です。 • Windows は,米国及びその他の国における米国 Microsoft Corp.の登録商標です。 • Visual Studio は,米国及びその他の国における米国 Microsoft Corp.の登録商標です。 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 発行 2006 年 6 月(第 1 版) 2008 年 9 月(第 7 版) 著作権 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. はじめに このチュートリアルでは,HiRDB Embedded Database Entier(以降,Entier といいます。)の API である ECLI 関数の使い方を中心に,サンプルプログラムを解説する形式で Entier を使 用するアプリケーションの作り方を説明します。 対象読者 • リレーショナルデータベースに関する初歩的な知識を有する方。 • C 言語に関する知識を有する方(少なくともポインタや構造体などについて理解してい ること)。 本書での表記 本書では,次のように記述しています。 製品名称の表記 製品名 HiRDB Embedded Database Entier Microsoft(R) Visual Studio(R) Microsoft(R) Windows(R) 2000 Professional Operating System Microsoft (R) Windows (R) XP Professional Operating System 表記 Entier Visual Studio Windows 2000 Windows Windows XP 機能名の表記 機能名 Entier Control Manager Entier Call Level Interface 表記 ECM ECLI 関連用語の表記 関連用語 Application Program Application Program Interface Database Management System dynamic link library Graphical User Interface Hard Disk Drive Operating System Relational Database Management System 表記 AP API DBMS dll GUI HDD OS RDBMS 本書で使用している記号 Windows の操作説明で使う記号 記号 意味 [ ] ボタンやテキストボックスなど,画面に表示されている要素を示します。 [ ]-[ ] 画面に表示されるメニューやアイコンなどを選択する操作を示します。 I All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 目次 1. 2. 3. 4. Entier とは? ................................................................................................................ 1 1.1 Entier の特長 ......................................................................................................... 1 1.2 Entier のシステム構成........................................................................................... 2 必要なものを確認してみよう ........................................................................................ 4 2.1 ハードウェア.......................................................................................................... 4 2.2 ソフトウェア.......................................................................................................... 4 2.3 Entier.....................................................................................................................4 2.4 Visual Studio 2005(コンパイラ・リンカ)......................................................... 6 サンプルを使用するための準備をしてみよう ............................................................... 7 3.1 サンプルを使用するまでの流れ ............................................................................. 7 3.2 Entier のインストール........................................................................................... 9 3.3 ECM(Entier Control Manager)を起動してみよう ......................................... 10 3.4 運用ディレクトリの構成 ...................................................................................... 11 3.5 DB を初期化しよう .............................................................................................. 11 3.6 表を定義しよう .................................................................................................... 14 3.7 インデックスを定義してみよう ........................................................................... 17 3.8 データをインポートしよう .................................................................................. 19 3.9 Entier を切り離そう ............................................................................................ 22 3.10 Visual Studio 2005 を設定しよう........................................................................ 23 3.11 プロジェクトを作成しよう............................................................................... 23 3.12 プロジェクトを設定しよう............................................................................... 26 3.13 サンプルプログラムをコンパイルしよう ......................................................... 29 3.14 とにかくサンプルプログラムを実行してみよう............................................... 30 サンプルプログラムを実行しよう............................................................................... 32 4.1 実行する前に........................................................................................................ 32 4.2 サンプルプログラムの使い方............................................................................... 32 4.3 サンプルプログラムの流れ .................................................................................. 34 4.4 SQL を実行しよう................................................................................................ 35 4.5 サンプルプログラム ............................................................................................. 35 4.6 接続しよう ........................................................................................................... 42 4.7 SQL の文ハンドルを確保しよう .......................................................................... 42 4.8 SQL 文を準備しよう ............................................................................................ 43 4.9 列結合をしよう .................................................................................................... 44 4.10 入力パラメタを設定しよう............................................................................... 45 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 5. 6. 7. 4.11 SQL 文を実行しよう ............................................................................................ 47 4.12 行を取り出そう................................................................................................. 48 4.13 カーソルを閉じよう.......................................................................................... 49 4.14 文ハンドルを解放しよう .................................................................................. 50 データベースのチューニングをしてみよう................................................................. 51 5.1 チューニングとは................................................................................................. 51 5.2 インデックスを使用しよう .................................................................................. 52 5.3 バッファを設定しよう.......................................................................................... 56 5.4 チューニングの効果を確認しよう........................................................................ 58 5.5 効果的にチューニングをしよう ........................................................................... 61 トラブルシューティング ............................................................................................. 69 6.1 トラブルシューティングの概要 ........................................................................... 69 6.2 トラブルシュート情報.......................................................................................... 70 6.3 トラブルシュート情報の見方と対処方法 ............................................................. 71 応用編:空間検索をしよう.......................................................................................... 75 7.1 サンプルを実行しよう.......................................................................................... 75 7.2 GEOMPOINT 型 ................................................................................................. 78 7.3 図形情報の入力の流れ.......................................................................................... 79 7.4 スカラ関数 WITHIN() ......................................................................................... 80 7.5 スカラ関数 REGIONBUFFER().......................................................................... 81 7.6 図形情報(矩形)................................................................................................. 83 7.7 図形情報(円形)................................................................................................. 83 7.8 バッファ図形の中心線情報(折れ線)................................................................. 84 7.9 図形情報とバイナリ型(e_rdb_BINARY_t)...................................................... 85 7.10 CONDITION 指定 .............................................................................................. 87 7.11 execRECTANGLE()の実行 .................................................................................. 88 7.12 execCIRCLE ()の実行 .......................................................................................... 89 7.13 execREGIONBUFFER ()の実行.......................................................................... 90 7.14 空間検索その他いろいろ ...................................................................................... 91 7.15 空間検索まとめ.......................................................................................... 92 付録 A.1. メモリリソース構造の概要........................................................................ 94 付録 A.2. ストレージリソース構造の概要................................................................. 96 付録 B.1. 参照時のデータベースアクセスの流れ...................................................... 98 付録 B.2. 更新時のデータベースアクセスの流れ.................................................... 100 付録 C.1. DB と AP のデータの受け渡し................................................................ 102 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 1. Entier とは? Entier は,組み込み機器でリレーショナルデータベースを利用できるようにするデータベー ス管理システム(DBMS :Database Management System)です。 リレーショナルデータベースは,データ表現が表形式でわかりやすく,さらにデータベース の操作には SQL 言語を使用するため,簡単かつ柔軟なデータ操作ができるようになります。 大規模化した組み込み機器に Entier を適用することで,複雑なデータ管理をアプリケーシ ョンプログラムから独立することが可能になり,組み込みシステム開発の生産性を向上でき ます。カーナビゲーション,HDD レコーダー,および携帯電話などで利用できる組み込み 機器に適しています。 1.1 Entier の特長 Entier には,次に示す特長があります。 軽量 約 700KB 程度のロードサイズと軽量なので,携帯電話などのハードウェアリソース制限 が厳しい組み込み機器に適したリレーショナルデータベース管理システムです。 高速 わずか数 100ms オーダで約 200 万件のデータから目的の 1 件を素早く検索できる性能も 兼ね備えています。また,母体データ件数が増加しても,検索性能低下を最小限に抑える など,数 100~数 1000 万件程度の大容量データ管理にも適しています。 高信頼性 データ更新中に突然,電源が遮断されても,ファイルシステムやデータベース管理システ ムのレイヤー双方でデータを保護できます。また,次回起動時には自動修復します。 強力な検索機能で,アプリケーション開発容易性が向上 カーナビゲーション,ポータブルミュージックプレーヤー,制御機器,および携帯電話な どのアプリケーションの特徴に合わせ,インクリメンタル検索機能,空間検索機能,部分 1 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 一致検索機能,別名検索機能など高付加価値な機能群を,国際標準の SQL でアプリケー ションから簡単に利用できます。 1.2 Entier のシステム構成 Entier では,データベース機能をライブラリで提供しており,アプリケーションの実行タス ク上で動作します。ライブラリには,開発環境用ライブラリとターゲットシステム用ランタ イムライブラリがあります。 開発環境用ライブラリおよびターゲットシステム用ランタイムライブラリでは,表やインデ ックスを定義する定義系 SQL,データベースを操作する操作系 SQL など,Entier が提供す るすべての SQL 機能が利用できます。 また,ターゲットシステム用ランタイムライブラリでは,トラブルシュート機能の有無で 2 種類のランタイムライブラリを目的に応じて利用できます。Entier のシステム構成を次の図 に示します。 図 1-1 1. Entier のシステム構成 AP(アプリケーションプログラム) AP は C 言語,C++言語または Java 言語で作成します。データベースを操作するには,C 言語または C++言語の場合は ECLI 関数を,Java 言語の場合は JDBC を利用します。 2. 開発環境用ライブラリおよびターゲットシステム用ランタイムライブラリ 2 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. AP から指示された ECLI 関数を実行し,検索,更新,追加,削除などのデータベース操 作を行います。 3. ファイルシステム 開発環境では OS 標準のファイルシステム(FAT32 または NTFS)を利用して,ターゲッ トシステムでは Entier ファイルシステムを利用します。 4. データベース Entier が利用するデータベースを,運用ディレクトリといいます。このディレクトリ(フ ォルダ)下に格納されているファイル群を一つのデータベースとして扱います。 3 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 2. 必要なものを確認してみよう このチュートリアルでは,Entier の開発環境でサンプルプログラムを使用してアプリケーシ ョンの作成方法を説明します。必要なものを確認しましょう。 図 1-2 チュートリアルに必要なもの Entier ライブラリ(dll) ユーティリティ(ECM) インストール サンプルプログラムソース サンプルデータ Visual Studio 2005 2.1 ハードウェア このチュートリアルで使用するハードウェアとして,次のものが必要です。 • 2.2 チュートリアル実習用 PC(適用 OS:Windows 2000,Windows XP):1 台 ソフトウェア このチュートリアルで使用するソフトウェアとして,次のものが必要です。 • Entier(バージョン 02-00 以降) 本書の内容はバージョン 02-02 に合わせています。しかし, 本書の説明に支障のない場合, キャプチャ画像などは,一部バージョン 02-00 のものを使用しています。 • 2.3 Visual Studio 2005 Entier PC に Entier をインストールすると,インストールディレクトリ下に,ライブラリ,ユーテ ィリティ,サンプルプログラムのソース,およびサンプルデータが入っています。インスト ール後のディレクトリ構成を次に示します。 4 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. %INSTDIR% ├¥bin │ ├¥client┬¥include │ └¥lib ├¥fs─¥include │ ├¥model │ ├¥sample │ │ │ ├¥ecli │ ├¥gsp │ ├¥jdbc │ │ │ └¥sampledb ├¥manual │ └¥readme.txt (1) :Entier のインストールディレクトリです。 :使用するタスクモデルおよび文字コードの開発環境用ライブラリおよび ユーティリティを格納するディレクトリです。 :ユーザー提供ヘッダファイルを格納するディレクトリです。 :ユーザー提供ライブラリを格納するディレクトリです。 :Entier ファイルシステムのインターフェースを定義したヘッダファイルを 格納するディレクトリです。(体験版には付属していません。) :各タスクモデル,文字コードの開発環境用ライブラリおよびユティリテ ィを格納するディレクトリです。 :サンプルプログラムやサンプルデータベースを格納するディレクトリで す。 :ECLI 関数を使用したサンプルプログラムを格納するディレクトリです。 :空間検索距離補正関数のサンプルプログラムを格納するディレクトリで す。 :Entier JDBC ドライバを使用したサンプルプログラムを格納するディレク トリです。 :サンプルデータを格納するディレクトリです。 :Entier のマニュアル(HTML Help,HTML マニュアル,PDF マニュアル) を格納するディレクトリです。 :インストールディレクトリの各ディレクトリ,ファイルの詳細が書かれ ているリードミーファイルです。詳細はこちらをご参照ください。 ライブラリ(dll) 開発環境が Windows の場合,Entier の各機能はライブラリ群(dll:ダイナミックリンクライ ブラリ)として提供されます。このチュートリアルでは Shift-JIS 版のライブラリを使用しま す。Entier の API である,ECLI 関数も含まれます。 (2) ユーティリティ(ECM) GUI運用支援Entier Control Manager(edecm)は,Entierアプリケーション開発時,各種ユー ティリティの実行をGUI(Graphical User Interface)で支援します。Entier Control Managerは, 開発環境がWindowsの場合だけ使用できます。次の表にEntierのユーティリティを示します。 表 1-1 Entier のユーティリティ ユーティリティ名 データベース初期設定ユーティリティ (edinit) データベース構成変更ユティリティ (edmod) データインポートユーティリティ (edimport) データエクスポートユーティリティ (edexport) データベース再編成ユーティリティ (edreorg) インデックス再作成ユーティリティ (edidxrmk) 説明 開発環境上のファイルを Entier のデータベースとして使用す るため,データベースの初期設定をします。運用ディレクト リも作成します。 DB エリアの追加および削除を行います。 テキスト形式でユーザーが用意したデータを,表に入力しま す。 表のデータを,テキスト形式(csv のような形式)でファイル に出力します。 表に対するデータの削除・更新・追加などで,データの物理 的な配置が乱れてしまった状態を,最適な状態に配置し直し ます。 無効状態のインデックスを再作成して,使用可能な状態にし ます。 5 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. ユーティリティ名 SQL 実行ユーティリティ (edsqlexe) マッピング表操作ユーティリティ (edmapmng) データベース状態解析ユーティリティ (eddbsta) データベース差分抽出ユティリティ (eddbdiff) 説明 Entier が管理するデータベースに対して会話形式で SQL を実 行できる,会話型 SQL 実行プログラムです。コマンドライン やファイルから SQL を入力し,その実行結果をコマンドライ ン上,またはファイルに出力します。 絞り込みインデックスで使用する文字をマッピング表へ登録 します。 また,マッピング表の登録内容を取得します。 データベースの状態を解析します。 データベースの差分情報を抽出します。 ユーティリティの詳細については,マニュアル「Entier ユティリティ編」を参照してくださ い。 (3) サンプルプログラムのソースとサンプルデータ このチュートリアルでは,次に示すサンプルプログラムのソースとサンプルデータを使用し ます。これらは,Entier 体験版サイトから別途ダウンロードしてください。 (a) サンプルプログラムのソース サンプルプログラムのソースは C 言語で記述されています。このチュートリアルでは,C 言 語または C++言語用に開発された ECLI 関数を使った例で説明します。 なお,このチュートリアルでは,わかりやすく説明するために,インストールしたとき,Entier に付属しているものとは若干異なるサンプルプログラムのソースやサンプルデータを使用 します。 ecli_tutorial01.c 操作系 SQL を実行する簡単なサンプルです。 sample_sql.txt ecli_tutorial01.c を実行するために使用する定義系 SQL です。本チュートリアルで使用す る表 sample とインデックスを定義できます。ただし,このファイルを直接使用すること はありません。単なる SQL のサンプルです。 (b) サンプルデータ sample.txt ecli_tutorial01.c を実行するために使用する表 sample にインポートするデータです。ユーテ ィリティを使用してインポートします。 2.4 Visual Studio 2005(コンパイラ・リンカ) このチュートリアルでは,C 言語で記述したサンプルプログラムのソースをコンパイルし, コンパイル結果と Entier のライブラリ(dll)をリンクするために,Visual Studio 2005 を使用 します。 6 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3. サンプルを使用するための準備をしてみよう この章では,サンプルプログラムを使用するために,Entier と Visual Studio 2005 に必要な設 定について説明します。 3.1 サンプルを使用するまでの流れ Entier でサンプルプログラムを使用するためは,次の図に示す手順でサンプルプログラムを 準備します。なお,3 章で定義した表は,4 章のサンプルプログラムの実行で使用します。 図 3-1 サンプルプログラムを使用するまでの流れ 1.インストール 2.運用ディレクトリの作成 3.DBの初期化 4.表の定義 5.データのインポート 6.Visual Studio 2005の設定 7.サンプルプログラムの実行 上で示したサンプルプログラムを使用する手順をそれぞれ説明します。 1. インストール Entier をインストールします。「3.2 2. Entier のインストール」を参照してください。 運用ディレクトリの作成 Entier のデータベースであるディレクトリを作成します。ただし、次の「DB の初期化」 によって自動的に作成されます。あらかじめ作成しておく必要は特にありません。運用デ ィレクトリについては,「3.4 3. 運用ディレクトリの構成」を参照してください。 DB の初期化 7 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. ECM を使用してデータベースを初期化します。「3.5 DB を初期化しよう」を参照して ください。 4. 表の定義 サンプルプログラムで使用する表を定義します。表の定義では,表名,列名,および列の データ型などを定義します。「3.6 表を定義しよう」を参照してください。 5. データのインポート 定義した表へデータをインポートします。表は「,」で区切られたテキスト形式のファイ ルです。「3.8 6. データをインポートしよう」を参照してください。 Visual Studio 2005 の設定 サンプルプログラムの実行は,Visual Studio 2005 を使用して,プロジェクトをコンパイ ル・実行します。「3.10 Visual Studio 2005 を設定しよう」では,プロジェクトの作成お よびコンパイルの手順を説明します。「3.11 プロジェクトを作成しよう」を参照してく ださい。 7. サンプルプログラムの実行 サンプルプログラムをコンパイルしてプログラムを実行する手順を説明します。「3.13 サンプルプログラムをコンパイルしよう」,「3.14 とにかくサンプルプログラムを実行 してみよう」を参照してください。 サンプルプログラム「ecli_tutorial01.c」を実行する場合を例に,データの流れを次の図に示 します。 図 3-2 サンプルプログラムを使用する場合のデータの流れ Entier Visual Studio 2005 定義系SQL のサンプル sample_sql .txt サンプル インポート データ sample.txt サンプル プログラム ecli_tutor ial01.c ECM(Entier Control Manager) ECLI関数 インポート ライブラリ edwecli.li b Visual Studio2005 開発環境 アプリケーションの オブジェクト 運用ディレクトリ データ HDD リンク Entierの dll 主メモリ サンプルプログラムを実行するためには,Entier の ECM で運用ディレクトリに表を定義して, 表データをインポートします。次に,Visual Studio 2005 でサンプルプログラムをコンパイルしま す。コンパイルで作成されたサンプルプログラムのオブジェクトは,Entier のライブラリとリン ケージしてビルドします。そして,ビルドされたアプリケーションのオブジェクトを Entier に接 8 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 続すると,運用ディレクトリの表データを操作できます。 3.2 Entier のインストール 次に,Entier 体験版のインストールについて説明します。 1. ダウンロードしたディレクトリから「setup.exe」ファイルをダブルクリックします。 体験版セットアップウィザードが起動します。 2. [次へ(N)]ボタンをクリックします。 「使用許諾契約」を読み,同意できる場合は[使用許諾契約の条項に同意します]ラジ オボタンを選択します。 3. [次へ(N)]ボタンをクリックします。 「ユーザ情報」画面が表示されます。 4. 「ユーザ名」および「会社名」を入力して[次へ(N)]ボタンをクリックします。 「インストール先の選択」画面が表示されます。 5. インストール先のディレクトリを指定して[次へ(N)]ボタンをクリックします。 インストール先のディレクトリは「C:¥Program Files」になっています。それ以外のデ ィレクトリをインストール先に指定する場合は,[参照(R)]ボタンをクリックして,任 意のディレクトリを指定します。 6. 「プログラムフォルダの選択」画面で,プログラムアイコンを追加するディレクトリを 指定します。 「プログラムフォルダ」は「HiRDB Embedded Database Entier vv-rr-T1」が入力されてい ます。それ以外のディレクトリを指定する場合は「既存のフォルダ」リストから選択し ます。 (vv-rr の部分はバージョンごとに異なります。 ) 7. インストールするタスクモデルを選択します。 [Single task model]にチェックして, [次へ(N)]ボタンをクリックします。 なお,体験版では[Single task model]だけが選択可能です。 8. 「文字コードの選択」画面で[Shift-JIS]ラジオボタンにチェックして[次へ(N)]ボタ ンをクリックします。 このチュートリアルでは,Shift-JIS版を使用して説明します。 9. 「ファイルコピーの開始」画面で設定した内容を確認し,問題がなければ[次へ(N)] ボタンをクリックします。 正常にインストールできると「インストール完了」画面が表示されます。 9 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3.3 ECM(Entier Control Manager)を起動してみよう 「3.1 サンプルを使用するまでの流れ」では,サンプルプログラムを実行するまでの流れ とインストールの手順を説明しました。 インストールができたら, Entier を起動しましょう。 この節では,運用ディレクトリの作成とデータベースの初期化について説明します。 ECM(Entier Control Manager)を起動するには,[スタート]-[プログラム]-[HiRDB Embedded Database Entier vv-rr]-[Entier Control Manager]を選択します。(vv-rrの部分は バージョンごとに異なります。) Entier を起動すると次の画面が表示されます。 図 3-3 ECM の起動画面 作業選択ビュー 作業ビュー DB表情報ビュー メッセージビュー Entier Control Manager の画面は四つのビューから構成されています。 • 作業選択ビュー 作業ビューに表示するビューを選択します。 • 作業ビュー 作業選択ビューで選択されたビューを表示します。データベースの作業をするための情報 が表示されます。 • DB 表情報ビュー 接続中のデータベースの情報が表示されます。接続していない場合は,何も表示されませ ん。 • メッセージビュー ユーティリティの実行結果,および SQL の実行結果が表示されます。 10 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3.4 運用ディレクトリの構成 運用ディレクトリとは,Entier で使用するデータベースファイルやシステムファイルなどを 格納するディレクトリのことです。 運用ディレクトリの基本的な構成を次の図に示します。説明するファイルの中には,設定な どによって作成されないものもあります。 図 3-4 運用ディレクトリの構成 各ファイルやディレクトリの内容の詳細は,マニュアル「Entier 3.5 運用編」 を参照してください。 DB を初期化しよう 最初に DB を初期化します。DB の初期化とは,運用ディレクトリを開発環境の中に作成す ることです。 サンプルで使用する運用ディレクトリを作成する例を示します。指定する各値は,一例です。 11 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 1. 作業選択ビューから「DB 初期化」をクリックします。 2. 運用ディレクトリを指定します。例では,「d:¥eddir」を指定します。 3. DB エリアを指定します。例で指定する値を,次の表に示します。 表 3-1 DB エリアの設定値 種別 データ用 バイナリデータ用 作業表用 領域サイズ(MB) 10 10 - ページサイズ(B) 4096 4096 4096 セグメントサイズ 8 8 8 (凡例) -:指定できません。 12 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 注意 この例では,DB エリア名を指定する必要はありません。そのため,[DB エリア名]の チェックは不要です。 4. 「初期化オプション」の[運用ディレクトリ下のファイルを削除してから初期化する] チェックボックスをチェックします。 5. 「領域サイズの単位」をラジオボタンで指定します。例では,[MB]ラジオボタンを 選択します。 6. [DB初期化(E)]ボタンをクリックします。 次のダイアログが表示されます。 7. [OK]ボタンをクリックします。 次のダイアログが表示されます。 メッセージビューに「DB 初期化が正常に終了しました。」が表示されると,DB の初期化 は完了です。 13 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3.6 表を定義しよう サンプルプログラムを使用するためには,あらかじめ,表を定義する必要があります。表の 定義では,表の列名ごとにデータ型およびデータ長を設定します。ここでは例として,運用 ディレクトリ「d:¥eddir」に作成した DB へ,次のように表「SAMPLE」を定義します。表の 定義は,サンプルプログラム「ecli_tutorial01.c」で使用します。 CREATE TABLE SAMPLE( PREF_CODE PREF ZIPCODE ADDRESS ); INT, VARCHAR(10), CHAR(7), VARCHAR(30) 次に,表定義の手順について説明します。 1. [接続(A)]-[接続(A)]を選択します。 「Entier への接続」ダイアログが表示されます。 14 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 2. 「運用ディレクトリ」および「ユーザ ID」は,例では次のように入力します。 運用ディレクトリ:d:¥eddir ユーザ ID:USER1 パスワード:入力不要です。 3. [接続(A)]ボタンをクリックします。 メッセージビューに「Entier に接続しました。」と表示されます。 4. 作業選択ビューから[表,インデクス定義]を選択します。 5. [表定義]タブを選択します。 6. [表識別子]に表名を指定します。例では,「SAMPLE」を指定します。 15 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7. [列情報]に列の定義を入力します。例では,次の表のように4行指定します。 表 3-2 列情報の設定値 列名 PREF_CODE PREF ZIPCODE ADDRESS データ型 INT VARCHAR CHAR VARCHAR データ長 - 10 7 30 (凡例) -:指定できません。 8. 作業ビューの[定義実行(E)]ボタンをクリックします。 16 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. [メッセージビュー]に「表を定義しました。」というメッセージが表示されます。 これで表の定義は完了です。 3.7 インデックスを定義してみよう インデックスは,検索性能を向上する手段として非常に重要なものです。この3章~4章で 使用するサンプルをそのまま使用する場合,データ件数が少ないため,特に定義する必要は ありませんが,ここで定義のしかたを紹介します。 表とインデックスは,SQL によって定義することができます。前節では,表「SAMPLE」を ECM の表,インデックス定義機能を使用して定義しました。ここでは, インデックスを SQL で定義する例を紹介します。 次に,インデックス定義の手順について説明します。 1. 作業選択ビューから[SQL 操作]をクリックします。 17 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 2. 以下のインデックス定義を下図のように,SQL 入力ビューに入力します。 CREATE INDEX IDX_PREF_CODE ON SAMPLE(PREF_CODE)EMPTY; 3. [実行(E)]ボタンをクリックします。 メッセージビューに,以下のように「SQL が正常終了しました。」が表示されると,インデ ックスの定義は完了です。 これにより,表「SAMPLE」の列「PREF_CODE」に対する検索では,B-Tree インデックス を使用します。 18 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3.8 データをインポートしよう 表を定義できたら,表にデータを挿入します。チュートリアルでは,「sample.txt」のテキス トデータを表に入れます。必要に応じて異なる内容やデータ件数で動作を確認してみてくだ さい。 「sample.txt」のテキストデータを次の図に示します。 図 3-5 「sample.txt」のテキストデータ 表定義直後は,表にデータが入っていません。定義した表に「sample.txt」のテキストデータ を入れると,次の図のように表にデータが挿入されます。 19 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 図 3-6 データを表へインポートするイメージ 表定義後 PREF_CODE PREF ZIPCODE ADDRESS 「sample.txt」のデータを入れた後 PREF_CODE PREF ZIPCODE ADDRESS 1 北海道 0608588 札幌市中央区 2 青森県 0308570 青森市長島 3 岩手県 0208570 盛岡市内丸 4 宮城県 9808570 仙台市青葉区本町 5 秋田県 0108570 秋田市山王 … … … … 手順を次に示します。 1. 「sample.txt」ファイルを「D:¥Sample」ディレクトリの下にコピーします。 2. 「作業選択ビュー」から[データインポート]を選択します。 20 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3. [入力データファイル]に「D:¥Sample¥sample.txt」を指定します。 4. 対象表を次のように選択します。 • スキーマ名:USER1 • 表識別子:SAMPLE 5. [入力データファイル]形式として,[DAT 形式]ラジオボタンを選択します。 6. [データインポートモード]として, [作成モード]ラジオボタンを選択します。 [インポート(E)]ボタンをクリックします。 「メッセージビュー」に「データインポートが正常に終了しました。」というメッセージが 表示されます。 以上で ECM での設定は完了です。 21 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3.9 Entier を切り離そう ECM を使用した DB 構築が終わったら,接続中の運用ディレクトリから ECM を切り離し ます。Entier から切断する手順を次に示します。 1. メニューから[接続(A)]-[切り離し(D)]を選択します。 メッセージビューに「Entier を切り離しました。」というメッセージが表示されているこ とを確認します。 注意 「3.10 Visual Studio 2005 を設定しよう」に作業を進める前に,必ず ECM を切り離して から,サンプルプログラムを実行してください。ECM で Entier に接続した状態でサンプ ルプログラムを実行するとエラーになります。 22 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3.10 Visual Studio 2005 を設定しよう 表を作成したら,Visual Studio 2005 を設定します。以降では,Visual Studio 2005 の設定から, プログラムを実行するまでの手順を説明します。 3.11 プロジェクトを作成しよう 一つのサンプルプログラムは,一つのプロジェクトでコンパイル・実行できるように作られ ています。ここで紹介するものとは別のサンプルプログラムを使用する場合は,別途プロジ ェクトの作成から,コンパイル・実行する環境を作成するか,ここで作成するプロジェクト に追加したソースファイルを入れ替えるなどの作業を行ってください。 以降では,Entier を「C:¥Program Files¥HITACHI¥Entier」にインストールしたものとして説 明をします。 1. Visual Studio 2005 を起動します。 2. メニューから[ファイル(F)]-[新規作成(N)]-[プロジェクト(P)]を選択します。 23 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 「新しいプロジェクト」ダイアログが表示されます。 3. 「プロジェクトの種類(P)」から[Visual C++]を選択します。 4. 「テンプレート(T)」の[Win32 コンソールアプリケーション]を選択します。 5. 「プロジェクト名(N)」を指定します。例では,「Sample01」と入力します。 6. 「場所(L)」にプロジェクトを作成するディレクトリを指定します。例では, [参照]ボ タンをクリックして,「D:¥Sample」を指定します。 7. 「ソリューションのディレクトリを作成(D)」チェックを外す。 8. [OK]ボタンをクリックします。 「Win32 アプリケーションウィザード」画面が表示されます。 24 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 9. [次へ]ボタンをクリックします。 「アプリケーションの設定」画面が表示されます。 10. 「アプリケーションの種類」の[コンソールアプリケーション]ラジオボタンを選択し ます。 11. 「追加のオプション」の[空のプロジェクト]チェックボックスをチェックします。 12. [完了]ボタンをクリックします。 プロジェクトが作成され,次の画面が表示されます。 25 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3.12 プロジェクトを設定しよう プロジェクトを作成したら,プロジェクトを設定します。 1. サンプルプログラム「ecli_tutorial01.c」を「D:¥Sample¥Sample01」にコピーします。 2. メニューから[プロジェクト]-[既存項目の追加]を選択します。 「既存の項目の追加」ダイアログが表示されます。 3. プロジェクトへ追加するサンプルプログラムのファイルを選択します。例では, 「探す 場所(I)」から「D:¥Sample¥Sample01」を選択します。 4. サンプルプログラム「ecli_tutorial01.c」を選択します。 「ファイル名(N)」に「ecli_tutorial01.c」と入力しても同じように「ecli_tutorial01.c」を選択 できます。 26 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 5. [追加(A)]ボタンをクリックします。 「ソリューションエクスプローラ-Sample01」に,追加したファイル「ecli_tutorial01.c」 が表示されます。 6. メニューから[プロジェクト(P)]-[Sample01 のプロパティ(P)]を選択します。 「プロパティの設定ダイアログ」が開きます。 27 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7. 「構成プロパティ」の左にある「+」をクリックして,「C/C++」を選択します。 8. 「追加インクルードディレクトリ」を設定します。Entier が 「C:¥Program Files¥HITACHI¥Entier」にインストールされている場合, 「C:¥Program Files¥HITACHI¥Entier¥client¥include」ディレクトリを指定します。 9. 「リンカ」を選択します。 10. 「追加のライブラリディレクトリ」を設定します。例では,Entier が「C:¥Program Files¥HITACHI¥Entier」にインストールされている場合, 「C:¥Program Files¥HITACHI¥Entier¥client¥lib」ディレクトリを指定します。 28 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 11. 「リンカ」の左にある「+」をクリックして, 「入力」を選択します。 12. 「追加の依存ファイル」に「edwecli.lib」を指定します。 13. [OK]ボタンをクリックします。 これでプロジェクトの設定は完了です。 3.13 サンプルプログラムをコンパイルしよう 1. 「ソリューションエクスプローラー」から,「ecli_tutorial01.c」をダブルクリックします。 「ecli_tutorial01.c」のソースが表示されます。 29 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 2. メニューから[ビルド]-[コンパイル]をクリックします。[Ctrl]キーと[F7]キ ーを同時に押してもコンパイルできます。 「出力」にコンパイル結果が表示されます。エラーがないことを確認してください。 3.14 とにかくサンプルプログラムを実行してみよう Entier のライブラリとサンプルプログラムのオブジェクトをリンクするために,インポート ライブラリである「edwecli.lib」をリンケージしてビルドします。こうして,ビルドされた アプリケーションのオブジェクトと Entier を接続すると,データベースを操作できます。 1. [デバッグ]-[デバッグなしで開始]を選択します。または[Ctrl]キーと[F5]キー を同時に押します。 30 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 2. 次のようなダイアログが表示される場合は,[はい]ボタンをクリックします。 次のようなウィンドウが開きます。 図 3-7 プログラムの実行画面 上記のウィンドウが表示されたらアプリケーションの内容に応じて入力します。サンプルプ ログラムの実行については,「4. サンプルプログラムを実行しよう」で詳しく説明します。 ワンポイントアドバイス 「DLL が見つかりません」と表示されて実行が失敗する場合は,環境変数「PATH」に ディレクトリ「C:¥Program Files¥HITACHI¥Entier¥bin」(インストールディレクトリが, 「C:¥Program Files¥HITACHI¥Entier」の場合)が指定されていることを確認してください。 31 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 4. サンプルプログラムを実行しよう 3 章では,表の定義方法や Visual Studio 2005 の使い方を説明しました。この章では,3 章で 定義した表を使って,サンプルプログラムを実行する手順を例に説明します。 4.1 実行する前に サンプルプログラム「ecli_tutorial01.c」は,標準入力から受け取ったデータに従って,操作 系SQLを実行する関数を選択し,実行するAP(Application Program)です。サンプルプログラ ムは,EntierのAPIであるECLI関数が使用されているため,ECLI関数のヘッダファイル 「edbecli.h」を使用する必要があります。ユーザーアプリケーションからは,このECLI関数 を使用して,Entierの機能を呼び出します。 なお,このチュートリアル上のソースコードは,一部の行,コメントなどを省略しています。 4 章で紹介する各 ECLI 関数については,マニュアル「Entier AP 開発編」を参照してくだ さい。 4.2 サンプルプログラムの使い方 サンプルプログラム「ecli_tutorial01.c」の関数 main()は,標準入力でメニュー番号を選択し, 入力したメニュー番号に対応する SQL を実行します。チュートリアルでは,SELECT 文の 実行を例に説明します。 1. サンプルプログラムを実行します。 Entier の運用ディレクトリを入力します。ここでは,「d:¥eddir」と入力します。 運用ディレクトリのパスを入力してください。: d:¥eddir 2. ユーザー名を入力します。ここでは,「USER1」と入力します。 ユーザー名を入力してください。: USER1 「接続しました」と表示されます。 3. メニューを選択します。ここでは,「1」を入力します。 *****Entier ECLI 関数を使ったサンプルプログラム**** 1. 検索 2. 更新 3. 削除 4. 追加 5. 全件削除 6. 終了 番号を入力してください(1~6):1 4. 検索する列を指定します。ここでは,「1」を入力します。 検索対象の PREF_CODE を入力してください(1~47):1 列「PREF_CODE」が「1」のデータが表示されます。 32 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 図 4-1 検索結果 PREF_CODE : 1 PREF : 北海道 ZIPCODE : 0608588 ADDRESS : 札幌市中央区 SELECT 文の実行結果は次の図のようになります。 図 4-2 SELECT 文の実行結果 運用ディレクトリのパスを入力してください。: d:¥eddir ユーザー名を入力してください。: USER1 接続しました *****Entier ECLI 関数を使ったサンプルプログラム**** 1. 検索 2. 更新 3. 削除 4. 追加 5. 全件削除 6. 終了 番号を入力してください(1~6):1 検索対象の PREF_CODE を入力してください(1~47): 1 PREF_CODE : 1 PREF : 北海道 ZIPCODE : 0608588 ADDRESS : 札幌市中央区 *****Entier ECLI 関数を使ったサンプルプログラム**** 1. 検索 2. 更新 3. 削除 4. 追加 5. 全件削除 6. 終了 番号を入力してください(1~6): 33 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 4.3 サンプルプログラムの流れ この項では,SELECT 文を実行する場合の手順とその手順で使用する ECLI 関数について 説明します。プログラミングの流れを,次の図に示します。 図 4-3 プログラミングの流れ 手順 使用するECLI関数 コネクトコンテキスト を割り当てる e_rdb_SQLAllocConnect() Entierに接続する e_rdb_SQLConnect() 文ハンドルを 割り当てる e_rdb_SQLAllocStmt() SQL文を実行できる 状態にする e_rdb_SQLPrepare() 列結合をする e_rdb_SQLBindCol() パラメタ結合 をする e_rdb_SQLBindParam() SQL文を実行する e_rdb_SQLExecute() 行を取り出す (フェッチ) e_rdb_SQLFetch() カーソルを閉じる e_rdb_SQLCloseCursor() 文ハンドルを 解放する e_rdb_SQLFreeStmt() Entierから切り離す e_rdb_SQLDisconnect() コネクションハンドル の解放 e_rdb_SQLFreeConnect() 関数の説明 コネクトコンテキストと,Entierとのコネ クションを一意に識別するためのコネクシ ョンハンドルを割り当てます。 Entierに接続します。 SQL文を割り当てるための 文ハンドルを確保します。 SQL文をコンパイルし,実行できる状態に します。(準備する) 列の値を受け取る 領域を設定します。 ?パラメタの値を格納する 領域を設定します。 SQLを実行し,表の該当する データの先頭行にカーソルが 指し示されます。 行を1行ずつ取り出します。 行をすべて取り出したら カーソルを閉じます。 文ハンドルを解放します。 Entierから切り離します。 コネクションハンドルを解放し, コネクトコンテキストを無効にします。 図 4-3 で示したプログラミングの流れは,SQL 文を実行する場合の基本的な流れです。 INSERT 文,UPDATE 文,および DELETE 文を使用したプログラミングも SELECT 文のプ ログラミングの流れと同様です。(行を取り出すための処理が異なります。) 34 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 4.4 SQL を実行しよう この章の以降では,サンプルプログラム「ecli_tutorial01.c」のソースコードを見ながら, SELECT 文を実行する例を説明します。 4.5 サンプルプログラム サンプルプログラム「ecli_tutorial01.c」のソースを以下に示します。 /* All Rights Reserved. Copyright (C) 2007, Hitachi, Ltd. */ /* Licensed Material of Hitachi, Ltd. */ /******************************************************************************/ /* name = ecli_tutorial01.c */ /* ECLI 関数を利用したサンプルプログラム */ /* 入力パラメータ付 SQL でのデータ操作 */ /******************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> /*--Entier ECLI 関数を利用するためのヘッダーファイル---------------------------*/ Entier の #include "edbecli.h" ヘッダファイ ル #define TRUE 1 #define FALSE 0 /* サブルーチンの宣言 */ static int execSELECT(e_rdb_SQLConnectContext_t *); static int execUPDATE(e_rdb_SQLConnectContext_t *); static int execDELETE(e_rdb_SQLConnectContext_t *); static int execINSERT(e_rdb_SQLConnectContext_t *); static int execAllDELETE(e_rdb_SQLConnectContext_t *); int main(void) { signed short rtnc, rc = TRUE; /* リタンコード */ e_rdb_SQLConnectContext_t *cnctContext; /* コネクトコンテキスト */ e_rdb_SQLConnectOpt_t cnctOpt; /* コネクトオプション e_rdb_SQLResultInfo_t rsltInfo; /* SQL 結果情報 */ char dbpath[129]; /* 運用ディレクトリ */ char dbuser[17]; /* ユーザ ID */ int menuNum = 0, c; */ memset(&cnctOpt, 0x00, sizeof(e_rdb_SQLConnectOpt_t)); memset(&rsltInfo, 0x00, sizeof(e_rdb_SQLResultInfo_t)); printf("運用ディレクトリのパスを入力してください。: "); gets(dbpath); printf("ユーザー名を入力してください。: "); fflush(stdin); gets(dbuser); /* コネクトオプションの設定(設定値は省略時とは一部異なります) */ 35 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. cnctOpt.MemoryLimitSize = 2048; /* 最大メモリサイズを 2048KB とする。 cnctOpt.FTSMemoryLimitSize = 0; /* 全文検索用補助メモリを使用しない。 cnctOpt.SectorSize = 0; /* システムで使用します。値を指定しても無視されます。 cnctOpt.TableAttr = 0; /* 表定義情報の先読みを行わない。 cnctOpt.TableDefPoolSize = 12; /* 表定義情報を格納するプールサイズを 12KB とする。 cnctOpt.BufferNumber = 128; /* バッファ面数を 128 面とする。 */ cnctOpt.GeomBufferNumber = 32; /* 空間検索バッファ面数を 32 面とする。 */ cnctOpt.FTSTrieBufferNumber = 32; /* 全文検索バッファ面数を 32 面とする。(トライ用) */ cnctOpt.FTSIndexBufferNumber = 32; */ */ */ */ */ /* 全文検索バッファ面数を 32 面とする。(インデックス用) */ cnctOpt.AreaBuffer = 0; /* 全ての DB エリアを OTHER バッファに割り当てる。 cnctOpt.DBAreaAttr = 0; /* DB エリア属性情報の設定を行わない。 cnctOpt.JournalBufferNumber = 80; /* ジャーナルバッファ面数を 80 面とする。 */ */ */ cnctOpt.JournalFileTotalSize = 0; /* ジャーナルファイルサイズの上限を既定しない。 */ cnctOpt.TimeLimit = 0; /* タイムアウト機能は適用しない。 */ cnctOpt.CLITraceFileSize = 0; /* CLI トレースファイルを出力しない。 */ cnctOpt.APReport = 'N'; /* AP 統計レポートを取得しない */ /* Entier への接続---------------------------------------------------------- */ 接続に関する /* コネクトコンテキスト,コネクションハンドルの割り当て */ 処理 rtnc = e_rdb_SQLAllocConnect(&cnctContext); if ( rtnc == e_rdb_RC_SQL_SUCCESS ); else { printf("コネクトコンテキスト,コネクションハンドルの割り当てに失敗しました(RC = %i)\n", rtnc); 接続に関する printf("何かキーを押してください。プログラムを終了します\n"); エラー処理 fflush(stdin); c = getchar(); return FALSE; } cnctContext->ResultInfo = &rsltInfo; /* SQL 結果情報 */ Entier に接続 /* コネクションの確立 */ 運用ディレク rtnc = e_rdb_SQLConnect(cnctContext, /* コネクトコンテキスト */ トリ: dbpath, /* 運用ディレクトリ */ 「d:\eddir」 dbuser, /* ユーザ ID */ ユーザ名: "", /* パスワード(未使用) */ 「USER1」 &cnctOpt /* コネクトオプション */ ); if ( rtnc == e_rdb_RC_SQL_SUCCESS ) { printf("接続しました\n"); } else { printf("コネクションの確立に失敗しました(RC = %i)\n", rtnc); printf("何かキーを押してください。プログラムを終了します\n"); fflush(stdin); c = getchar(); rtnc = e_rdb_SQLFreeConnect(cnctContext); return FALSE; } while (1) { printf("\n*****Entier ECLI 関数を使ったサンプルプログラム****\n"); メニューを printf(" 1. 検索\n"); 選択 printf(" 2. 更新\n"); printf(" 3. 削除\n"); printf(" 4. 追加\n"); 36 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. printf(" 5. 全件削除\n"); printf(" 6. 終了\n"); printf("番号を入力してください(1~6):"); fflush(stdin); menuNum = getchar(); switch ( menuNum ) { 各メニューご /* SELECT 文を実行する */ との処理 case '1': rc = execSELECT(cnctContext); break; /* UPDATE 文を実行する */ case '2': rc = execUPDATE(cnctContext); break; /* DELETE 文を実行する */ case '3': rc = execDELETE(cnctContext); break; /* INSERT 文を実行する */ case '4': rc = execINSERT(cnctContext); break; /* PURGE TABLE 文を実行する */ case '5': rc = execAllDELETE(cnctContext); break; /* 終了 */ case '6': break; /* 上記以外 */ default: printf("\n1~6 を選んでください。\n"); break; } /* 終了 */ if ( menuNum == '6' ) break; if ( rc != TRUE ) break; } /* Entier からの切り離し---------------------------------------------------- */ Entier の /* コネクションの終了 */ 切断の処理 rtnc = e_rdb_SQLDisconnect(cnctContext); if ( rtnc == e_rdb_RC_SQL_SUCCESS ); else { printf("コネクションの終了に失敗しました(RC = %i)\n", rtnc); printf("何かキーを押してください。プログラムを終了します\n"); fflush(stdin); c = getchar(); rtnc = e_rdb_SQLFreeConnect(cnctContext); return FALSE; } 37 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. /* コネクトコンテキスト,コネクションハンドルの解放 */ rtnc = e_rdb_SQLFreeConnect(cnctContext); コネクトコン if ( rtnc == e_rdb_RC_SQL_SUCCESS ) テキストの解 { 放処理 printf("\nEntier から切断しました\n"); } else { printf("コネクトコンテキスト,コネクションハンドルの解放に失敗しました(RC = %i)\n", rtnc); コネクトコン printf("何かキーを押してください。プログラムを終了します\n"); テキストの解 fflush(stdin); 放に関するエ c = getchar(); ラー処理 return FALSE; } printf("何かキーを押してください。プログラムを終了します\n"); fflush(stdin); c = getchar(); return TRUE; } /* データの検索 ------------------------------------------------*/ static int execSELECT(e_rdb_SQLConnectContext_t *cnctContext) { char *selSql = "SELECT PREF_CODE,PREF,ZIPCODE,ADDRESS FROM SAMPLE WHERE PREF_CODE = ?"; /* 検索 SQL */ signed short rtnc; int condition = 0; int fetch_cnt = 0; unsigned short hStmt; SQL 文 文ハンドルを /* 文ハンドル */ 割り当てる 4.7 参照 /* FETCH 結果格納用変数の宣言 */ signed int pref_code; e_rdb_VARCHAR_t char *p_pref; d_pref[sizeof(unsigned short) + 10 + 1]; /* 10:PREF 列の長さ */ /* 7:ZIPCODE 列の長さ */ 検索結果の列 を格納する char d_zipcode[7 + 1]; e_rdb_VARCHAR_t *p_address; ときの変数を 宣言 char d_address[sizeof(unsigned short) + 30 + 1]; signed int indi_prefcode = 0; signed int indi_pref = 0; signed int indi_zipcode = 0; signed int indi_address = 0; e_rdb_SQLInd_t indi_param; /* 30:ADDRESS 列の長さ */ /*---探索条件の設定 --------------------------------------------------------*/ while (1) 探索条件を { 指定 printf("\n 検索対象の PREF_CODE を入力してください(1~47):"); scanf("%d", &condition); printf("\n"); if ( condition < 1 || condition > 47) { 指定した探索 printf("値の設定が正しくありません。\n"); 条件に関する } エラー処理 38 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. else { break; } } /* 文ハンドルを確保 */ 文ハンドルを rtnc = e_rdb_SQLAllocStmt(cnctContext, &hStmt); 確保する if ( rtnc != e_rdb_RC_SQL_SUCCESS ) 4.7 参照 { printf("文ハンドルの確保に失敗しました(RC = %i)\n", rtnc); 文ハンドルの return FALSE; 確保に関する } エラー処理 p_pref = (e_rdb_VARCHAR_t *)d_pref; SQL を p_address = (e_rdb_VARCHAR_t *)d_address; 実行できる /* SELECT 文の前処理を行う */ 状態にする rtnc = e_rdb_SQLPrepare(cnctContext, hStmt, selSql); 4.8 参照 if ( rtnc != e_rdb_RC_SQL_SUCCESS ) { SQL 文を実行 printf("SELECT 文の前処理に失敗しました(RC = %i)\n", rtnc); できる状態に return FALSE; 関するエラー } 処理 /* PREF_CODE の受け取り設定 */ rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(1), /* 列番号 */ &pref_code, /* 値を格納する領域のアドレス */ sizeof(pref_code), /* 値を格納する領域の領域長 */ &indi_prefcode /* 標識変数のアドレス */ ); 検索結果の列 の値を格納 if ( rtnc != e_rdb_RC_SQL_SUCCESS ) する領域の { 設定 printf("列結合に失敗しました(RC = %i)\n", rtnc); 4.9 参照 return FALSE; } /* PREF の受け取り設定 */ rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(2), /* 列番号 */ d_pref, /* 値を格納する領域のアドレス */ sizeof(d_pref), /* 値を格納する領域の領域長 */ &indi_pref /* 標識変数のアドレス */ ); if ( rtnc != e_rdb_RC_SQL_SUCCESS ) { printf("列結合に失敗しました(RC = %i)\n", rtnc); return FALSE; } /* ZIPCODE の受け取り設定 */ rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(3), /* 列番号 */ d_zipcode, /* 値を格納する領域のアドレス */ sizeof(d_zipcode), /* 値を格納する領域の領域長 */ &indi_zipcode /* 標識変数のアドレス */ ); if ( rtnc != e_rdb_RC_SQL_SUCCESS ) 39 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. { printf("列結合に失敗しました(RC = %i)\n", rtnc); return FALSE; } /* ADDRESS の受け取り設定 */ 検索結果の列 rtnc = e_rdb_SQLBindCol(cnctContext, の値を格納す hStmt, /* 文ハンドル */ (unsigned short)(4), /* 列番号 */ d_address, /* 値を格納する領域のアドレス */ sizeof(d_address), /* 値を格納する領域の領域長 */ &indi_address /* 標識変数のアドレス */ る領域の設定 ); if ( rtnc != e_rdb_RC_SQL_SUCCESS ) { printf("列結合に失敗しました(RC = %i)\n", rtnc); return FALSE; } /*-----入力パラメタ(探索条件の?パラメタ)の設定を行う ----------------------*/ indi_param = e_rdb_SQL_NOT_NULL_DATA; rtnc = e_rdb_SQLBindParam(cnctContext, 入力パラメタ hStmt, /* 文ハンドル */ の設定 (unsigned short)(1), /* パラメタ番号 */ 4.10 参照 &condition, /* 値を格納する領域のアドレス */ &indi_param /* 標識変数のアドレス */ ); if ( rtnc != e_rdb_RC_SQL_SUCCESS ) { 入力パラメタ printf("入力パラメタの設定に失敗しました(RC = %i)\n", rtnc); の設定に return FALSE; 関する } エラー処理 /* カーソルオープン */ SQL 文の実行 rtnc = e_rdb_SQLExecute(cnctContext, hStmt); 4.11 参照 if ( rtnc != e_rdb_RC_SQL_SUCCESS ) { SQL 文の実行 printf("カーソルのオープンに失敗しました(RC = %i)\n", rtnc); に関する return FALSE; エラー処理 } /* オープンしたカーソルに対して行取り出し(フェッチ)を行う */ 行の取り出し fetch_cnt = 0; 4.12 参照 rtnc = e_rdb_SQLFetch(cnctContext, hStmt); /* データがある間繰り返し */ while ( rtnc == e_rdb_RC_SQL_SUCCESS ) 取り出した { 行の表示 fetch_cnt++; /* 取得した PREF_CODE の値の出力 */ printf("PREF_CODE : %d ", pref_code); printf("\n"); /* 取得した PREF の値の出力 */ (p_pref->Data)[p_pref->Length] = '\0'; printf("PREF /* 末尾にナル文字を設定 */ : %s ", p_pref->Data); printf("\n"); /* 取得した ZIPCODE の値の出力 */ printf("ZIPCODE : %s ", d_zipcode); printf("\n"); /* 取得した ADDRESS の値の出力 */ 40 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (p_address->Data)[p_address->Length] = '\0'; printf("ADDRESS /* 末尾にナル文字を設定 */ : %s ", p_address->Data); 取り出した printf("\n"); 行の表示 /* 次の行の取り出し */ rtnc = e_rdb_SQLFetch(cnctContext, hStmt); } if ( fetch_cnt == 0 ) { 行の取り出し /* 1 件も FETCH できなかった場合 */ のエラー処理 printf("条件に該当する行がありませんでした\n"); } /* カーソルのクローズ */ カーソルを rtnc = e_rdb_SQLCloseCursor(cnctContext, hStmt); 閉じる if ( rtnc != e_rdb_RC_SQL_SUCCESS ) 4.13 参照 { printf("カーソルクローズに失敗しました(RC = %i)\n", rtnc); カーソルを return FALSE; 閉じるときの } エラー処理 /* 文ハンドルの解放*/ rtnc = e_rdb_SQLFreeStmt(hStmt, e_rdb_SQL_FREE_HANDLE) ; 文ハンドルの if ( rtnc != e_rdb_RC_SQL_SUCCESS ) 解放処理 { 4.14 参照 printf("文ハンドルの解放に失敗しました(RC = %i)\n", rtnc); return FALSE; } return TRUE; } 以下省略 サンプルプログラム「ecli_tutorial01.c」では,表のデータを取り出したり,変更したりする ために数種類の構造体を使用します。それらの構造体は,ヘッダファイル「edbtypes.h」で 定義されています。各データ型の詳細については,マニュアル「Entier AP 開発編」を参照 してください。 注意 上記のサンプルコードは,「ecli_tutorial01.c」の抜粋です。見やすさのため,一部省略など しています。本書の紙面上のソースコードを直接コンパイルをしても,成功するとは限りま せん。ここで紹介したサンプルプログラムをコンパイルする場合は,3章で紹介した手順を ご参考に,「ecli_tutorial01.c」をご使用ください。 41 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 4.6 接続しよう サンプルの main 関数では,接続と切断をするために,次の四つの ECLI 関数を使用します。 • e_rdb_SQLAllocConnect() • e_rdb_SQLConnect() • e_rdb_SQLDisconnect() • e_rdb_SQLFreeConnect() コネクトとは,アプリケーションプログラムと操作対象のデータとを接続する処理です。開 始から終了まで,CPU とメモリとの間だけで処理されるプログラムの場合,このような処 理は必要はありません。しかし,組み込みデータベースプログラミングでは,一般的に HDD などの二次記憶装置(ストレージ)と呼ばれる機器上に記憶されているデータを操作する処 理が基本となります。そのため,データ(運用ディレクトリ)を格納しているストレージが 使用可能な状態であるか?,操作対象のデータが存在するか?などを確認する必要がありま す。つまり,データベースを使用するアプリケーションプログラムでは,データベースの接 続と切断を管理する必要があります。 接続するには,関数 e_rdb_SQLConnect()を実行します。データベースを使用した後に,切断 するには,関数 e_rdb_SQLDisconnect()を実行します。 ECLI 関数 e_rdb_SQLAllocConnect()と e_rdb_SQLFreeConnect()は,複数の同時接続を管理す るための関数です。チュートリアルで解説する Entier は,シングルタスク版の Entier を使用 しているため,一つの運用ディレクトリに対して接続は一つだけです。そのため, e_rdb_SQLAllocConnect()と e_rdb_SQLFreeConnect()は,コネクトコンテキスト(構造体 e_rdb_SQLConnectContext_t)のメンバの一つであるコネクションハンドルという接続 ID を 割り当てるだけです。しかし,作成したコネクトコンテキストは,ほかの ECLI 関数を実行 するために必要となります。 本書では,マルチタスク版について触れないため,e_rdb_SQLAllocConnect()関数および e_rdb_SQLFreeConnect()関数についての詳細は,マニュアル「Entier AP 開発編」を参照し てください。 4.7 SQL の文ハンドルを確保しよう SQL 文を実行するためには,最初に ECLI 関数 e_rdb_SQLAllocStmt()を使用して文ハンドル を確保します。Entier では,一つのプログラム中で,複数の SQL オブジェクトを同時に存在 させることができるため,いくつかの ECLI 関数では,どの SQL に対する処理であるかを Entier に明示する必要があります。そのため,SQL オブジェクトごとに文ハンドルという ID を割り当てて,ECLI 関数による操作をどの SQL オブジェクトに対して行えばよいか,Entier が識別できるようにします。文ハンドルを確保する変数(2 バイトの整数)のアドレスを ECLI 関数 e_rdb_SQLAllocStmt()の引数に指定すると,Entier は引数に取ったアドレスへ割り当て た文ハンドルの値を格納します。 42 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (例) 「hStmt」を文ハンドルとして割り当てる場合 「ecli_tutorial01.c」で「hStmt」を変数として宣言します。次に,変数「hStmt」を引 数として e_rdb_SQLAllocStmt()に渡します。 unsigned short hStmt; : /* 文ハンドルの確保 */ rtnc = e_rdb_SQLAllocStmt(cnctContext, &hStmt); 4.8 /* 文ハンドル */ SQL 文を準備しよう テキストで記述した SQL 文を実行可能な状態にすることを,SQL 文を準備すると言います。 SQL 文を準備するには,ECLI 関数 e_rdb_SQLPrepare()を使用します。 ワンポイントアドバイス SQL は,データベースを操作するためのプログラム言語の一種です。そのため,Entier はテ キストデータとして記述した SQL をコンパイルします。つまり,ここでいう準備とはコン パイルのことです。ECLI 関数 e_rdb_SQLPrepare()は,Entier の持つ SQL コンパイラ機能を 呼び出して,引数に取ったテキストデータの SQL 文をコンパイルします。指定した SQL 文 にエラーがない場合,その SQL は実行可能な 0 と 1 だけの機械語に翻訳され,メモリ上に 配置されます。この機械語に翻訳された SQL を「SQL オブジェクト」といいます。 Entier をはじめ標準的な RDBMS 製品では,データベースに格納してあるデータに対する操 作を SQL に任せる一方で,アプリケーションプログラミング側では,SQL のコンパイルと そのコンパイル結果である SQL オブジェクトを操作することが基本となります。 (例)表「SAMPLE」から,列「PREF_CODE」の値を検索する SELECT 文の場合 char *selSql = "SELECT PREF_CODE,PREF,ZIPCODE,ADDRESS FROM SAMPLE WHERE PREF_CODE = ?"; /* 検索 SQL */ : /* SELECT 文の前処理を行う */ rtnc = e_rdb_SQLPrepare(cnctContext, hStmt, selSql); 注意 サンプルの SQL 文では,列「PREF_CODE」の探索条件として「?」を指定しています。こ れについては,「4.10 入力パラメタを設定しよう」で説明します。 43 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 4.9 列結合をしよう 列結合するには,ECLI 関数 e_rdb_SQLBindCol()を使用します。列結合とは,ECLI 関数 e_rdb_SQLFetch()を実行して行データを取得するたびに,自動的にその行の各列データを格 納する領域を Entier に通知して関連付けることです。 ワンポイントアドバイス ECLI 関数 e_rdb_SQLPrepare()を実行した後に一度だけ列結合をすれば,行データを取得する たびに,関連付けた領域を参照するだけで列データを取得できます。そのため,SELECT 文 を 1 回実行して複数の行を取り出すプログラムを作成する場合に有効な関数です。しかし, 文ハンドルが解放されると,列結合は無効になってしまいますのでご注意ください。ECLI 関数 e_rdb_SQLFetch()の詳細については「4.12 行を取り出そう」を参照してください。 (例)表「SAMPLE」の各列について,列結合をする場合 /* PREF_CODE の受け取り設定 */ rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(1), /* 列番号 */ &pref_code, /* 値を格納する領域のアドレス */ sizeof(pref_code), /* 値を格納する領域の領域長 */ &indi_prefcode /* 標識変数のアドレス */ ); /* PREF の受け取り設定 */ rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, (unsigned short)(2), d_pref, sizeof(d_pref), &indi_pref ); /* ZIPCODE の受け取り設定 */ rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, (unsigned short)(3), d_zipcode, sizeof(d_zipcode), &indi_zipcode ); /* ADDRESS の受け取り設定 */ rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, (unsigned short)(4), d_address, sizeof(d_address), &indi_address ); /* 文ハンドル */ /* 列番号 */ /* 値を格納する領域のアドレス */ /* 値を格納する領域の領域長 */ /* 標識変数のアドレス */ /* 文ハンドル */ /* 列番号 */ /* 値を格納する領域のアドレス */ /* 値を格納する領域の領域長 */ /* 標識変数のアドレス */ /* 文ハンドル */ /* 列番号 */ /* 値を格納する領域のアドレス */ /* 値を格納する領域の領域長 */ /* 標識変数のアドレス */ 列結合の詳細については,マニュアル「Entier AP 開発編」を参照してください。 44 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 4.10 入力パラメタを設定しよう サンプルの SQL の WHERE 句には,「WHERE PREF_CODE = ?」のように,「?」が指定 されています。これを「?パラメタ」といいます。?パラメタが指定してある場合,Entier の SQL コンパイラは,?パラメタを指定した個所の値が未定のまま,SQL オブジェクトを 生成します。?パラメタの値が未定の SQL オブジェクトは,そのまま実行することができ ません。 そこで,ECLI 関数 e_rdb_SQLBindParam()を使用して,?パラメタで指定した個所に対応す る具体的な値を配置するための領域を Entier に通知し,関連づけます。Entier は,ECLI 関数 e_rdb_SQLExecute()を実行するときに,SQL 文中の?パラメタで指定した部分に対して関連 づけた領域に配置されている値を参照します。そのあと,SQL オブジェクトを補完して, SQL を実行します。ECLI 関数 e_rdb_SQLExecute()の詳細については「4.11 SQL 文を実行 しよう」を参照してください。 ワンポイントアドバイス ?パラメタは,一度生成した SQL オブジェクトを,何度も実行する場合に有効です。例えば, 図 4-4 のような流れで SELECT 文を使用するプログラミングをすると,SQL を準備し直さな くても,?パラメタを指定した部分だけを変更して,何度も SQL を実行することができます。 45 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 図 4-4 SQL オブジェクトを何度も実行する場合の流れ SQLの準備 e_rdb_SQLPrepare() 列結合 e_rdb_SQLBindCol() 参照したい列の 個数分繰り返し パラメタ結合 e_rdb_SQLBindParam() ?パラメタの 個数分繰り返し パラメタ結合した 結合した各領域に 各領域に値を入力 それぞれ値を入力 SQLの実行 e_rdb_SQLExecute() 必要な分だけ 繰り返し 行の取り出し e_rdb_SQLFetch() 探索条件に該当した 行数分繰り返し カーソルのクローズ e_rdb_SQLCloseCursor() SELECT 文,DELETE 文,UPDATE 文では,探索条件だけを変更しながら,何度も同じ SQL を実行する場合に有効です。 INSERT 文,UPDATE 文では,列への挿入値や変更値だけを変更しながら,何度も同じ SQL を実行する場合に有効です。 46 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (例)?パラメタを使用して「PREF_CODE」の値を設定する場合 サンプルでは,標準入力からの値を受け取ることで列「PREF_CODE」の具体的な値 を設定しています。次に,サンプルの実行例を示します。 運用ディレクトリのパスを入力してください。: d:¥eddir ユーザー名を入力してください。: USER1 接続しました *****Entier ECLI 関数を使ったサンプルプログラム**** 1. 検索 2. 更新 3. 削除 4. 追加 5. 全件削除 6. 終了 番号を入力してください(1~6):1 検索対象の PREF_CODE を入力してください(1~47): 1 PREF_CODE : 1 PREF : 北海道 ZIPCODE : 0608588 ADDRESS : 札幌市中央区 入力パラメタの詳細については,マニュアル「Entier SQL 仕様編」の「?パラメタ」を参 照してください。 注意 一度?パラメタと変数を結合すると,その結合した変数に数値を設定すれば,SQL を実行 するたびに,Entier は?パラメタの値としてその変数を参照します。しかし,文ハンドルが 解放されると,?パラメタと変数の結合は無効になってしまいます。 4.11 SQL 文を実行しよう ECLI 関数 e_rdb_SQLExecute()は,準備した SQL(SQL オブジェクト)を CPU に渡して実際 に SQL を実行します。 INSERT 文,UPDATE 文,DELETE 文の場合,そのまま表データを操作できます。しかし, SELECT 文だけは,1行ずつデータを取り出しながら,列データを取得する手続きが必要と なります。SELECT 文の場合は,探索条件に複数の行が該当する場合があるため,ECLI 関 数 e_rdb_SQLExecute()を実行すると,暗黙的に探索条件に該当したデータの先頭にカーソル が合わされます。 このカーソルを「暗黙カーソル」といい,探索条件に該当した結果表の先頭行にカーソルを 合わせることを「暗黙カーソルのオープン」といいます。 47 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. ECLI 関数 e_rdb_SQLExecute()を使用して表「SAMPLE」のカーソルをオープンにする手順 を以下に示します。 カーソルをオープンするには,次のように記述します。 rtnc = e_rdb_SQLExecute(cnctContext, hStmt); これで表「SAMPLE」の最初の取り出し位置にカーソルがオープンします。 ECLI 関数 e_rdb_SQLExecute()の詳細は,マニュアル「Entier AP 開発編」を参照してくだ さい。 注意 ECLI 関数 e_rdb_SQLExecute()を使用しただけでは,行のデータを取得できません。行を取り 出すためには,「4.12 行を取り出そう」で説明する,ECLI 関数 e_rdb_SQLFetch()を使用し て 1 行ずつデータを取り出します。 4.12 行を取り出そう 暗黙カーソルをオープンしたあと,行の取り出しをするには,ECLI 関数 e_rdb_SQLFetch() を実行します。 ECLI 関数 e_rdb_SQLFetch()を実行すると,カーソルがポイントしている行の取り出しをし ます。次の行があれば,次の行にカーソルを合わせます。この場合,ECLI 関数 e_rdb_SQLFetch()は,リターンコード e_rdb_RC_SQL_SUCCESS (= 0)を返します。ECLI 関数 e_rdb_SQLFetch()を実行して,行がなかった場合,ECLI 関数 e_rdb_SQLFetch()は,リターン コード e_rdb_RC_SQL_NO_DATA (= 100)を返します。サンプルプログラムのように,この リターンコードを使って,行取り出しの繰り返し処理を作成することをおすすめします。 ワンポイントアドバイス サンプルプログラムをそのまま実行するだけでは,探索条件に該当する行が複数になること はありません。探索条件に該当する行が複数になる場合の処理を確認する場合は,サンプル SQL の探索条件を「WHERE PREF_CODE = ?」から「WHERE PREF_CODE > ?」のように変 更するなどして,試してください。 48 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 図 4-6 探索条件に複数の行が該当した場合の行の取り出しイメージ PREF_CODE PREF ZIPCODE ADDRESS 1 北海道 0608588 札幌市中央区 2 青森県 0308570 青森市長島 3 岩手県 0208570 盛岡市内丸 PREF_CODE PREF ZIPCODE ADDRESS 1 北海道 0608588 札幌市中央区 (凡例) :カーソル(オープン状態) 行の取り出しの詳細については,マニュアル「Entier AP 開発編」を参照してください。 4.13 カーソルを閉じよう ECLI 関数 e_rdb_SQLCloseCursor()は,SELECT 文の実行が終わったことを Eniter に通知し, オープンしている暗黙カーソルを閉じます。この関数は,ある条件を満たした場合,行取り 出しの繰り返し処理を終了するときに使用します。 ECLI 関数 e_rdb_SQLCloseCursor()で暗黙カーソルを閉じたあと,ECLI 関数 e_rdb_SQLExecute()を使用して再度 SQL を実行できます。 (例)表「SAMPLE」でオープンしているカーソルを閉じる場合 /* カーソルのクローズ */ rtnc = e_rdb_SQLCloseCursor(cnctContext, hStmt); カーソルのクローズの詳細については,マニュアル「Entier AP 開発編」を参照してくださ い。 ワンポイントアドバイス カーソルをクローズしないで,ECLI 関数 e_rdb_SQLDisconnect()によって切断を実行した 場合,切断と同時にカーソルも閉じます。 49 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 4.14 文ハンドルを解放しよう ECLI 関数 e_rdb_SQLFreeStmt()は,文ハンドルを解放します。SQL を使い終わって,必要が なくなった時に使用します。文ハンドルを解放すると,Entier がその SQL を実行するために 必要なリソース(SQL オブジェクトなど)が解放されます。 ワンポイントアドバイス ECLI 関数 e_rdb_SQLDisconnect()を実行した時や,COMMIT,ロールバックを行った時,文 ハンドルが解放されます。この場合,ECLI 関数 e_rdb_SQLFreeStmt()を使用する必要はあり ません。 注意 文ハンドルが解放されると,SQL オブジェクトが解放されます。この時,列結合やパラメ タ結合も無効化します。 50 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 5. データベースのチューニングをしてみよう この章では,インデックスとバッファを使用したデータベースのチューニングについて説明 します。チューニングは,限られたシステムリソースを使用して,データベースの性能を引 き出すための重要な設定です。チューニングとは何かを知りたい方は,「5.1 チューニン グとは」から順番にお読みください。 チューニングとは何かをご存知で,インデックスやバッファをすでに設定している方は, 「5.5 効果的にチューニングをしよう」をお読みください。 なお,この章では「3. サンプルを使用するための準備をしてみよう」で定義した表 「SAMPLE」とは別の表「SAMPLE2」を使用して説明します。これまで学習した内容と後 の説明をご参考に,表の定義やデータのインポートを行ってください。 5.1 チューニングとは リレーショナルデータベースは,表を定義して SQL(SELECT 文)を実行するだけで検索条 件に応じた検索ができます。しかし,そのままではデータベースの性能を十分に引き出すこ とができません。データベースをより高性能に活用するためには,使用目的に応じた設定が 必要です。具体的には,検索条件の列にインデックスを定義したり,バッファを大きく取っ たりします。このように,データベースに効率良くアクセスするための設定を総称して「チ ューニング」といいます。 (4) チューニングの方法 データベースの検索性能を向上するためのチューニングは,パラメタの設定やインデックス の追加などによって,HDD などの二次記憶装置(ディスク)へのアクセス回数(I/O 回数) を削減することを目的とします。 ワンポイントアドバイス ~なぜディスクへのアクセス回数(I/O 回数)を減らすのか?~ メモリへのアクセスと比較して,ディスクへのアクセスは時間が掛かります。必要なデータ を取り出したいとき,頻繁にディスクへアクセスすると,処理速度が遅くなります。そこで, できるだけメモリ上の「バッファ」を使用するように設定します。バッファを効果的に使用 することで,ディスクへのアクセス回数を削減でき,処理性能が向上します。 51 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 具体的なチューニングの方法はいろいろあります。主なチューニング方法を次の表に示しま す。 表 5-1 チューニング方法の一例 チューニング内容 DB エリア初期容量の調整 ページサイズの設定 インデックスの使用 バッファの設定 SQL 文の書き方 効果 必要な容量をあらかじめ確保して おくことで,自動増分によるオー バヘッドを削減します。また,デ ータベースファイルの断片化を防 ぎます。 1ページ(データベースでの I/O 単 位)に格納できるデータ件数を調 整して I/O 回数の削減やメモリ使 用効率を向上させます。 検索条件の列にインデックスを定 義することで高速に検索すること ができます。 バッファを大きくすることで I/O 回数を削減することができます。 SQL 文の書き方を変更することで 使用するインデックスを変更する など,効率のよいアクセスができ ます。 設定個所 ECM の DB 初期化(デ ータベース初期設定ユ ーティリティ) 定義系 SQL コネクトオプション 操作系 SQL これらのうち,最も効果の高い「インデックスの使用」と「バッファの設定」について,次 節以降で説明します。 5.2 インデックスを使用しよう インデックスとは,指定した列の値(これをキー値と呼びます)だけを抜き出して昇順また は降順に並べたものです。「インデックス」という名前のとおり,書籍の索引のような役割 を果たします。 例えば,書籍に索引がないと,どのページに目的のキーワードがあるかわかりません。その ため,1 枚 1 枚ページをめくって探す必要があります。しかし,索引を使用すると,まずは 目的のキーワードを索引で探し,その上でキーワードが記載されているページだけを開けば 済みます。 この違いをページをめくる回数で考えてみましょう。本全体のページ数を 1000 ページとす ると,索引がない場合は 1000 ページすべてを見なければなりません。それに対して,索引 がある場合は索引ページの数ページと,キーワードが記載されているページ数分だけ見れば 済みます。 データベースのインデックスも,これと同様のことが言えます。データベースの場合,一般 的には扱うデータ量が書籍よりも多いため,インデックスの使用による効果は書籍の索引以 上に期待できます。 52 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (1) インデックスの構造 インデックスの構造も,書籍の索引とよく似ています。ここでは,B-tree 構造のインデック スについて説明します。 書籍の索引の構造 キーワードと参照先のページ番号とで一つのエントリーを構成する アルファベット順や五十音順にソートされ,「あ行」「か行」のような見出しが付け られている インデックスの構造 キーワード(キー値)と参照先のデータへのポインタとで一つのエントリーを構成す る キーワード(キー値)は昇順(または降順)でソートされ,階層構造をしている インデックスの構造(B-tree 構造)を次の図に示します。 53 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (2) インデックスの定義 これ以降の説明でチューニングの効果を見るには,これまで使用してきた SAMPLE 表では データ量が小さ過ぎるため,新たに SAMPLE2 表を定義します。 CREATE TABLE SAMPLE2( PREF_CODE INT, PREF VARCHAR(10), ZIPCODE CHAR(7), ADDRESS CHAR(1024)); この SAMPLE2 表を定義した後,「3.8 データをインポートしよう」と同様の手順で, 「sample.txt」をインポートしてください。 例では,SAMPLE2 表の ZIPCODE 列に対してインデックスを定義します。基本的にインデ ックスは,検索条件として頻繁に使用する列に定義します。例えば,郵便番号をキーにした 検索をしたい場合には,郵便番号を格納する列にインデックスを定義します。 SAMPLE2 表を例に説明します。ZIPCODE 列(郵便番号)に条件(1638001 である)を付け て検索する場合,次のような SQL を実行します。 SELECT * FROM SAMPLE2 WHERE ZIPCODE='1638001'; このような場合は,ZIPCODE 列にインデックスを定義しておきます。 CREATE INDEX IDX_ZIPCODE ON SAMPLE2(ZIPCODE) EMPTY; インデックス名 表名(列名) SQL 実行の際にインデックスを使用するかどうかや,どのインデックスを使用するかは, SQL の記述およびインデックスの定義のしかたによって決まります。SQL 実行時に特別な 操作をする必要はありません。 ただし,インデックスを使用するためにはインデックスが有効である必要があります。デー タがインポートされている表に対してインデックスを作成した場合,作成直後のインデック スは無効となっています。この場合,インデックスを再作成して有効にします。 54 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. ECM を使用してインデックスを再作成する手順を次に示します。 1. 作業選択ビューから[インデクス再作成]を選択します。 2. [最新の情報に更新(U)]ボタンをクリックして,最新のインデックス状態を表示させ ます。 3. インデックス状態を確認します。作成したインデックス(IDX_ZIPCODE)は,インデ ックス状態が無効となっています。IDX_ZIPCODEのチェックボックスをチェックして, [インデクス再作成(E)]ボタンをクリックしてください。 4. 次のように「インデクス再作成が正常終了しました。 」と表示されると,インデックス の再作成は完了です。 55 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 5.3 バッファを設定しよう バッファとは,データをディスクから読み出し,一時的に保存するメモリ領域です。ここで は,バッファの設定方法について説明します。 (1) データベースアクセスの仕組み Entier の AP は,次の図に示すような順番でデータベースにアクセスします。 このように,表やインデックスにアクセスする際には,必ずバッファを経由します。バッフ ァ上で目的のデータが見つかればディスクへのアクセスが発生しないので,I/O 回数の削減 に大きく寄与し検索性能が向上します。 なお,Entier ではデータアクセスのために使用するバッファのことを「DB エリアバッファ」 と言います。 ワンポイントアドバイス ~なぜバッファのチューニングが必要なのか?~ ディスクへの I/O 回数を減らすには,バッファを効果的に使う必要があります。バッファに データがなければ,ディスクへアクセスしてしまいますから,よく使うもの(インデックス など)をバッファに置くと効果的です。 Entier には「OTHER バッファ」と「AREA バッファ」という二つの DB エリアバッファがあ りますが,デフォルトでは OTHER バッファだけを使用する設定になっています。二つのバ ッファを効果的に使うには,AREA バッファのチューニングが必要です。 (a) バッファのサイズ変更(バッファ面数の設定) バッファのサイズを変更するためには,コネクトオプションで次の二つの項目を設定します。 バッファ面数 メモリサイズの上限 ECM を使用してバッファのサイズを変更する手順を次に示します。 1. メニューから[オプション(O)]-[コネクトオプション(N)]を選択して,「コネクト オプション」ダイアログを表示させます。 56 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 2. 「コネクトオプション」ダイアログで次の設定をします。 「コネクトオプションを指定しない」のチェックを外します。 「バッファ面数」の値を「20」に設定します。 3. バッファ面数が「バッファ面数×4<メモリサイズの上限」の式に当てはまることを確 認して,[既定値として登録]ボタンをクリックします。既定値として登録することで, 以降の Entier 接続時にこの設定が有効になります。 4. [OK]ボタンをクリックして「コネクトオプション」ダイアログを閉じます。 コラム~なぜバッファ面数とメモリサイズを設定するのか?~ バッファは,面という単位で管理されます。1 面は,DB エリアに設定したページサイズで す(ページサイズの異なる複数の DB エリアが一つのバッファに割り当てられる場合は,割 り当てられた DB エリア中の最大ページサイズが1面のサイズになります)。 バッファ面数を大きくすると,バッファ上に置けるデータの量が多くなるため,ディスクに アクセスする回数を減らすことができます。しかし,使用するメモリ量が増えます。このた め,バッファ面数を大きくするのに合わせて,メモリサイズの上限をコネクトオプションで 設定する必要があります。 二つの項目は,次の条件に合うように設定します。 「バッファ面数×4(KB)<メモリサイズの上限(KB)」 バッファ面数に 4 を掛けているのは,ECM の初期設定(作業選択ビューの[DB 初期化]) でページサイズに 4KB(4096 バイト)を指定しているためです。 57 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 5.4 チューニングの効果を確認しよう チューニングを行う最大の目的は,前述したとおり I/O 回数を削減することです。インデッ クスを定義したりバッファサイズを変更したりしたことで,変更前と比べて I/O 回数が減少 したかどうかを確認してみましょう。 I/O 回数は,AP 統計レポートを取得することで確認できます。ここでは,ECM を使用して, インデックスを使用したときの効果を確認していきます。 AP 統計レポートの詳細については,マニュアル「Entier (1) AP 開発編」を参照してください。 準備(AP 統計レポートの取得設定) AP 統計レポートの取得は,コネクトオプションで設定します。設定方法を次に示します。 1. メニューから[オプション(O)]-[コネクトオプション(N)]を選択して,「コネクト オプション」ダイアログを表示させます。 2. 次のとおり設定します。 「コネクトオプションを指定しない」のチェックボックスのチェックを外します。 「CLI 関数トレースファイルサイズ」に 4~1024 の値を設定します。ここでは,「1024」 を設定してください。 「AP 統計レポートを取得する」のチェックボックスをチェックします。 3. [OK]ボタンをクリックして「コネクトオプション」ダイアログを閉じます。 58 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (2) インデックスが定義されているかどうかの確認 インデックスが定義されているかどうかは,DB 表情報ビューから確認できます。 1. Entier に接続します。 2. DB 表情報ビューで,「IDX_ZIPCODE」が存在することを確認します。 ここでは,上記のインデックスを定義してあるものとして説明しています。インデックスを 定義する方法は,「5.2(2) インデックスの定義」を参照してください。 (3) インデックスを使用したときの I/O 回数の確認 I/O 回数を確認する方法を次に示します。 1. 運用ディレクトリの SPOOL フォルダに edcli1.trc が出力されている場合,事前に削除し ます。この操作は,Entier から切り離した状態で行ってください。 2. Entier に接続します。 3. 作業選択ビューから[SQL 操作]を選択します。 4. 次の SQL を実行します。 SELECT * FROM SAMPLE2 WHERE ZIPCODE='1638001'; 5. Entier から切り離します。 6. 運用ディレクトリの SPOOL フォルダに出力された,edcli1.trc をテキストエディタで開 きます。 7. 「/* AP Statistical Report */」という項目中の「FILE READ」 (ファイルからの読み込み回 数)を確認します。この例では, 「FILE READ」(ファイルからの読み込み回数)は 21 回でした。 <省略> /* AP Statistical Report */ MEMORY MAX = [1.3M] MEMORY MAX FTS = [0] NECESSARY MEMORY FTS = [0] BUFF REQ = [31] FILE READ = [21] FILE WRITE = [0] FILE COMMIT SYNC = [0] <省略> 59 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (4) インデックスの削除 ここでは,インデックスの有無による I/O 回数の違いを確認したいため,インデックス 「IDX_ZIPCODE」が定義されていた場合,いったん削除します。インデックスを削除する 方法を次に示します。 1. Entier に接続します。 2. 作業選択ビューから[SQL 操作]を選択します。 3. 次の SQL を実行します。 DROP INDEX IDX_ZIPCODE; (5) インデックスを使用していないときの I/O 回数の確認 「(3) インデックスを使用したときの I/O 回数の確認」と同様の手順で,インデックスを使 用していないときの I/O 回数を確認します。この例では,「FILE READ」(ファイルからの 読み込み回数)は 38 回となり,インデックスを使用する場合に比べて大きくなっています。 このことから,インデックスを使用すると性能が向上することがわかります。 <省略> /* AP Statistical Report */ MEMORY MAX = [1.4M] MEMORY MAX FTS = [0] NECESSARY MEMORY FTS = [0] BUFF REQ = [115] FILE READ = [38] FILE WRITE = [0] FILE COMMIT SYNC = [0] <省略> この例では,データ件数が少ないためチューニングの効果はあまり実感できませんが,大量 のデータを扱うデータベースでは,インデックスの定義によって I/O 回数を大幅に減らせま す。 60 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 5.5 効果的にチューニングをしよう チューニングは,適切に行わなければ効果がありません。ここでは,より効果的なチューニ ングを行うために知っておくべき項目について説明します。 (1) 効果的なインデックスの使用 インデックスは,次のような列に定義すると効果的です。 データを絞り込むための条件に使用する列 表の結合処理の条件として使用する列 データのソート,グループ分けの条件として使用する列 集合関数の MAX,MIN を指定する列 反対に,次のような列にはインデックスを定義しない方がよいと言えます。 更新頻度が高い列 データの重複度が高い列 (a) インデックスが使われているかどうかの確認 定義したインデックスが検索に使われているかどうか確認するためには,SQL 実行ユーティ リティ(edsqlexe)を使用して SQL を実行します。SQL 実行ユーティリティ(edsqlexe)を 使用する前に,次の準備をしておいてください。 「5.2(2) インデックスの定義」に従って,インデックス「IDX_ZIPCODE」を定義して おきます。 ECM から Entier に接続している場合,事前に Entier から切り離しておきます(SQL 実 行ユーティリティ(edsqlexe)と同時に接続することはできません)。 1. [スタート]-[プログラム]-[HiRDB Embedded Database Entier vv-rr]-[Entier SQL Execute Utility]を選択します。 SQL 実行ユーティリティ(edsqlexe)が起動します。 61 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 2. ユーザ ID,パスワード,および運用ディレクトリを順番に入力します。 USER-ID(ユーザ ID):USER1 PASSWORD(パスワード):空欄のまま「Enter」キーを押す EDDIR(運用ディレクトリ):D:¥eddir 3. Entier に接続したら,次のコマンドを入力します。このコマンドを入力することで,SQL 実行時に使用されたインデックスおよび作業表が表示されるようになります。 #SET OPT REPORT ON; 4. 次の SQL を実行します。この SQL は, 「SAMPLE2 表から,ZIPCODE 列(郵便番号) の昇順に 5 件検索する」という意味です。 SELECT * FROM SAMPLE2 ORDER BY ZIPCODE ASC LIMIT 5; 5. 検索結果とともに,検索に使用されたインデックス名(IDX_ZIPCODE)が KFWT00010-I メッセージに表示されます。 KFWT00010-I The index "IDX_ZIPCODE" of table "USER1"."SAMPLE2" will be used. PREF_CODE -----------5 3 2 1 13 KFWT00007-I 6. PREF ZIPCODE ADDRESS ---------- ------- -----------------------------秋田県 0108570 秋田市山王 岩手県 0208570 盛岡市内丸 青森県 0308570 青森市長島 北海道 0608588 札幌市中央区 東京都 1638001 東京都新宿区 5 rows were selected. 次のコマンドを入力して,SQL 実行ユーティリティ(edsqlexe)を終了させます。 #EXIT; 62 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 次に,ECM で IDX_ZIPCODE を削除してから再度 SQL 実行ユーティリティ(edsqlexe)で 上記の手順を実行すると,次の検索結果が表示されます。 KFWT00010-I The index "***" of table "USER1"."SAMPLE2" will be used. KFWT00011-I Executing this SQL will create 1 work tables. PREF_CODE PREF ZIPCODE ADDRESS ------------ ---------- ------- -----------------------------5 秋田県 0108570 秋田市山王 3 岩手県 0208570 盛岡市内丸 2 青森県 0308570 青森市長島 1 北海道 0608588 札幌市中央区 13 東京都 1638001 東京都新宿区 KFWT00007-I 5 rows were selected. COMMAND ? +----2----+----3----+----4----+----5----+----6----+----7----+ KFWT00010-I メッセージにインデックス名が「***」で表示され,インデックスが使用され ていないことがわかります。また,KFWT00011-I メッセージから,作業表が一つ作成され たことがわかります。 なお,インデックスを削除する方法については,「5.4(4)インデックスの削除」を参照して ください。 コラム~作業表とは?~ 作業表とは,Entier が SQL の処理でソートなどをするときに,一時的に作成する表です。デ ータをソートする場合などに作業表が作成されると,システムに与える負荷が高くなり,十 分な性能が得られないおそれがあります。そのため,できるだけ作業表を作成しないように インデックスを作成することをお勧めします。 詳細については,マニュアル「Entier AP 開発編」を参照してください。 63 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (b) 効果的にインデックスを使用した検索例 次のような場合にインデックスを使用すると効果的です。 検索条件が決まっている場合 検索条件に指定する列が決まっていれば,その列をインデックスとして定義します。 次のような SQL を頻繁に実行する場合,ZIPCODE 列にインデックスを定義します。 SELECT * FROM SAMPLE2 WHERE ZIPCODE='1638001'; 集合関数が指定されている場合 集合関数 MAX 関数または MIN 関数が指定されている場合,集合関数を指定した列をイン デックスとして定義します。そうすることで,集合関数の結果をインデックス上から得るこ とができ,表データへのアクセスのオーバヘッドが削減できます。 次のような SQL を頻繁に実行する場合,PREF_CODEE 列にインデックスを定義します。 SELECT MAX(PREF_CODE),MIN(PREF_CODE) FROM SAMPLE2; OR 条件を IN 述語に書き換える場合 同じ列に対する=条件が OR 条件で接続されていると,インデックスを定義していても検索 にインデックスが使用されません。例えば,次に示す SQL を実行しても,PREF_CODE 列 に定義したインデックスは使用されません。 SELECT * FROM SAMPLE2 WHERE PREF_CODE = 1 OR PREF_CODE = 2; このような場合,IN 述語を使用した SQL に置き換えて実行することで,PREF_CODE 列に 定義したインデックスが使用されます。 SELECT * FROM SAMPLE2 WHERE PREF_CODE IN(1,2); データのソート(ORDER BY 句)やグループ分け(GROUP BY 句)を指定する場合 データのソート(ORDER BY 句)やグループ分け(GROUP BY 句)に使用する列が複数の 場合,複数の列に対してインデックスを定義すること(複数列インデックス)で,効率良く 検索結果を得ることができます。 64 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (2) 効果的なバッファの設定 (a) I/O 回数の確認 バッファが効果的に使われているかどうかは,AP 統計レポートを取得することで確認でき ます。ここでは,AP 統計レポートを参照してバッファの I/O 回数を確認する方法を説明し ます。AP 統計レポートを取得する方法については,「5.4(1) 1. 準備」を参照してください。 Entier から切り離した状態で,運用ディレクトリの SPOOL フォルダに出力された, edcli1.trc をテキストエディタで開きます。 「/* Buffer Statistical Report */」という項目が,バッファに関する情報です。 <省略> /* Buffer Statistical Report */ 1 BUFF PAGE SIZE = [4096] 2 BUFF NUM = [20] 3 BUFF REQ = [319] 4 BUFF REQ DIR = [8] 5 BUFF REQ DATA = [138] 6 BUFF REQ IDX = [173] 7 BUFF REQ BIN = [0] 8 BUFF UPD = [0] 9 10 BUFF UPD DIR = [0] 11 BUFF UPD DATA = [0] 12 BUFF UPD IDX = [0] 13 BUFF UPD BIN = [0] 14 BUFF REF = [319] 15 BUFF REF DIR = [8] 16 BUFF REF DATA = [138] 17 BUFF REF IDX = [173] 18 BUFF REF BIN = [0] 19 BUFF HIT = [275] 20 BUFF HIT DIR = [4] 21 BUFF HIT DATA = [119] 22 BUFF HIT IDX = [152] 23 BUFF HIT BIN = [0] 24 BUFF HIT RATE = [86] 25 BUFF HIT RATE DIR = [50] 26 BUFF HIT RATE DATA = [86] 27 BUFF HIT RATE IDX = [87] 28 BUFF HIT RATE BIN = [0] 29 FILE READ = [44] 30 FILE READ DIR = [4] 31 FILE READ DATA = [19] 32 FILE READ IDX = [21] 33 FILE READ BIN = [0] <省略> 6 行目と 7 行目は,バッファへのアクセス要求回数を示しています。この例では,データに 対して 138 回,インデックスに対して 173 回のアクセスを要求しています。 また,31 行目と 32 行目は,バッファに要求したアクセスのうち,バッファからは目的のデ 65 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. ータやインデックスが見つからずにディスクにアクセスした回数(I/O 回数)を示していま す。この例では,データに対して 19 回,インデックスに対して 21 回アクセスしています。 バッファへのアクセス要求回数に対して I/O 回数が多い場合,バッファが効果的に使用され ていないおそれがあります。この場合は,バッファサイズの変更と AP 統計レポートの確認 を繰り返し,バッファを適切に設定してください。 AP 統計レポートの見方については,マニュアル「Entier AP 開発編」を参照してください。 (b) バッファの割り当て バッファには次の 2 種類があります。 AREA バッファ OTHER バッファ AREA バッファは,明示的に DB エリアと対応付けたバッファです。それに対して OTHER バッファは,AREA バッファで設定しなかった残りの DB エリアに割り当てられるバッファ です。OTHER バッファしか使用していないと,使用頻度の高いデータも低いデータも同等 に扱われます。そのため,バッファを効果的に使用することができないおそれがあります。 よく使用されるインデックス用 DB エリアやデータ用 DB エリアには,専用の AREA バッフ ァを割り当てます。そうすることで,効果的にバッファを使用できます。 AREA バッファの割り当て例を次の図に示します。 インデックスA AREA バッファ1 インデックスAに対して, AREAバッファ1を割り当てる インデックスB AREA バッファ2 インデックスBに対して, AREAバッファ2を割り当てる OTHER バッファ AREAバッファを割り当てなかった インデックスや表などには, OTHERバッファが割り当てられる インデックスC 表A 表B ディスク 注 実際にはDBエリア単位に割り当てます。 コラム~DB エリアとは?~ DB エリアとは,表やインデックスなどを格納する論理的な領域のことです。表やインデッ クスを適切に DB エリアに格納することで,データベースの性能や運用容易性を向上できま す。詳細については,マニュアル「Entier 運用編」を参照してください。 66 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. ECM で設定できるのは OTHER バッファだけです(「5.3(2) バッファのサイズ変更」で設 定したのは,実際は OTHER バッファです)。AREA バッファを割り当てるためには,コネ クトオプションでの設定が必要です。ここでは,SQL 実行ユーティリティ(edsqlexe)を使 用して AREA バッファを設定する例を示します。 AREA バッファを割り当てるためには,SQL 実行ユーティリティ(edsqlexe)を起動する前 に,環境変数を設定します。次の内容でファイルを作成し,「edsqlexe.ini」というファイル 名で保存します。edsqlexe.ini は,SQL 実行ユーティリティ(edsqlexe)起動時のカレントデ ィレクトリに保存してください。 1 2 3 4 5 6 7 8 9 10 11 12 13 [EDSQLEXE] EDSQLEXE_EDBMEMLIMIT=2048 EDSQLEXE_EDBBUFNUM=20 EDSQLEXE_EDBGEOMBUFNUM=32 EDSQLEXE_EDBTBLPOL=24 EDSQLEXE_EDBTRACEFILESIZE=1024 EDSQLEXE_EDBAPREPORT=Y EDSQLEXE_EDBAREABUF=EDIDX001:30,EDDAT001:20 EDSQLEXE_EDBFTSTRIEBUFNUM=32 EDSQLEXE_EDBFTSIDXBUFNUM=32 EDSQLEXE_EXE_USERID=user1 EDSQLEXE_EXE_EDDIR=d:\eddir EDSQLEXE_EXE_DUMP=NO 8 行目の EDSQLEXE_EDBAREABUF で,AREA バッファの割り当てを次のとおり設定して います。 デフォルトの DB エリア(EDDAT001):20 面 後で追加した DB エリア(EDIDX001):30 面 DB エリアの追加は,データベース構成変更ユティリティ(edmod)を使用して別途行っ てください。この例では,「EDIDX001」という名前の DB エリアを追加してあるものと して説明しています。 以上の設定をすることで,次回以降に SQL 実行ユーティリティ(edsqlexe)を起動した際に, AREA バッファの割り当てが有効になります。環境変数の詳細については,マニュアル 「Entier ユティリティ編」を参照してください。 67 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. AP からデータベースにアクセスする場合のコーディング例を次に示します。 <省略> e_rdb_SQLConnectOpt_t cnctOpt; e_rdb_SQLConnectContext_t *cnctContext; e_rdb_SQLAreaBuffer_t buf1, e_rdb_SQLBufferDBAreaName_t char char /* コネクトオプション */ /* コネクトコンテキスト */ buf2; dbarea1, dbarea2; /* area_name_ix[]="EDIDX001"; area_name_dt[]="EDDAT001"; /* エリアバッファ情報(二つ分) */ DB エリア情報(二つ分) */ /* DB エリア名称 */ /* DB エリア名称 */ main(){ /* コネクトオプション領域の初期化 */ memset(&cnctOpt, 0x00, sizeof(e_rdb_SQLConnectOpt_t)); /* "EDIDX001" のエリア情報とバッファ情報を設定 */ dbarea1.DBAreaName = area_name_ix; /* エリア名称設定 */ dbarea1.NextDBAreaName = 0; /* 割り当てるエリアは一つで,チェーンなし */ buf1.DBAreaName = &dbarea1; /* バッファ情報に DB エリア情報をポイント */ buf1.NextAreaBuffer = &buf2; /* インデクス用のバッファ情報をチェーン */ buf1.BufferNumber = 30; /* バッファサイズ設定 */ /* "EDDAT001" のエリア情報とバッファ情報を設定 */ dbarea2.DBAreaName = area_name_dt; /* エリア名称設定 */ dbarea2.NextDBAreaName = 0; /* 割り当てるエリアは一つで,チェーンなし */ buf2.DBAreaName = &dbarea2; /* バッファ情報に DB エリア情報をポイント */ buf2.NextAreaBuffer = 0; /* 続くバッファ情報なし */ buf2.BufferNumber = 20; /* バッファサイズ設定 */ /* コネクトオプションにエリア情報を設定 */ cnctOpt.AreaBuffer = &buf1; /* その他のコネクトオプション設定 */ cnctOpt.MemoryLimitSize = 2048; cnctOpt.BufferNumber = 50; cnctOpt.TableDefPoolSize = 24; <省略> /* メモリサイズの上限 */ /* OTHER バッファの面数 */ /* 表定義情報プールサイズ */ ワンポイントアドバイス~バッファを割り当てるべき DB エリアとは?~ 割り当てられるバッファは,メモリの上限に左右されます。メモリに余裕がないとき,例え ばインデックス用 DB エリアとデータ用 DB エリアであれば,インデックス用 DB エリアに 対して優先的にバッファを割り当ててください。 68 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 6. トラブルシューティング この章では,トラブルシューティングの概要を説明し,トラブルシューティングに必要な情 報の取得および対処方法について説明します。 6.1 トラブルシューティングの概要 トラブルの発生から対処までの流れを次の図に示します。 図 6-1 トラブルの発生から対処までの流れ アプリケーション プログラム アプリケーションプロ グラムを再度実行する エラー トラブルシューティング エラーを検知する エラーの要因と対処方法を調べる エラーの要因を取り除く トラブルの発生から対処までの手順を次に説明します。 1. エラーを検知する ECLI 関数のリターンコード(SQL コード)でアプリケーションプログラムのエラーを検 知します。 2. エラーの要因と対処方法を調べる エラーログファイルを参照します。また,CLI 関数トレースを参照して,どの SQL でエ ラーが発生したかを調べます。 3. エラーの要因を取り除く 対処方法に従って,エラーの要因を取り除きます。 4. アプリケーションプログラムを再度実行する アプリケーションプログラムを再度実行します。 69 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 6.2 トラブルシュート情報 Entier では,トラブルシュート情報として次の情報を出力します。 表 6-1 トラブルシュート情報 Entier が出力する 説明 情報 システムログフ Entier が出力す ァイル(メッセー るすべてのメッ ジログ) セージが出力さ れます。 エラーログファ イル(エラーロ グ) CLI 関数トレース 目的 Entier に異常が発 生した場合に,異 常個所および原 因を調べるとき に参照します。 出力場所 運用ディレクト リ下の SPOOL デ ィレクトリに二 つ(edsys1.log と edsys2.log)作成 されます。 SQL 文実行時に SQL 文実行時に 運用ディレクト エラーが発生し エラーが発生し リ下の SPOOL デ た場合に,エラ た場合に,エラー ィレクトリに二 ー情報が出力さ の原因を調べる つ(ederr1.log と れます。 ときに参照しま ederr2.log)作成 す。 されます。 実行した AP の AP 実行時にエラ 運用ディレクト CLI 関数トレー ーが発生した場 リ下の SPOOL デ ス情報が出力さ 合に,エラーの原 ィレクトリに二 れます。 因となった CLI つ(edcli1.trc と 関数または SQL edcli2.trc)作成さ 文を調べるとき れます。 に参照します。 参照方法 テキストエディ タでファイルを 開いて参照しま す。 ワンポイントアドバイス CLI 関数トレースを取得するためには,あらかじめ設定が必要です。CLI 関数トレースの取 得方法については,「6.3(2) CLI 関数トレース」を参照してください。 特にテスト中には,エラーが発生した際に原因を特定できるよう,CLI 関数トレースを取得 することをお奨めします。 なお,CLI 関数トレースを取得していると性能に影響を及ぼすおそれがあります。性能測定 をする際は,CLI 関数トレースを取得しないようにしてください。 70 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 6.3 トラブルシュート情報の見方と対処方法 ここでは,エラーログファイルおよび CLI 関数トレースの見方と対処方法を説明します。 (1) エラーログファイル 出力先 エラーログファイル 運用ディレクトリ¥SPOOL¥ederr1.log または ederr2.log 参照方法 テキストエディタでファイルを開いて参照します。 メッセージの形式と見方 エラーログファイルに出力されるメッセージの形式を次の例に示します。 図 6-2 エラーログファイルのメッセージ例 トラブルシューティングに必要な項目を次に示します。 • 日付,時刻 メッセージが出力された日付と時刻です。 • メッセージ ID,説明(メッセージテキスト) Entier が出力したメッセージの ID およびその説明です。マニュアル「メッセージ編」の メッセージ ID の説明を参照して,エラーの要因と対処方法を調べることができます。 メッセージの形式については,「6.3(3) Entier が出力したメッセージの見方」を参照して ください。 (2) CLI 関数トレース 出力先 CLI 関数トレースファイル 運用ディレクトリ¥SPOOL¥edcli1.trc または edcli2.trc 取得方法 CLI 関数トレースを取得するには,コネクトオプションで CLI 関数トレースファイルサイ ズを指定する必要があります。指定していない場合は,ECM の[コネクトオプション] ダイアログを開き,CLI 関数トレースファイルサイズを指定してください。また,「AP 統計レポートを取得する」をチェックしてください。 ワンポイントアドバイス CLI 関数トレースファイルは,2 つのファイルを交互に使用します。CLI 関数トレースファ イルのサイズを小さく設定すると,ファイルの切り替え頻度が高くなり,取得した情報がす ぐに書き換えられてしまいます。そのため,CLI 関数トレースファイルサイズには,指定で きる最大値である 1,024 キロバイトを指定することをお奨めします。 71 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 参照方法 テキストエディタでファイルを開いて参照します。 CLI 関数トレースの形式と見方 出力される CLI 関数トレースの例を次に示します。 図 6-3 CLI 関数トレースの例 トラブルシューティングに必要な項目を次に示します。 • アプリケーションプログラムを実行した日時(AP START TIME) アプリケーションプログラムを実行した日付と時刻です。 • CLI 関数名(CLI Name) 実行された ECLI 関数名です。表示される ECLI 関数名は省略されています。主な ECLI 関数と CLI 関数名との対応を次の表に示します。 CLI 関数名 対応する ECLI 関数 AS e_rdb_SQLAllocStmt CC e_rdb_SQLCloseCursor CON e_rdb_SQLConnect DIS e_rdb_SQLDisconnect ED e_rdb_SQLExecDirect ET e_rdb_SQLEndTran EX e_rdb_SQLExecute FS e_rdb_SQLFreeStmt FT e_rdb_SQLFetch GDA e_rdb_SQLGetData PR e_rdb_SQLPrepare 72 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. • リターンコード(Return Code) ECLI 関数を実行した結果のリターンコード(SQL コード)です。ECLI 関数のリターンコ ードとその事象を次の表に示します。 リターンコード 事象 0 正常に終了 +100 データがない SQL コード SQL エラー SQL コードは,Entier が出力したメッセージのメッセージ ID の下 3 けたに対応していま す。SQL コードとメッセージ ID の対応を次の表に示します。 SQL コード メッセージ ID KFWA11nnn -nnn KFWA14nnn -4nnn KFWA15nnn -5nnn KFWA19nnn -1nnn KFWA12nnn +nnn 例えば,リターンコードが「-204」の場合,メッセージ ID は「KFWA11204-E」となるた め,マニュアル「Entier メッセージ編」の KFWA11204-E の説明を参照して,エラーの 要因と対処方法を調べることができます。 メッセージの形式については「6.3(3) Entier が出力したメッセージの見方」を参照してく ださい。 ワンポイントアドバイス ECM のメッセージビューにもメッセージが表示されます。 メッセージは,メッセージ ID と説明(メッセージテキスト)の形式で表示されます。エラ ーが発生した場合に,エラーの要因と対処方法を特定するには,マニュアル「Entier メッ セージ編」で該当のメッセージ ID(例:KFWA11202-E)を参照します。 (3) Entier が出力するメッセージの見方 Entier が出力するメッセージの形式について説明します。 メッセージ ID の意味を次に示します。 KFW Entier が出力するメッセージであることを示すコードです。 73 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. X1 メッセージの出力元を識別するコードです。詳細を次の表に示します。 コード 説明 A SQL 文についてのメッセージ C コマンド関連のメッセージ H データベース関連のメッセージ J JDBC ドライバ関連のメッセージ L ユティリティ関連のメッセージ(データベースの作成および再編成) S システム管理のメッセージ T ユティリティ関連のメッセージ(SQL の実行) X ユティリティ関連のメッセージ(環境定義) n1~n5 メッセージ番号を示します。 i メッセージの重要度を示します。詳細を次の表に示します。 種別 説明 E エラーメッセージ(エラーが発生したことを示します) W 警告メッセージ(問題があるおそれがあることを示します) I インフォメーションメッセージ(上記 E,および W に該当しない単純 な動作状況を示します) 例えば,メッセージ ID が「KFWA11204-E」の場合,メッセージの出力元コードが「A」, メッセージの重要度が「E」であることから,このメッセージは SQL 文でエラーが発生した ことを意味しています。 各メッセージの対処方法については,マニュアル「Entier メッセージ編」を参照してくだ さい。 74 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7. 応用編:空間検索をしよう Entier チュートリアル応用編の第1弾として, 空間検索をご紹介します。 この空間検索は, 実際のカーナビなどでも利用されている機能です。地図情報を扱うために作られた機能です が,使い方次第で様々なアプリケーションを生み出す要素となり得ることが期待されていま す。 7.1 サンプルを実行しよう 空間検索プログラミングについて説明をする前にいろいろと準備して頂くことがありま す。まずは,以下の流れにそってサンプルプログラムを実行してみるところから始めましょ う。実際に動かしながらソースを読み,本章の説明をご参照頂くことをお勧めします。 図 7-1 空間検索プログラミング作成から実行の流れ 1.インストール 2.運用ディレクトリの作成 3.DBの初期化 4.表の定義 5.インデックスの定義 6.データの挿入 7.Visual Studio 2005の設定 8.プログラムの設定と実行 (凡例) :この節で説明する作業です。 :この節では説明しない作業です。 75 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (1)インストール~(3)DB の初期化 は省略 (4) 表の定義 ここでは,本サンプルで使用する表を定義します。下 SQL を使用して,表を定義してく ださい。具体的な表定義の方法は,これまでのご紹介した例やマニュアルをご参照ください。 CREATE TABLE GEOM_SAMPLE ( ID , NAME CHAR(4) VARCHAR(100) , ADDRESS VARCHAR(100) , POINT GEOMPOINT ); 各列の意味 ID NAME : 施設情報の ID : 施設情報の名称 ADDRESS : 施設情報の住所 POINT (5) : 施設情報の座標 空間インデックスの定義 ここでは,本サンプルで使用する表を定義します。空間検索をするためには,空間インデ ックスが必要になります。下 SQL を用いて GEOMPOINT 型の列 POINT に対してインデッ クスを定義すれば,空間インデックスを定義することができます。 CREATE INDEX GEOM_IDX ON GEOM_SAMPLE(POINT) EMPTY ; 具体的なインデックス定義の方法は,これまでご紹介した例やマニュアルをご参照ください。 (6) データの挿入 定義した表 GEOM_SAMPLE へサンプルデータをインポートしてください。インポートフ ァイルは,「GEOM_SAMPLE_data.txt」(下リスト)です。 "0101","A レストラン新宿店","東京都新宿区西新宿 1-x","139703,35688,1" "0102","X 銀行品川支店","東京都港区港南 2-x","139742,35625,2" "0103","C レストラン渋谷店","東京都渋谷区道玄坂 1-x","139704,35655,1" "0104","B レストラン池袋店","東京都豊島区南池袋 1-x","139714,35727,1" "0105","Y 銀行大手町支店","東京都千代田区大手町 1-x","139768,35683,2" "0106","A レストラン上野店","東京都台東区上野 7-x","139780,35710,1" "0107","X 銀行有楽町店","東京都千代田区有楽町 1-x","139766,35672,2" "0108","B レストラン神田店","東京都千代田区内神田 3-x","139774,35690,1" 76 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 具体的なインポートの方法は,これまでのご紹介した例やマニュアルをご参照ください。 このサンプルデータの各施設情報情報の位置関係を下図に示します。 図 7-3 サンプルデータの各施設情報情報の位置関係 (7) VisualStudio2005 の設定 は省略 (8) サンプルプログラムの実行 これまで学習した手順を参考に「ecli_tutorial02.h」と「ecli_tutorial02.c」をビルドして実行 してみてください。「ecli_tutorial02.h」12行目の運用ディレクトリ,13行目のユーザー 名の指定をお忘れなく。 実行すると,以下のように実行する関数を選択できるようになっています。 *****Entier ECLI 関数を使ったサンプルプログラム**** 1. 矩形 2. 円 3. 折れ線 4. 終了 1.矩形 矩形で囲った中に該当する座標を検索する関数「execRECTANGLE()」 を実行します。 2.円 円で囲った中に該当する座標を検索する関数「execCIRCLE()」 を実行します。 3.折れ線 折れ線を中心線とするバッファ図形中に該当する座標を検索する関数 「execREGIONBUFFER()」 を実行します。 77 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.2 GEOMPOINT 型 GEOMPOINT 型(空間データ型)は,例えば施設情報の位置情報などの座標データ(X 座標, Y 座標を持つ二次元データ)を格納するために使用します。また,GEOMPOINT 型は座標を 表す(x,y)の他にもう一つ属性値を持ちます。本サンプルでは,施設情報の種別としてこ の属性値を使用しています。この属性値は利用目的に合わせて,さまざまな意味を持たせる ことができます。使い方によって,レストランだけの位置をを示す平面や銀行だけの位置を 示す平面など,複数枚の平面を表現できます。平面上に表現した GEOMPOINT 型の属性値 のイメージを下図に示します。 図 7-2 GEOMPOINT 型のデータ形式とデータ表現のイメージ Y Y X Y X Y Y X X n4 n3 X n2 n2 n1 (凡例) n1~n4:属性値 78 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.3 図形情報の入力の流れ 矩形,円,折れ線などの図形を用いて空間検索するためには,図形情報を SQL の検索条 件として入力する必要があります。図形情報を作成して検索を実行するまでの流れは以下の ようになります。 (1) SQL の準備(ステートメントの割り当て~コンパイル) 空間検索は,SQL のスカラ関数 WITHIN()を使用します。このスカラ関数 WITHIN()の第 2引数(REGION 指定)へ,?パラメタを用いて図形情報を入力することになります。本サン プルでは,以下2種類の SQL を使用します。 ・矩形・円形 : SELECT NAME,ADDRESS FROM GEOM_SAMPLE WHERE WITHIN(POINT,?,?)=TRUE ・折れ線 : SELECT NAME,ADDRESS FROM GEOM_SAMPLE WHERE WITHIN(POINT, REGIONBUFFER(?, 1.0E+1, DEFAULT, DEFAULT, DEFAULT), ?)=TRUE 上から2つ目の SQL のように折れ線(を中心線とするバッファ図形)のような複雑な図形 を入力するためには,スカラ関数 REGIONBUFFER()を使って WITHIN()の第2引数へ図形情 報を渡すことになります。また,本サンプルでは,スカラ関数 WITHIN()の第3引数の入力 例も紹介します。ここへは,GEOMPOINT 型の3つ目の値に対する補助条件を指定します。 (2) e_rdb_SQLBindParam() を実行 図形情報をスカラ関数 WITHIN()の第2引数へ渡すため,図形情報のアドレスを e_rdb_SQLBindParam()を使用して SQL の?パラメタと関連付けます (3) 図形情報の作成 「ecli_tutorial02.h」に定義している以下の構造体を用いて図形情報を作成します。 ・GEO_REGION_RECTANGLE_t : 矩形情報 ・GEO_REGION_CIRCLE_t ・GEO_LINESTRING_t : 円形情報 : 折れ線情報 本サンプルでは,これらの構造体変数を宣言し,各値を代入することで,図形情報を作成 79 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. しています。 (4) SQL の実行(実行,フェッチ,クローズ) 図形情報の入力を完了させてから SQL を実行することで空間検索をおこない,該当する 行を表から取得します。 この章では,REGION 指定/ LINESTRING 指定/ CONDITION 指定などという普段は聞か ないキーワードが重要です。章末にポイントがまとめてありますから,まずそちらに目を通 すのも良いでしょう。 7.4 スカラ関数 WITHIN() 第 1 引数に GEOMPOINT 型の列(COLUMN 指定),第 2 引数に図形情報(REGION 指定)を 指定することで,指定した GEOMPOINT 型の列が図形中に含まれるかどうかを判定します。 また,第 3 引数には,GEOMPOINT 型の属性値(3つ目の値)に対して補助条件(CONDITION 指定)を指定することができます。 スカラ関数 WITHIN()の形式 検索範囲図形(REGION 指定)の形式 属性値に対する補助条件(CONDITION 指定)の形式 80 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.5 スカラ関数 REGIONBUFFER() スカラ関数 WITHIN の第 2 引数である REGION 指定の形式に従ったデータを生成します。 スカラ関数 REGIONBUFFER()の形式 中心線図形(LINESTRING 指定)の形式 スカラ関数 REGIONBUFFER を使用すると,下図のように,折線を中心線としてバッファ 幅を設定した図形(バッファ図形)を,REGION 指定に指定可能な多角形データとして生 成できます。 図 7-4 折線を中心線としてバッファ幅を設定した図形(バッファ図形) バッファ幅 折線 本サンプルでは,このスカラ関数 REGIONBUFFER()を折れ線付近に該当する座標を検索す る関数「execREGIONBUFFER()」にて使用しています。下 SQL の一部は,スカラ関数 REGIONBUFFER()の使用例の WHERE 句だけを抜粋したものです。以下,このサンプルを 使って各引数の簡単な説明をします。 ...WHERE WITHIN(POINT,REGIONBUFFER(?,1.0E+1,DEFAULT,DEFAULT,DEFAULT),?)=TRUE 折れ線の図形情報は LINESTRING 指定として,第1引数に?パラメタを用いることで入 力します。つまり,ここへ入力するデータ構造 GEO_LINESTRING_t は,検索範囲となるバ 81 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. ッファ図形の中心線情報を表していることになります。 第2引数に BUFFER 指定として FLOAT 型の数値 1.0E+1 を指定しています。この値で折 線を中心線とした時の検索範囲の幅を決めます。 第3引数に DISTANCE 指定として DEFAULT を指定しています。この値は,折れ線の簡 略化をおこなう場合の元の折れ線と簡略化する線との間の距離です。このサンプルでは簡略 化は行なわないので,DEFAULT を指定しています。折れ線を簡略化すると,検索範囲の図 形を構成する点数が少なくなるため,検索性能の向上を図ることができます。 第4引数に DIVNUM 指定として DEFAULT を指定しています。この値は,輪郭線の丸み の度合いを指定します。DEFAULT を指定すると,丸み(半円の弧の部分)が12の点で構 成される折れ線として解釈されます。輪郭線の丸みを構成する点数を減らせば,検索範囲の 図形を構成する点数が少なくなるため,検索性能の向上を図ることができます。 第5引数に EDGEMODE 指定として DEFAULT を指定しています。この値は,中心線よ り右または左を切り落とすなどを指定する値です。本サンプルでは切り落としは行なわない ので,DEFAULT を指定しています。 スカラ関数 REGIONBUFFER()の引数の詳細については,マニュアル「Entier SQL 仕様編」 をご参照ください。 82 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.6 図形情報(矩形) 矩形情報は,構造体 GEO_REGION_RECTANGLE_t で表現します。 /* スカラ関数 WITHIN の REGION 指定用構造体 */ /* WITHIN 関数の第 2 引数設定用(矩形) typedef struct { */ int length; /* BINARY 型としての長さ char accuracy[1]; /* 精度 整数座標系 0 */ char type[1]; /* 図形種別 矩形 1 円 2 */ char reserve[2]; int x1; /* 第一点の x 座標 */ int y1; /* 第一点の y 座標 */ int x2; /* 第二点の x 座標 */ int y2; /* 第二点の y 座標 */ /* 予備 2バイト */ */ } GEO_REGION_RECTANGLE_t; 7.7 図形情報(円形) 円形情報は,構造体 GEO_REGION_CIRCLE_t で表現します。 /* スカラ関数 WITHIN の REGION 指定用構造体 */ typedef struct /* WITHIN 関数の第 2 引数設定用(矩形) { */ /* e_rdb_BINARY_t のメンバ Length に相当 */ int length ; char accuracy[1] ; /* 精度 整数座標系 0 char type[1] ; char reserve[2] ; /* 予備 2バイト int x; /* 円の x 座標 */ int y; /* 円の y 座標 */ int r; /* 円の半径 /* 図形種別 矩形 1 円 2 */ */ */ */ } GEO_REGION_CIRCLE_t; 83 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.8 バッファ図形の中心線情報(折れ線) GEO_LINESTRING_t は検索範囲となるバッファ図形の中心線情報であって, LINESTRING 指定に対応するものです。REGION 指定に入力するものではありません。折 れ線を中心に作成される図形は矩形や円のような単純な図形でないため,スカラ関数 REGIONBUFFER()を用いて REGION 指定の形式にマッチする図形情報を生成することにな ります。 /* スカラ関数 REGIONBUFFER の LINESTRING 指定用構造体 */ typedef struct /* REGIONBUFFER 関数の第一引数設定用(経路) */ { /* e_rdb_BINARY_t のメンバ Length に相当 */ int length ; char accuracy[1]; /* 精度 整数座標系 0 */ char type[1]; /* 図形種別 折れ線 2 */ char reserve[2]; /* 予備 2バイト */ short pointno; /* 座標の個数 */ char reserve2[2]; /* 予備 2バイト */ int x01; /* 第 1 点の x 座標(5点で固定) int y01; /* 第 1 点の y 座標 */ int x02; /* 第 2 点の x 座標 */ int y02; /* 第 2 点の y 座標 */ int x03; /* 第 3 点の x 座標 */ int y03; /* 第 3 点の y 座標 */ int x04; /* 第 4 点の x 座標 */ int y04; /* 第 4 点の y 座標 */ int x05; /* 第 5 点の x 座標 */ int y05; /* 第 5 点の y 座標 */ */ } GEO_LINESTRING_t ; この例では,折れ線を構成する座標の個数を5点にしていますが,「5点でなければならな い。」や「5点までしか指定できない。」ということではありません。実際のアプリケーシ ョン開発では,ご利用目的に応じた応用をして頂くことになります。この応用方法自体につ いては,Entier のテクニックと言うよりも,C 言語プログラミング自体のテクニックに当り ますので,本書では触れません。 84 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.9 図形情報とバイナリ型(e_rdb_BINARY_t) まずここでは簡単のため,図形情報の1つである矩形情報について説明します。矩形情報は, C 言語の構造体 GEO_REGION_RECTANGLE_t を用いて作成します。 GEO_REGION_RECTANGLE_t は REGION 指定の形式にて矩形情報を表現するものであ り,Entier の仕様では,REGION 指定のデータは Entier のバイナリ型として扱います。 (※ LINESTRING 指定のデータも Entier のバイナリ型です。)このため,ECLI 関数を使ったプ ログラミングでは,構造体 GEO_REGION_RECTANGLE_t で作成した矩形情報を Entier の バイナリ型(本サンプルでは e_rdb_BINARY_t で表現)として,?パラメタへ値を渡しま す。 Entier のバイナリ型は以下のような構造をしています。 バイナリ型のデータ形式 ここで,構造体 GEO_REGION_RECTANGLE_t の構造を見ると、先頭メンバはデータ部分 の大きさを格納する int 型(sizeof(int)=4 の環境前提)の length になっています。これは、バ イナリ型のデータ形式における実データ長を格納する部分(上図の “L” の部分)に当たり ます。2番目のメンバ accuracy からがバイナリデータ部にあたることになります。 85 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 矩形情報をバイナリ型として入力する部分に着目して抜き出すと,そのコーディングは以下 のようになります。 ○変数宣言 e_rdb_BINARY_t *p_rectangle ; /* REGION 指定は BINARY 型の値 GEO_REGION_RECTANGLE_t rectangle; e_rdb_SQLInd_t */ /* WITHIN 関数の第2引数 REGION 指定 */ indi_param1 ; ・・・ ○矩形情報を BINARY 型として扱えるようにする p_rectangle = (e_rdb_BINARY_t *)&rectangle ; ・・・ ○e_rdb_SQLBindParam()実行 indi_param1 = e_rdb_SQL_NOT_NULL_DATA; rtnc = e_rdb_SQLBindParam( _cnctContext , _hStmt /* 文ハンドル */ , 1 /* パラメタ番号 */ /* 値を格納する領域のアドレス */ , p_rectangle /* 標識変数のアドレス , &indi_param1 */ ); ・・・ ○矩形情報の値設定 /* 精度 整数座標系 0 rectangle.accuracy[0] = 0x00; */ /* 矩形を設定 */ rectangle.reserve[0] = 0x00; /* 予備 2 バイト */ rectangle.reserve[1] = 0x00; /* 予備 2 バイト */ rectangle.type[0] = 0x01; rectangle.x1 = MIN_X_POINT; /* X 座標最小値 */ rectangle.y1 = MIN_Y_POINT; /* Y 座標最小値 */ rectangle.x2 = MAX_X_POINT; /* X 座標最大値 */ rectangle.y2 = MAX_Y_POINT; /* Y 座標最大値 */ ・・・ ○バイナリ型としてデータ部の大きさを設定 p_rectangle->Length = sizeof(rectangle) - sizeof(rectangle.length) ; ・・・ バッファ図形の中心線情報である折れ線情報 GEO_LINESTRING_t については,前述 したとおり REGION 指定ではなく LINESTRING 指定として入力することになります。しか し,LINESTRING 指定もバイナリ型であり,?パラメタを用いて値を入力するので,コーデ ィングの流れは REGION 指定(矩形・円など)の場合と同様になります。 86 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.10 CONDITION 指定 CONDITION 指定のデータは,下の構造体 GEO_CONDITION_t で表現します。 /* スカラ関数 WITHIN の CONDITION 指定用構造体 */ typedef struct /* WITHIN 関数の第 3 引数設定用 { */ int length; /* e_rdb_BINARY_t のメンバ Length に相当 */ char type[1]; /* 判定種別 0:条件なし char reserve[1]; short number; int value[1]; */ /* 1:ビットマスク */ /* 2:範囲判定 */ /* 3:一致判定 */ /* 予備 1バイト */ /* 比較値の個数 /* 比較値(1 個分) */ */ } GEO_CONDITION_t ; スカラ関数 WITHIN()の第3引数である補助条件は,GEOMPOINT 型の属性値(3番目の値) に対応しています。この補助条件(CONDITION 指定)を入力することで,取得するデータの 絞り込みなどができます。REGION 指定と同様,Entier の仕様では, CONDITION 指定の データ型もバイナリ型です。このことから,補助条件を入力するコーディングも,REGION 指定/ LINESTRING 指定と同様の流れになります。 87 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.11 execRECTANGLE()の実行 サンプルプログラムを実行し,execRECTANGLE()を実行するには,一番初めに「1. 矩形」 を選択します。このサンプルプログラムでは,矩形を構成する各座標を「ecli_tutorial02.h」 にて以下のように設定しています。 #define MIN_X_POINT 139700; #define MIN_Y_POINT 35600; #define MAX_X_POINT 139800; #define MAX_Y_POINT 35800; この値で構成される矩形のイメージを下に図示します。 図 7-5 検索範囲として矩形を指定した実行イメージ 最大座標 最小座標 レストランを検索するか,銀行を検索するかを求められるので,どちらかを入力してくださ い。上図の矩形中にある施設情報の名称が一覧で表示されます。矩形を構成する各座標の値 を変えて実行してみてください。 88 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.12 execCIRCLE ()の実行 execCIRCLE ()を実行するには,一番初めに「2. 円」を選択します。このサンプルプログラ ムでは,円を構成する各座標を「ecli_tutorial02.h」にて以下のように設定しています。 #define X_POINT 139750; #define Y_POINT 35650; ※半径 r は任意 この値で構成される円のイメージを下に図示します。 図 7-6 検索範囲として円を指定した実行イメージ(半径 r = 50) 半径r ここでもレストランを検索するか,銀行を選択するかを求められるので,どちらかを入力し てください。その後,円の半径の値を求められるので,いろいろな値を試してください。 89 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.13 execREGIONBUFFER ()の実行 execREGIONBUFFER ()を実行するには,一番初めに「3. 折れ線」を選択します。このサン プルプログラムでは,円を構成する各座標を「ecli_tutorial02.h」にて以下のように設定して います。 #define X1_POINT 139700 #define Y1_POINT 35650 #define X2_POINT 139700 #define Y2_POINT 35700 #define X3_POINT 139740 #define Y3_POINT 35625 #define X4_POINT 139750 #define Y4_POINT 35700 #define X5_POINT 139800 #define Y5_POINT 35750 この値で構成される折れ線のイメージを下に図示します。 図 7-7 検索範囲として折れ線を中心線とするバッファ図形を指定した実行イメージ Y座標 35800 終点 35750 Bレストラン新宿店 Aレストラン上野店 35700 Aレストラン新宿店 Aレストラン神田店 Y銀行大手町支店 X銀行有楽町支店 Cレストラン渋谷店 35650 始点 X銀行品川支店 35600 0 X座標 139700 139725 139750 139775 139780 やはりここでもレストランを検索するか,銀行を選択するかを求められるので,どちらかを 入力してください。その後,折れ線を中心線とするバッファ図形上にある施設情報の一覧が 表示されます。折れ線を構成する各座標の値を変えて実行してみてください。 90 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.14 空間検索その他いろいろ (1) スカラ関数 GEOMDISTANCE() スカラ関数 GEOMDISTANCE()は,2つの GEOMPOINT 型データを入力として受け取り, その2点間の距離を返す関数です。以下に,その使用例として,「ある地点を始点とするル ート上のデータを近い順にソートする」SQL 例を以下に示します。 SELECT NAME,ADDRESS,GEOMDISTANCE(POINT,GEOMPOINT'139700,35650,0') NEAR FROM GEOM_SAMPLE WHERE WITHIN(POINT, REGIONBUFFER(?, 1.0E+1, DEFAULT, DEFAULT, DEFAULT), ?)=TRUE ORDER BY NEAR スカラ関数 GEOMDISTANCE()の第2引数に指定している「GEOMPOINT'139700,35650,0'」 は,サンプルプログラムで使用した折れ線の始点です。この例では,始点の座標を GEOMPOINT 型の定数として直接 SQL に書き込んでいます。上記 SQL は, execREGIONBUFFER ()にて使用している SQL と差し替えて動かしてみることができます。 (2) 多角形(POLYGON) 本サンプルプログラムでは,検索範囲として指定する図形として,矩形,円,折れ線(を中 心線としたバッファ図形)をご紹介しましたが,5角形や6角形などの多角形(POLYGON) で検索範囲を指定することもできます。詳細は,マニュアル「Entier SQL 仕様編」などをご 参照ください。 (3) 空間検索距離補正 空間検索機能で,次の検索をする際に距離補正ができます。 ・スカラ関数 GEOMDISTANCE() で距離を求める検索 ・スカラ関数 WITHIN() を使用した円検索 皆さんもご存知の通り,地図は平面ですが,地球は丸いです。このため,各データ間の距離 を正確に求めるためには,専門的な知識を用いて補正を行なう必要があります。詳細は,マ ニュアル「Entier 運用編」,「Entier AP 開発編」などをご参照ください。 91 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 7.15 空間検索まとめ 以下,本章のポイントを箇条書きします。 (1) 空間検索とは? 矩形,円,多角形,折れ線(を中心線としたバッファ図形)といった図形を検索範囲として, GEOMPOINT 型の列に格納された座標情報に対して該当する行を検索するものです。 (2) 座標情報はどうやってデータベースに格納するのか? Entier には,座標情報を格納するために GEOMPOINT 型というデータ型があります。この GEOMPOINT 型の列を定義して座標情報を格納します。GEOMPOINT 型には,3つの値を 格納することができ,1番目と2番目に座標情報を格納し,3番目にはその施設情報のジャ ンルなどの意味を持たせた値を格納することができます。 (3) SQL で空間検索する方法は? WHERE 句の探索条件としてスカラ関数 WITHIN()を使用します。 第1引数(COLUMN 指定)に検索対象の列, 第2引数(REGION 指定)に検索範囲の図形情報, 第3引数(CONDITION 指定)に属性値(GEOMPOINT 型の3番目の値)に対する補助条件 を指定します。 (4) 検索範囲となる図形情報はどうやって作るのか? スカラ関数 WITHIN()の第2引数「REGION 指定」のデータ形式にマッチする構造体を使用 します。具体的には本サンプルでご紹介したC言語の構造体 GEO_REGION_RECTANGLE_t GEO_REGION_CIRCLE_t および、 スカラ関数 REGIONBUFFER()と GEO_LINESTRING_t をご参照ください。 (5) 図形情報をどうやって SQL に渡すのか? スカラ関数 WITHIN()の第2引数に?パラメタを指定します。この?パラメタに対して図形 情報のアドレスを関連付けます。図形情報のアドレスを?パラメタに関連付けるには ECLI 関数 e_rdb_SQLBindParam() を使用します。 (6) 折れ線(を中心線としたバッファ図形)の図形情報はどうやって作成 するのか? 「折れ線」と言っても,検索範囲として指定する図形は,「折れ線を中心線とするバッファ 92 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 図形」です。そのため,まず折れ線の図形情報を使って,その折れ線を中心線とするバッフ ァ図形情報を作成する必要があります。 折れ線を中心線とするバッファ図形の図形情報は,スカラ関数 REGIONBUFFER()を使用し て作成します。 第1引数の LINESTRING 指定へ折れ線の図形情報を渡すことで,(折れ線の図形情報を SQL に渡す方法は,円や矩形の図形情報をスカラ関数 WITHIN()の第2引数に渡す場合と同様。) その折れ線を中心線とするバッファ図形の図形情報を作成してくれます。 スカラ関数 REGIONBUFFER()が作成したバッファ図形の図形情報は「REGION 指定」のデ ータ形式なので,スカラ関数 WITHIN()の第2引数として渡すことで空間検索が可能となり ます。 (7) GEOMPOINT 型の3番目の値に対する補助条件はどうやって指定す るのか? 図形情報と同様に,スカラ関数 WITHIN()の第3引数(CONDITION 指定)のデータ形式に マッチする構造体を使用します。具体的には本サンプルでご紹介したC言語の構造体 GEO_CONDITION_t をご参照ください。SQL に対する値の渡し方やコーディングの手順は, 図形情報の場合と同様になります。 93 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 付録A. リソース構造の概要 付録A.1. メモリリソース構造の概要 Entier のメモリリソース構造の概要を次の図に示します。 図 A-1 Entier のメモリリソース構造の概要 アプリケーション実行時のメモリ Entierデータベースの実行メモリ DBエリアバッファ AREA用 OTHER用 SQL オブジェクト ディクショナリ用 作業表用 ユーザ用 表定義プール ジャーナル バッファ : : : … Entierファイルシステムの実行メモリ 管理情報 入出力バッファ Entierデータベースの運用ディレクトリ DBエリア ジャーナルファイル システム用 EDJNL001 ディクショナリ用 EDJNL900 作業表用 ユーザ用 HDD メモリリソースには,次のものがあります。 (1) Entier が利用するデータベースの実行メモリ データベースの接続時に確保されるメモリ領域です。この領域内で Entier データベースが動 作します。この領域には,DB エリアバッファ,表定義プール,ジャーナルバッファなどが 確保されます。ECLI 関数 e_rdb_SQLConnect()で,領域サイズの上限を指定します。 ECLI 関数 e_rdb_SQLConnect()の詳細については,マニュアル「Entier AP 開発編」の 「e_rdb_SQLConnect()(Entier との接続)」を参照してください。 94 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (2) Entier ファイルシステムの実行メモリ Entier のファイルシステムの初期化(e_rdb_fs_start())時に確保されるメモリ領域です。この 領域内で Entier データベースが動作します。 この領域には,ファイルの管理領域,および I/O バッファが確保されます。関数 e_rdb_SQLConnect()で,サイズを指定します。 e_rdb_fs_start()の詳細については,マニュアル「Entier ファイルシステム編」の 「e_rdb_fs_start」を参照してください。 注意 Entier ファイルシステムは,開発環境では必要ありません。ファイルシステムに関する設定も不要 です。例えば,開発環境が Windows の場合,FAT や NTFS などのファイルシステムの機能を使用し て,Entier は動作します。 95 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 付録A.2. ストレージリソース構造の概要 Entier のストレージリソース構造の概要を次の図に示します。 図 A-2 Entier のストレージリソース構造の概要 アプリケーション実行時のメモリ Entierデータベースの実行メモリ DBエリアバッファ AREA用 OTHER用 SQL オブジェクト ディクショナリ用 作業表用 ユーザ用 ジャーナル バッファ 表定義プール : : : … Entierファイルシステムの実行メモリ 管理情報 入出力バッファ Entierデータベースの運用ディレクトリ DBエリア ジャーナルファイル システム用 EDJNL001 ディクショナリ用 EDJNL900 作業表用 ユーザ用 DBエリア HDD セグメント ページ : レコード1 レコード2 レ コード3 … … レコードn 96 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. ストレージリソースには,主に次のものがあります。 (1) DB エリア DB エリアは,表やインデックス,作業表,およびシステムファイルを格納する領域です。 DB エリアの中には,セグメントがあり,さらにページがあります。セグメントとは,表や インデクスのデータを格納する最小単位です。ページは,Entier が利用するデータベースが 入出力動作する最小単位です。ページの中に,行の情報(レコード)が格納されます。DB 初期設定ユーティリティ edinit でセグメントサイズやページサイズを指定します。 DB エリアの詳細については,マニュアル「Entier 運用編」を参照してください。 注意 この資料では,バイナリデータについては触れていません。バイナリデータについては,ここで紹 介したもののほか,バイナリデータ用 DB エリアなどがあります。Entier では,長大データとして 扱うケースの多いバイナリデータを個別にチューニングする手段を提供しています。 (2) ジャーナルファイル ジャーナルファイルには,データベースの更新内容を元に戻すための情報が格納されます。 トランザクションが終了するたび,または一行更新するたびに,その更新情報を記録します。 一つのファイルが満杯になると,次のファイルが追加されます。 ジャーナルファイルの詳細については,マニュアル「Entier 運用編」の「ジャーナルファ イルの概要」を参照してください。 97 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 付録B. データベースアクセスの流れ 付録B.1. 参照時のデータベースアクセスの流れ 参照時にデータベースをアクセスするときの流れを次の図に示します。 図 B-1 参照時のデータベースアクセスの流れ アプリケーション実行時のメモリ アプリケー ション Entierデータベースの実行メモリ DBエリアバッファ 1. AREA用 OTHER用 2. インデックス用 3. データ用 SQL オブジェクト 作業表用 表定義プール ジャーナル バッファ : : : … Entierファイルシステムの実行メモリ 管理情報 入出力バッファ Entierデータベースの運用ディレクトリ 4. DBエリア ジャーナルファイル システム用 EDJNL001 インデックス用 EDJNL900 データ用 作業表用 HDD (凡例) :関数が呼び出されるときの動きを示します。 :関数によって影響される個所を示します。 1. アプリケーションから SQL の前処理関数(e_rdb_SQLPrepare)が呼び出されると,「表 定義プール」からディクショナリ情報を参照し,SQL を解析します。 2. アプリケーションから行の取り出し関数(e_rdb_SQLFetch)が呼び出されると,その関 数(e_rdb_SQLFetch)は「DB エリアバッファ」に該当するデータがあるかどうかを判 定します。該当するデータがない場合,「入出力バッファ」を経由して HDD から該当 ページをメモリに読み込みます。 98 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3. アプリケーションから列の値の取得関数(e_rdb_SQLGetData)が呼び出されると,その 関数(e_rdb_SQLGetData)は「DB エリアバッファ」の該当ページにある該当情報をア プリケーションの変数領域へコピーします。 99 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 付録B.2. 更新時のデータベースアクセスの流れ 更新時にデータベースをアクセスするときの流れを次の図に示します。 図 B-2 更新時のデータベースアクセスの流れ アプリケーション実行時のメモリ アプリケー ション Entierデータベースの実行メモリ DBエリアバッファ 1. AREA用 2. インデックス用 データ用 OTHER用 3. SQL オブジェクト 4. 作業表用 表定義プール ジャーナル バッファ : : : … Entierファイルシステムの実行メモリ 管理情報 入出力バッファ Entierデータベースの運用ディレクトリ DBエリア ジャーナルファイル システム用 EDJNL001 インデックス用 EDJNL009 データ用 作業表用 HDD (凡例) :関数が呼び出されるときの動きを示します。 :関数によって影響される個所を示します。 1. アプリケーションから SQL の前処理関数(e_rdb_SQLPrepare)が呼び出されると,「表 定義プール」からディクショナリ情報を参照し,SQL を解析します。 2. アプリケーションから行の更新関数(e_rdb_SQLExecute)が呼び出されると,その関数 (e_rdb_SQLPrepare)は「DB エリアバッファ」に該当するデータがあるかどうかを判 定します。該当するデータがない場合,「入出力バッファ」を経由して HDD から該当 ページをメモリに読み込みます。 3. 更新関数の延長で,更新したページの内容を「ジャーナルバッファ」※1にコピーします。 4. DBエリアバッファの更新情報は,ページの掃き出し※2,またはコミットのタイミング 100 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. で,HDDに書き込まれます。 注※1 「ジャーナルバッファ」は,バッファ満杯,またはコミット(e_rdb_SQLEndTran) するタイミングで,HDD に書き込まれます。 注※2 ページの掃き出しは,DB エリアバッファが更新済のページで満杯になったときなど に発生します。次に読み込むべきページの領域を確保するために,バッファ上のページを HDD に書き込んで破棄する動作です。詳しくは,マニュアル「Entier 運用編」をご参照く ださい。 101 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 付録C.コーディングのポイント集 ここでは,コーディングをする際にポイントとなる点をご紹介します。 付録C.1. DB と AP のデータの受け渡し データベースとアプリケーションでのデータの受け渡し例を,データ型ごとに説明します。 ここでは,以下のデータ型についてのコーディング例を示します。 • INTEGER 型 • SMALLINT 型 • DECIMAL 型 • FLOAT 型 • CHAR 型 • VARCHAR 型 • BINARY 型 • PACK 型 • GEOMPOINT 型 • BIT 型 各データ型の詳細については,マニュアル「Entier AP 開発編」を参照してください。 INTEGER 型のデータの受け渡し (1) PREF_CODE 列(INTEGER 型)のデータの受け渡し例を示します。 (a) データベースから C 言語のデータとして出力する例 1. 宣言 signed int pref_code; /* 取得したデータを格納する領域 signed int indi_prefcode; /* 取得したデータがナル値かどうかのインジケータ */ */ 2. FETCH(行の取り出し)でデータを受け取るアドレスを Entier に通知 rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(1), /* 列番号 */ &pref_code, /* 値を格納する領域のアドレス */ sizeof(pref_code), /* 値を格納する領域の領域長 */ &indi_prefcode /* インジケータのアドレス */ ); 3. 取得(FETCH 後) /* データがナル値でなければ PREF_CODE 列を,ナル値であれば NULL を表示 */ if (indi_prefcode != e_rdb_SQL_NOT_NULL_DATA) { 102 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. printf("PREF_CODE : %d ", pref_code); printf("\n"); } else { printf("PREF_CODE : NULL "); printf("\n"); } (b) C 言語のデータからデータベースに入力する例 1. 宣言 signed int pref_code; /* ?パラメタに渡すデータを格納する領域 e_rdb_SQLInd_t indi_prefcode; /* 渡すデータがナル値かどうかのインジケータ */ */ 2. データ受け渡し用領域のアドレスを Entier に通知 rtnc = e_rdb_SQLBindParam(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(1), /* パラメタ番号 */ &pref_code, /* 値を格納する領域のアドレス */ &indi_prefcode /* インジケータのアドレス */ ); 3. 入力値を受け渡し用領域へセット pref_code = 15; 4.-(a) インジケータの設定(入力値がナル値ではない場合) indi_prefcode = e_rdb_SQL_NOT_NULL_DATA; 4.-(b) インジケータの設定(入力値がナル値の場合) indi_prefcode = e_rdb_SQL_NULL_DATA; SMALLINT 型のデータの受け渡し (2) SINT_CODE 列(SMALLINT 型)のデータの受け渡し例を示します。 (a) データベースから C 言語のデータとして出力する例 1. 宣言 signed short sint_code; /* 取得したデータを格納する領域 signed int indi_sintcode; /* 取得したデータがナル値かどうかのインジケータ */ */ 103 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 2. FETCH(行の取り出し)でデータを受け取るアドレスを Entier に通知 rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(2), /* 列番号 */ &sint_code, /* 値を格納する領域のアドレス */ sizeof(sint_code), /* 値を格納する領域の領域長 */ &indi_sintcode /* インジケータのアドレス */ ); 3. 取得(FETCH 後) /* データがナル値でなければ SMALLINT 型の列値を,ナル値であれば NULL を表示 */ if (indi_sintcode != e_rdb_SQL_NOT_NULL_DATA) { printf("SINT_CODE : %d ", sint_code); printf("\n"); } else { printf("SINT_CODE : NULL "); printf("\n"); } (b) C 言語のデータからデータベースに入力する例 1. 宣言 signed short sint_code; /* ?パラメタに渡すデータを格納する領域 e_rdb_SQLInd_t indi_sintcode; /* 渡すデータがナル値かどうかのインジケータ */ */ 2. データ受け渡し用領域のアドレスを Entier に通知 rtnc = e_rdb_SQLBindParam(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(2), /* パラメタ番号 */ &sint_code, /* 値を格納する領域のアドレス */ &indi_sintcode /* インジケータのアドレス */ ); 3. 入力値を受け渡し用領域へセット sint_code = (signed short)15; 4.-(a) インジケータの設定(入力値がナル値ではない場合) indi_sintcode = e_rdb_SQL_NOT_NULL_DATA; 4.-(b) インジケータの設定(入力値がナル値の場合) indi_sintcode = e_rdb_SQL_NULL_DATA; 104 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. DECIMAL 型のデータの受け渡し (3) DEC_DATA 列(DECIMAL 型)のデータの受け渡し例を示します。 なお,DEC_DATA 列は DECIMAL(10,3)と定義されているものとします。 (a) データベースから C 言語のデータとして出力する例 1. 宣言 #include "edbcnv.h" /* データ型変換関数のためのヘッダ */ unsigned char d_decdata[6]; /* 取得したデータを格納する領域 char dec_data[13]; /* 取得データを文字列型に変換 signed int indi_decdata; /* 取得したデータがナル値かどうかのインジケータ */ 6:↓10÷2↓+1 13:精度(10)+3 */ */ 2. FETCH(行の取り出し)でデータを受け取るアドレスを Entier に通知 rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(3), /* 列番号 */ d_decdata, /* 値を格納する領域のアドレス */ sizeof(d_decdata), /* 値を格納する領域の領域長 */ &indi_decdata /* インジケータのアドレス */ ); 3. 取得(FETCH 後) /* データ型変換関数を使用して文字列型に変換する場合 */ /* データがナル値でなければ DECIMAL 型の列値を,ナル値であれば NULL を表示 */ if (indi_decdata != e_rdb_SQL_NOT_NULL_DATA) { e_rdb_CNV_DECIMALchar(d_decdata, /* 変換元データの領域アドレス */ (unsigned short)10, /* 変換元データの精度 */ (unsigned short)3, /* 変換元データの位取り */ dec_data, /* 変換後データの領域アドレス */ (unsigned short)sizeof(dec_data) /* 変換後データの領域長 */ ); printf("DEC_DATA : %s ", dec_data); printf("\n"); } else { printf("DEC_DATA : NULL "); printf("\n"); } 105 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (b) C 言語のデータからデータベースに入力する例 1. 宣言 #include "edbcnv.h" /* データ型変換関数のためのヘッダ */ char dec_data[10+3]; unsigned char d_decdata[6]; /* ?パラメタに渡すデータを格納する領域 /* ?パラメタに渡す元データの文字列表現 */ e_rdb_SQLInd_t indi_decdata; /* 渡すデータがナル値かどうかのインジケータ */ */ 2. データ受け渡し用領域のアドレスを Entier に通知 rtnc = e_rdb_SQLBindParam(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(3), /* パラメタ番号 */ d_decdata, /* 値を格納する領域のアドレス */ &indi_decdata /* インジケータのアドレス */ ); 3. 入力値を受け渡し用領域へセット /* 文字列表現の数データを DECIMAL 型に変換 */ strcpy(dec_data, "1234567.890"); e_rdb_CNV_charDECIMAL(dec_data, /* 変換元データの領域アドレス */ (unsigned short)strlen(dec_data), /* 変換元データの領域長 (unsigned short)10, /* 変換後データの精度 */ */ (unsigned short)3, /* 変換後データの位取り */ d_decdata, /* 変換後データの領域アドレス */ (unsigned short)sizeof(d_decdata) /* 変換後データの領域長 */ ); 4.-(a) インジケータの設定(入力値がナル値ではない場合) indi_decdata = e_rdb_SQL_NOT_NULL_DATA; 4.-(b) インジケータの設定(入力値がナル値の場合) indi_decdata = e_rdb_SQL_NULL_DATA; FLOAT 型のデータの受け渡し (4) FLT_DATA 列(FLOAT 型)のデータの受け渡し例を示します。 (a) データベースから C 言語のデータとして出力する例 1. 宣言 double flt_data; /* 取得したデータを格納する領域 signed int indi_fltdata; /* 取得したデータがナル値かどうかのインジケータ */ */ 106 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 2. FETCH(行の取り出し)でデータを受け取るアドレスを Entier に通知 rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(4), /* 列番号 */ &flt_data, /* 値を格納する領域のアドレス */ sizeof(flt_data), /* 値を格納する領域の領域長 */ &indi_fltdata /* インジケータのアドレス */ ); 3. 取得(FETCH 後) /* データがナル値でなければ FLT_DATA 列を,ナル値であれば NULL を表示 */ if (indi_fltdata != e_rdb_SQL_NOT_NULL_DATA) { printf("FLT_DATA : %e ", flt_data); printf("\n"); } else { printf("FLT_DATA : NULL "); printf("\n"); } (b) C 言語のデータからデータベースに入力する例 1. 宣言 double flt_data; /* ?パラメタに渡すデータを格納する領域 e_rdb_SQLInd_t indi_fltdata; /* 渡すデータがナル値かどうかのインジケータ */ */ 2. データ受け渡し用領域のアドレスを Entier に通知 rtnc = e_rdb_SQLBindParam(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(4), /* パラメタ番号 */ &flt_data, /* 値を格納する領域のアドレス */ &indi_fltdata /* インジケータのアドレス */ ); 3. 入力値を受け渡し用領域へセット flt_data = (double)15; 4.-(a) インジケータの設定(入力値がナル値ではない場合) indi_fltdata = e_rdb_SQL_NOT_NULL_DATA; 4.-(b) インジケータの設定(入力値がナル値の場合) indi_fltdata = e_rdb_SQL_NULL_DATA; 107 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. CHAR 型のデータの受け渡し (5) ZIPCODE 列(7 バイトの CHAR 型)のデータの受け渡し例を示します。 (a) データベースから C 言語のデータとして出力する例 1. 宣言 char zip_code[7 + 1]; /* 7:ZIPCODE 列の長さ,1:終端ナル文字用 signed int indi_zipcode; /* 取得したデータがナル値かどうかのインジケータ */ */ 2. FETCH(行の取り出し)でデータを受け取るアドレスを Entier に通知 rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(5), /* 列番号 */ zip_code, /* 値を格納する領域のアドレス */ sizeof(zip_code), /* 値を格納する領域の領域長 */ &indi_zipcode /* インジケータのアドレス */ ); 3. 取得(FETCH 後) /* データがナル値でなければ ZIPCODE 列を,ナル値であれば NULL を表示 */ if (indi_zipcode != e_rdb_SQL_NOT_NULL_DATA) { printf("ZIPCODE : %s ", zip_code); printf("\n"); } else { printf("ZIPCODE : NULL "); printf("\n"); } (b) C 言語のデータからデータベースに入力する例 1. 宣言 char zip_code[7 + 1]; e_rdb_SQLInd_t indi_zipcode; /* 7:ZIPCODE 列の長さ,1:終端ナル文字用 */ 2. データ受け渡し用領域のアドレスを Entier に通知 rtnc = e_rdb_SQLBindParam(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(5), /* パラメタ番号 */ zip_code, /* 値を格納する領域のアドレス */ &indi_zipcode /* インジケータのアドレス */ ); 108 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3. 入力値を受け渡し用領域へセット strcpy(zip_code, "2448555"); 4.-(a) インジケータの設定(入力値がナル値ではない場合) indi_zipcode = e_rdb_SQL_NOT_NULL_DATA; 4.-(b) インジケータの設定(入力値がナル値の場合) indi_zipcode = e_rdb_SQL_NULL_DATA; VARCHAR 型のデータの受け渡し (6) ADDRESS 列(30 バイトの VARCHAR 型)のデータの受け渡し例を示します。 (a) データベースから C 言語のデータとして出力する例 1. 宣言 e_rdb_M_VARCHAR(31) addr_data; /* 30:ADDRESS 列の長さ,1:終端ナル文字用 signed int indi_addr; /* 取得したデータがナル値かどうかのインジケータ */ */ 2. FETCH(行の取り出し)でデータを受け取るアドレスを Entier に通知 rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(6), /* 列番号 */ &addr_data, /* 値を格納する領域のアドレス */ sizeof(addr_data), /* 値を格納する領域の領域長 */ &indi_addr /* インジケータのアドレス */ ); 3. 取得(FETCH 後) /* データがナル値でなければ ADDRESS 列を,ナル値であれば NULL を表示 */ if (indi_addr != e_rdb_SQL_NOT_NULL_DATA) { addr_data.Data[addr_data.Length] = '\0'; printf("ADDRESS /* 末尾にナル文字を設定 */ : %s ", addr_data.Data); printf("\n"); } else { printf("ADDRESS : NULL "); printf("\n"); } 109 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (b) C 言語のデータからデータベースに入力する例 1. 宣言 e_rdb_M_VARCHAR(31) addr_data; e_rdb_SQLInd_t indi_addr; /* 30:ADDRESS 列の長さ,1:終端ナル文字用 */ 2. データ受け渡し用領域のアドレスを Entier に通知 rtnc = e_rdb_SQLBindParam(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(6), /* パラメタ番号 */ &addr_data, /* 値を格納する領域のアドレス */ &indi_addr /* インジケータのアドレス */ ); 3. 入力値を受け渡し用領域へセット strcpy(addr_data.Data, "神奈川県横浜市"); addr_data.Length = strlen(addr_data.Data); 4.-(a) インジケータの設定(入力値がナル値ではない場合) indi_addr = e_rdb_SQL_NOT_NULL_DATA; 4.-(b) インジケータの設定(入力値がナル値の場合) indi_addr = e_rdb_SQL_NULL_DATA; BINARY 型のデータの受け渡し (7) BIN_DATA 列(10 バイトの BINARY 型)のデータの受け渡し例を示します。 (a) データベースから C 言語のデータとして出力する例 1. 宣言 e_rdb_M_BINARY(10) d_bindata; /* 取得したデータを格納する領域 */ unsigned char bin_data[10]; /* プログラム内でデータを保持する領域 */ signed int indi_bindata; /* 取得したデータがナル値かどうかのインジケータ */ 2. FETCH(行の取り出し)でデータを受け取るアドレスを Entier に通知 rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(7), /* 列番号 */ &d_bindata, /* 値を格納する領域のアドレス */ sizeof(d_bindata), /* 値を格納する領域の領域長 */ &indi_bindata /* インジケータのアドレス */ ); 110 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3. 取得(FETCH 後) /* データがナル値でなければ BINARY 型の列値を変数にコピー,ナル値であれば NULL を表示 */ if (indi_bindata != e_rdb_SQL_NOT_NULL_DATA) { memcpy(bin_data, d_bindata.Data, d_bindata.Length); } else { printf("BIN_DATA : NULL "); printf("\n"); } (b) C 言語のデータからデータベースに入力する例 1. 宣言 unsigned char bin_data[10]; /* プログラム内で保持しているデータの領域 */ e_rdb_M_BINARY(10) d_bindata; /* ?パラメタに渡すデータを格納する領域 */ e_rdb_SQLInd_t indi_bindata; /* 渡すデータがナル値かどうかのインジケータ */ 2. データ受け渡し用領域のアドレスを Entier に通知 rtnc = e_rdb_SQLBindParam(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(7), /* パラメタ番号 */ &d_bindata, /* 値を格納する領域のアドレス */ &indi_bindata /* インジケータのアドレス */ ); 3. 入力値を受け渡し用領域へセット memcpy(bin_data, "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99", sizeof(bin_data)); memcpy(d_bindata.Data, bin_data, sizeof(bin_data)); d_bindata.Length = sizeof(bin_data); 4.-(a) インジケータの設定(入力値がナル値ではない場合) indi_bindata = e_rdb_SQL_NOT_NULL_DATA; 4.-(b) インジケータの設定(入力値がナル値の場合) indi_bindata = e_rdb_SQL_NULL_DATA; (8) PACK 型のデータの受け渡し PACK_DATA 列(PACK 型)のデータの受け渡し例を示します。 なお,PACK_DATA 列は PACK(13,11)と定義されているものとします。 111 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. (a) データベースから C 言語のデータとして出力する例 1. 宣言 #include "edbcnv.h" /* データ型変換関数のためのヘッダ */ unsigned char d_packdata[7]; /* 取得したデータを格納する領域 7:↑最大文字数(13)/2↑ */ char pack_data[14]; /* 取得データを文字列型に変換 signed int indi_packdata; /* 取得したデータがナル値かどうかのインジケータ 14:最大文字数(13)+1 */ */ 2. FETCH(行の取り出し)でデータを受け取るアドレスを Entier に通知 rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(8), /* 列番号 */ d_packdata, /* 値を格納する領域のアドレス */ sizeof(d_packdata), /* 値を格納する領域の領域長 */ &indi_packdata /* インジケータのアドレス */ ); 3. 取得(FETCH 後) /* データがナル値でなければ PACK 型の列値を,ナル値であれば NULL を表示 */ if (indi_packdata != e_rdb_SQL_NOT_NULL_DATA) { e_rdb_CNV_PACKchar (d_packdata, /* 変換元データの領域アドレス */ (unsigned short)13, /* PACK 型のデータ文字数 */ pack_data, /* 変換後データの領域アドレス */ sizeof(pack_data) /* 変換後データの領域長 */ ); printf("PACK_DATA : %s ", pack_data); printf("\n"); } else { printf("PACK_DATA : NULL "); printf("\n"); } (b) C 言語のデータからデータベースに入力する例 1. 宣言 #include "edbcnv.h" /* データ型変換関数のためのヘッダ */ char pack_data[14]; /* ?パラメタに渡す元データの文字列表現 */ unsigned char d_packdata[7]; /* ?パラメタに渡すデータを格納する領域 */ e_rdb_SQLInd_t indi_packdata; /* 渡すデータがナル値かどうかのインジケータ */ 112 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 2. データ受け渡し用領域のアドレスを Entier に通知 rtnc = e_rdb_SQLBindParam(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(8), /* パラメタ番号 */ d_packdata, /* 値を格納する領域のアドレス */ &indi_packdata /* インジケータのアドレス */ ); 3. 入力値を受け渡し用領域へセット /* 文字列表現のパックデータを PACK 型に変換 */ strcpy(pack_data, "090-1111-2222"); e_rdb_CNV_charPACK(pack_data, /* 変換元データの領域アドレス */ (unsigned short)strlen(pack_data), /* 変換元データの長さ */ (unsigned short)13, /* 変換後の PACK 型データ文字数 */ d_packdata, /* 変換後データの領域アドレス */ (unsigned short)7 /* 変換後データの領域長 */ ); 4.-(a) インジケータの設定(入力値がナル値ではない場合) indi_packdata = e_rdb_SQL_NOT_NULL_DATA; 4.-(b) インジケータの設定(入力値がナル値の場合) indi_packdata = e_rdb_SQL_NULL_DATA; GEOMPOINT 型のデータの受け渡し (9) GEOM_DATA 列(GEOMPOINT 型)のデータの受け渡し例を示します。 (a) データベースから C 言語のデータとして出力する例 1. 宣言 e_rdb_GEOMPOINT_t geom_data; /* 取得したデータを格納する領域 signed int indi_geomdata; /* 取得したデータがナル値かどうかのインジケータ */ */ 2. FETCH(行の取り出し)でデータを受け取るアドレスを Entier に通知 rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(9), /* 列番号 */ &geom_data, /* 値を格納する領域のアドレス */ sizeof(geom_data), /* 値を格納する領域の領域長 */ &indi_geomdata /* インジケータのアドレス */ ); 113 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 3. 取得(FETCH 後) /* データがナル値でなければ GEOMPOINT 型の列値を,ナル値であれば NULL を表示 */ if (indi_geomdata != e_rdb_SQL_NOT_NULL_DATA) { printf("GEOM_DATA : (x=%d, y=%d, Attr=%d) ", geom_data.Point.x, geom_data.Point.y, geom_data.Attribute); printf("\n"); } else { printf("GEOM_DATA : NULL "); printf("\n"); } (b) C 言語のデータからデータベースに入力する例 1. 宣言 e_rdb_GEOMPOINT_t geom_data; /* ?パラメタに渡すしたデータを格納する領域 */ e_rdb_SQLInd_t indi_geomdata; /* 渡すデータがナル値かどうかのインジケータ */ 2. データ受け渡し用領域のアドレスを Entier に通知 rtnc = e_rdb_SQLBindParam(cnctContext, hStmt, (unsigned short)9, &geom_data, &indi_geomdata ); 3. 入力値を受け渡し用変数へセット geom_data.Point.x = 1 ; geom_data.Point.y = 2 ; geom_data.Attribute = 3 ; 4.-(a) インジケータの設定(入力値がナル値ではない場合) indi_geomdata = e_rdb_SQL_NOT_NULL_DATA; 4.-(b) インジケータの設定(入力値がナル値の場合) indi_geomdata = e_rdb_SQL_NULL_DATA; 114 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. BIT 型のデータの受け渡し (10) BIT_DATA 列(7 ビットの BIT 型)のデータの受け渡し例を示します。 (a) データベースから C 言語のデータとして出力する例 1. 宣言 #include "edbcnv.h" /* データ型変換関数のためのヘッダ */ unsigned char d_bitdata[1]; /* 取得したデータを格納する領域 1:↑ビット数(7)/8↑ */ char bit_data[7+1]; /* 取得データを文字列型に変換 */ signed int indi_bitdata; /* 取得したデータがナル値かどうかのインジケータ 7:ビット数 1:終端 */ 2. FETCH(行の取り出し)でデータを受け取るアドレスを Entier に通知 rtnc = e_rdb_SQLBindCol(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(10), /* 列番号 */ d_bitdata, /* 値を格納する領域のアドレス */ sizeof(d_bitdata), /* 値を格納する領域の領域長 */ &indi_bitdata /* インジケータのアドレス */ ); 3. 取得(FETCH 後) /* データがナル値でなければ BIT 型の列値を,ナル値であれば NULL を表示 */ if (indi_bitdata != e_rdb_SQL_NOT_NULL_DATA) { e_rdb_CNV_BITchar(d_bitdata, /* 変換元データの領域アドレス */ (unsigned short)7, /* 変換元データのビット数 bit_data, /* 変換後データの領域アドレス */ */ (unsigned short)8 /* 変換後データの領域長 */ ); printf("BIT_DATA : %s ", bit_data); printf("\n"); } else { printf("BIT_DATA : NULL "); printf("\n"); } (b) C 言語のデータからデータベースに入力する例 1. 宣言 #include "edbcnv.h" /* データ型変換関数のためのヘッダ */ char bit_data[7+1]; /* ?パラメタに渡す元データの文字列表現 */ unsigned char d_bitdata[1]; /* ?パラメタに渡すデータを格納する領域 */ e_rdb_SQLInd_t indi_bitdata; /* 渡すデータがナル値かどうかのインジケータ */ 2. データ受け渡し用領域のアドレスを Entier に通知 115 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. rtnc = e_rdb_SQLBindParam(cnctContext, hStmt, /* 文ハンドル */ (unsigned short)(10), /* パラメタ番号 */ d_bitdata, /* 値を格納する領域のアドレス */ &indi_bitdata /* インジケータのアドレス */ ); 3. 入力値を受け渡し用領域へセット /* 文字列表現のビットデータを BIT 型に変換 */ strcpy(bit_data, "1011011"); e_rdb_CNV_charBIT(bit_data, /* 変換元データの領域アドレス */ (unsigned short)strlen(bit_data), /* 変換元データの領域長 */ (unsigned short)7, /* 変換後の BIT 型ビット数 */ d_bitdata, /* 変換後データの領域アドレス */ sizeof(d_bitdata) /* 変換後データの領域長 */ ); 4.-(a) インジケータの設定(入力値がナル値ではない場合) indi_bitdata = e_rdb_SQL_NOT_NULL_DATA; 4.-(b) インジケータの設定(入力値がナル値の場合) indi_bitdata = e_rdb_SQL_NULL_DATA; 116 All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd. 組み込みデータベースEntier 体験版ソフトウェアのご案内 下記ホームページから体験版ソフトウェアをダウンロードしてお試しいただけます。 チュートリアルを利用したサンプルデータベースの作成や,サンプルアプリケーション によるデータ操作を体験ください。 www.hitachi.co.jp/entier お問い合わせ 株式会社日立製作所 HMCC(日立オープンミドルウェア問い合わせセンター) 電話番号:0120-55-0504(フリーダイヤル) 利用時間:9:00~12:00,13:00~17:00(土・日・祝日・弊社休日を除く) All Rights Reserved. Copyright © 2006, 2008, Hitachi, Ltd.