Empress 導入ガイド - 株式会社Empress Software Japan

Empress 導入ガイド
Empress導入ガイド
株式会社 Empress Software Japan
Version 1.0
1
Empress 導入ガイド
第1章 はじめに
本書は、はじめてEmpressを使用する方のための「Emprss導入ガイド」です。本書はC言語、SQLなど基本的なことはすでに
習得されている方を対象とし、Empressデータベースに関連した基本技術資料として記載されています。対象としているOSは
LinuxもしくはWindowsで、組込みで使用されるクロス開発環境は別紙となる「クロス開発環境導入ガイド」を参照下さい。
「Emprss導入ガイド」のストーリーラインは以下の通りです。
章 目次
説明
1
はじめに
2
Empressデータベースの特長・機能 Empressの特長・機能についての説明
3
インストール
4
データベースの作成とSQLアクセス データベースの作成方法とデータベースの構成
5
テーブルの作成
テーブルの作成方法について
6
EmpressのSQL
EmpressのSQL
7
データタイプ
Empressで使用できるデータタイプ
8
Empressの基本コマンド
データベース作成、削除、インポート、エクスポートなどの基本コマンド
9
Empress mrインターフェース
EmpressのC/C++用mrインターフェース
Linux、Windowsでのインストール手順
10 Empressの管理コマンド
Empressデータベースのロック解除など管理者用コマンド
11 Empress管理API
管理コマンドを関数としてコールする実装方法
12 データベース設定
Empressデータベースの設定ファイルであるinitfile、tabzeroについて
他社商標について
当ドキュメントに記載されている会社名・製品名・システム名などは、 各社の登録商標、もしくは商標です。 なお、本文
および図表中では、©、™、®等は明記しておりません。
2
Empress 導入ガイド
第2章 Empressデータベースの特長・機能
Empressは、1979年の発売以来、約30年にわたり日本及び全世界で数多くの導入実績を持つデータベースです。特に北米で
は、組込みデータベースでNO.1の実績を誇っています。
発売当初からEmpressは北米のFA分野で数多く導入されました。郵便物のソートシステムや原子力発電所の監視システム、計
装などミッションクリティカルでリアルタイム性が要求される分野に対応するため、高速エンジン、小フットプリント、マルチ
タスク、CRUD(create、read、update、delete)の定時制、リソース使用量の可予測性などの機能を実装しました。
また、Empressは発売後の初期段階で店舗POS端末用のデータベースとして導入されました。POS端末は、店員がPOS端末の
電源コンセントを不注意で抜くことが多く、予期しない電源断からの回復の機能が必要とされることがわかりました。断電やそ
の他のいろいろな状況に対応するために、断電回復性(電源断が起こったすぐに後にデータベースを自動復旧する機能)、断片
化防止処理(メンテナンスフリー)、タイムアウト機能が追加されました。現在、Empress データベースを特長付ける多くの
機能は、発売初期段階で生み出され、その後、数多くの改良が加えられ現在に至っています。
製品誕生から30年を経て、現在、Empressは自動車搭載分野、テレコム・ネットワーク機器分野、FA分野、航空分野、防衛産
業分野、金融・銀行分野、POS・OA分野、情報家電分野など多くの分野で採用されています。Empressの開発拠点は、カナダ
(トロント本社)、日本(株式会社Empress Software Japan)に拡張され、販売代理店は米国、日本、中国、韓国、英国、
フランス、ロシア、ポーランド、オーストラリアなどにあり、グローバルなビジネスを展開しております。
高速性
Empressデータベースの最大の特長は高速であるということです。Empressデータベースは組込み環境において、高速の
検索と共に高速のデータ登録機能も提供しております。30年以上前はハードウェア環境(CPU、メモリ等)が現在とは比
較にならないほど貧弱でした。その結果、Empressは最近設計されたベータベースと比較すると少ないメモリリソースで
高速です。また、Empressは多くのデータベースチューニングポイントがありますので、ユーザのデータ、SQLの特性に
合わせてさらに高速化が可能です。
高速断電回復機能
Empressは独自のデータのチェックポイントを設け、データをチェックし、ヘッダ、インデックスに不整合がないかを
チェックし、不整合があった場合、それぞれを修正した上でデータベースを高速に回復させます。
Empressはマルチファイル構造で、1つのテーブル、1つのインデックスが別々のファイルに保存されていますので、あ
るテーブルのデータが一部破損しても、他のテーブルやインデックスには影響がないように設計されています。あるアメ
リカのボイスレコーダーの会社は10万回の断電・回復の復旧テストを行いましたがEmpressはテストに合格しています。
リアルタイム性
リアルタイム性とは定時性のことです。Empressはデータベースの一定の動作が必ず一定の時間で終了することを保証し
3
Empress 導入ガイド
ています。たとえば、Empressでは1秒ごとに5000 件のデータ更新と削除を繰り返しても、最初の更新と2年後の更新
の差はわずか1%です。想定外の時間がかかる検索に備え、実行中にキャンセル機能やタイムアウト機能も提供し、予期
せぬ動作にも対応しています。
非断片化構造
Empressデータベースは非断片化構造を持っていますのでメンテナンスフリーです 。このため他のデータベースのように
Vacuum関数を必要としません。
4
Empress 導入ガイド
マルチプロセス・タスク
Empressデータベースはマルチプロセス・タスクに対応しています。マルチプロセス、マルチタスク(スレッド)がデー
タベースの同時更新と検索をサポートしています。通常エンタープライズデータベースでサポートしているテーブル・ペー
ジ・レコードレベルのロックを組込みデータベースでも提供しています。そのために複数のプロセス・タスク(スレッ
ド)の同時検索・登録が可能です。これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき
ず、シングルユーザになります。
暗号化可能なセキュアデータベース
Empressはアメリカ国立標準技術研究所が推奨するAES256bitの暗号化が可能です。OSネイティブのアルゴリズムも、
現在、お客様が使用しているセキュリティチップなどに実装された暗号化アルゴリズムの使用も可能です。組込み業界初
となるカーネル(データベースエンジン)暗号化技術をデータベースに実装しています。データベースエンジン部分で、
データベース内のデータではなく、構造そのものを暗号化するためインデックスの使用が可能になるため、オーバーヘッ
ドは5%以内です。
小さいフットプリント
Empressは小さいフットプリントサイズで提供されます。ANSIのSQL92に完全準拠し、断電回復、In-memory機能、
ODBC・JDBCインターフェース、レプリケーション、暗号化などの機能を実装したデータベースでは非常にフットプリン
トが小さいと言えます。また、最大メモリ使用サイズをプロファイルで設定することが可能です。
多言語対応
Empressは日本以外でも、米国で直販社を2社、韓国、中国、イギリス、フランス、ロシア、ポーランド、オーストラリアに代
理店を持つグローバル企業です。このためマルチ言語に対応することを非常に得意としています。以下のように非常に多くの言
語に対応しています。
5
Empress 導入ガイド
長期供給(20年)
Empressは米国防衛産業に数多く採用されている結果、製品の長期供給が可能です。
このような特長のため、Empressデータベースは業界のデファクトスタンダートとなっております。
6
Empress 導入ガイド
第3章 インストール
Empressのインストールは非常に簡単です。LinuxでもWindowsでもほぼ標準の手順でインストールすることが可能で
す。ただし、Linuxではroot以外のユーザで、WindowsではAdministrator権限を持つユーザでインストールして下さ
い。
Linux環境でのインストール
1. 任意の場所でEmpressインストールファイルを解凍します。
ttaarr xxvvff ccddrr4400991100..ttaarr
(数字はバージョンによって異なります。)
2. 解凍したディレクトリに install.shがあるのでホームディレクトリで実行します。
3. License agreementを承認します。
4. Empressから入手したLicenseキーを入力します。
5. インストール場所を指定します。通常はdefaultのまま実行します。
6. その他の設定内容を確認しながらインストールを完了します。
Empressの環境設定はホームディレクトリの~/.bash_profileに書き込まれますので、ログインし直して下さい。
インストール後の確認には、empversと言うコマンド実行して下さい。実行して次のようにEmpressのバージョンが表示
されればインストールは成功しています。
[test-user@ip-192-168-0-4 testdir]$ empvers
Empress V10.20 (Evaluation copy: licence will expire on Feb 9, 2015)
(c) Copyright Empress Software Inc. 1983, 2014
for x86-64 running Linux 2.6 with GLIBC 2.12
[linux-x86_64]
Port Code DOCS-10.20-F-29-S-UTF
Port Code JDBC-10.20-F-27-S-UTF
Port Code ODBC-10.20-F-38-S-UTF
Port Code RDBM-10.20-F-44-S-UTF
Installed in: /home/ec2-user/Empress/v10.20/installation
Codeset: UTF8
7
Empress 導入ガイド
Windows環境でのインストール
1. インストールファイルはempress-40910.msiです。(数字はバージョンによって異なります。)
2. ファイルを実行するとインストールプログラムが起動します。
3. 途中でLicense agreementの承認画面が表示されますので、承認して下さい。
4. Licenseキーを入力して下さい。
5. 基本的には画面の指示に従ってインストールを進めれば、インストールが完了します。
上記インストール完了後、Windowsを再起動して下さい。
インストール後の確認には、empversと言うコマンド実行して下さい。Windows XP系の環境では、コマンドプロンプト
を起動してempversと入力して下さい。Windows 7とWindows Server R2 では、スタートメニューに登録された
Empressのフォルダ以下にEmpressコマンドプロンプトがありますのでここを起動してempversと入力して下さい。
実行して次のようにEmpressのバージョンが表示されればインストールは成功しています。
C:\Empress\v10.20-F.SJIS>empvers
Empress V10.20 (評価版:ライセンス有効期間 Feb 9, 2015)
(c) Copyright Empress Software Inc. 1983, 2013
for x86 running Microsoft Windows 7
[win32]
Port Code DOCS-10.20-F-22-S-JPN
Port Code JDBC-10.20-F-21-S-JPN
Port Code ODBC-10.20-F-32-S-JPN
Port Code RDBM-10.20-F-37-S-JPN
インストール先。: C:\Empress\v10.20-F.SJIS
コードセット: SJIS
8
Empress 導入ガイド
第4章 データベースの作成とSQLアクセス
Empressでデータベースを作成する場合、他のデータベースと同様に、Linuxの場合はShell、Windowsの場合はコマンド
プロンプトで作成することが可能です。Empressはコマンド以外に、データベース作成用の関数も提供しています。C言
語の関数は、第9章 Empress mrインターフェースを参照して下さい。
データベースの作成コマンド
例えばカレントディレクトリにtestdbというデータベースを作成する場合は以下のように入力します。
[使い方]
eemmppmmkkddbb デ
デー
ータ
タベ
ベー
ース
ス名
名
[例]
eemmppmmkkddbb tteessttddbb
testdbと言う名前のデータベースを作成します。
Empressのデータベースはディレクトリ構造で作成されディレクトリ名はデータベースと同じ名前になります。サンプル
で作成されたtestdbディレクトリは以下の様に作成されます。
データベースへのアクセス方法
作成したtestdbにShellやコマンドラインからアクセスするには、empsqlと言うコマンドの対話型SQLのインターフェー
スが用意されています。
[使い方]
eemmppssqqll デ
デー
ータ
タベ
ベー
ース
ス名
名
[例]
C:\test>eemmppssqqll tteessttddbb
EMPRESS V10.20
(c) Copyright Empress Software Inc. 1983, 2013
1*
empsqlコマンドでtestdbにアクセスすると、プロンプトの形式が行単位に変わります。
empsqlでSQLインターフェースにアクセスすると、様々なSQLコマンドが使用可能になります。
[例] testdb内でjobテーブルを作成します。
C:\test\empsql testdb
EMPRESS V10.20
(c) Copyright Empress Software Inc. 1983, 2013
1* CCRREEAATTEE TTAABBLLEE jjoobb ((
jjoobb__iidd iinntteeggeerr,,
jjoobb__ssttaattuuss ttiinnyyiinntt,,
jjoobb__ssttaarrtt__ttiimmee ttiimmee,,
jjoobb__eenndd__ttiimmee ttiimmee,,
jjoobb__pprrooccIIDD cchhaarr((66))
9
Empress 導入ガイド
));;
※ SQL文は、セミコロン(;)でターミネイトします。
※ help;と入力すると使用可能なコマンドが確認できます。
※ 頭にエクスクラメーションマーク(!)を付けることで通常のコマンド(Shellコマンド、Windowsのコマンド)も使用
可能です。
データベースディレクトリファイル構成
Empressのデータベースは、前項で解説したようにディレクトリ名は論理データベースと同じ名前で 、ディレクトリ下の
各ディレクトリ、ファイルの役割は以下の通りです。
.relファイル
メインデータファイル
データ 辞書 .dtf ファイル 可変長データオーバーフローファイル
テーブル
その他
.ixファイル
インデックスのメインファイル
.ixlファイル
インデックスオーバーフローファイル
データベースの補助情報
システム辞書
Empressには、データベース、テーブル、アトリビュート、アクセス権限等に関する情報を保持する以下のようなシステ
ムテーブルがあります。データベースを作成すると4つのシステムテーブルが自動的に作成され各役割は以下の通りです。
他のシステムテーブルは必要に応じて自動的に作成されます。
システムテーブル名 説明
sys_dictionary
システムテーブル(sys_tables、sys_attrs、sys_privs)等のコンパイルした情報を保存します。
このコンパイル情報はシステムテーブルの二重化を行い、高可用性を保証します。ハードウェアの
故障、断電等によるデータベースの破損時には復元が可能です。
sys_tables
全テーブル、ビューの情報を保存しています。
sys_attrs
全アトリビュート情報を保存しています。
sys_privs
データベースのアクセス権限情報を保存しています。
10
Empress 導入ガイド
第5章 テーブルの作成
テーブルの作成は以下の手順で作成します。
テーブルの作成コマンド
例えばtestdbというデータベースにjobテーブルを作成する場合は以下のように作成します。
[シンタックス]
CCRREEAATTEE [[TTAABBLLEE]] ttaabbllee [[|| ((iitteemm {{,, iitteemm}} [[,,ccoonnssttrr {{,,ccoonnssttrr}}]])) ||]] ||SSEETT iitteemm {{,, iitteemm}} [[,,ccoonnssttrr
{{,,ccoonnssttrr}}]] || [[LLOOCCAATTEE [[IINN]] llooccaattiioonn]];;
item
attr [data_type [(param {,param})] [[NOT] NULL] [attr_constr]]
constr
プライマリキーと外部キー制約条件です。次のうちの1つです。
1. PRIMARY KEY [key_name] [ON] (attr {, attr}) [| BTREE |] | TIMESERIES |
2. OREIGN KEY [key_name] [ON] (attr {, attr}) [| BTREE |] | TIMESERIES | REFERENCES
table (attr {, attr})
location
既存のディレクトリー名を指定します。ディレクトリ用の任意の有効な システムパス名です。全ての
ファイルを指定することを推奨します。 位置の指定にキーワード< tt="">あるいは空のストリング("")で
指定された場合、テーブルは現在のデータベースディレクトリに作成されます。
data_type
データタイプです。パラメータは括弧で囲まれます。 data_typeが指定されない場合はINTEGERにな
ります。
attr_const
プライマリキーと外部キー制約条件です。次のうちの1つです。
1. PRIMARY KEY [key_name] [|BTREE |] |TIMESERIES |
2. FOREIGN KEY [key_name] [|BTREE |] REFERENCES table (attr {, attr}) |TIMESERIES |
[使い方]
CCRREEAATTEE TTAABBLLEE jjoobb ((
jjoobb__iidd iinntteeggeerr,,
jjoobb__ssttaattuuss ttiinnyyiinntt,,
jjoobb__ssttaarrtt__ttiimmee ttiimmee,,
jjoobb__eenndd__ttiimmee ttiimmee,,
jjoobb__pprrooccIIDD cchhaarr((66)) ));;
11
Empress 導入ガイド
第6章 SQL
SQLとは構造化問い合わせ言語 (Structured Query Language) の略で、実際には、RDBMSでのデータの操作や定義
を行うための問い合わせ言語を意味します。EmpressのSQLはANSI92に完全準拠していますので、詳しいSQLについて
は専門書を参照して下さい。本章では特に重要な箇所のみ解説しています。
SQLはempsql、empbatch、empcmd、C言語で使用可能です。
SQLの3つの機能
SQL言語は下記の3つの機能に分類されます。
機能
解説
DDL (Data Definition Language)
1.データ定義言語およびデータベース
2. テーブルの構造に関連
1.データ操作言語
DML (Data Manipulation Language) 2.メンテナンスおよびデータの検索
3.データベーステーブルへの格納に関連
DCL (Data Control Language)
1.データ制御言語
2.整合性の保証およびデータ保護機能
DDL (データ定義言語)
主要なDDLコマンドをアルファベット順で表示しています。
ALTER TABLE
既存のテーブルの構造を変更します。対象となるテーブルにレコードが存在する場合、そ
のレコードに対し、手動でダンプおよびリロードすることなしに変更ができます。
CREATE COMMENT
テーブルおよびアトリビュートに対してのコメントを作成します。
CREATE INDEX
データベースのインデックスを作成します。
CREATE MODULE
データベースのPSMの定義を作成します。
CREATE RANGE CHECK アトリビュートのデータ有効性チェックをセットアップします。
CREATE REFERENTIAL
アトリビュートのデータ参照制約をセットアップします。
CREATE TABLE
テーブル名を作成します。
CREATE TRIGGER
データベースのトリガーを定義します。
CREATE VIEW
ビューを作成します。
DISPLAY DATABASE
データベース内のテーブルを表示します。
DISPLAY MODULE
データベースのPSM定義を表示します。
DISPLAY PRIVILEGE
テーブルに対してのアクセス特権を表示します
DISPLAY TABLE
テーブル構造を表示します
DROP COMMENT
テーブルまたはアトリビュートのコメントを削除します。
DROP INDEX
インデックスを削除します。
DROP MODULE
PSM定義を削除します。
DROP RANGE CHECK
アトリビュートのデータ有効性チェックを削除します。
DROP REFERENTIAL
アトリビュートのデータ参照制約を削除します。
DROP TABLE
テーブルを削除します。
DROP TRIGGER
トリガーを削除します。
12
Empress 導入ガイド
DROP VIEW
論理テーブルを削除します。
RENAME
テーブルまたはアトリビュートの名前を変更します。
DDLの使用方法とサンプルは以下の通りです。
[使用方法]
CCRREEAATTEE [[TTAABBLLEE]] ttaabbllee__nnaammee ((aattttrr__ddeeff {{,, aattttrr__ddeeff}}))
[サンプル]
CCRREEAATTEE TTAABBLLEE jjoobb ((
jjoobb__iidd iinntteeggeerr,,
jjoobb__ssttaattuuss?? ttiinnyyiinntt,,
jjoobb__ssttaarrtt__ttiimmee?? ttiimmee,,
jjoobb__eenndd__ttiimmee?? ttiimmee,,
jjoobb__pprrooccIIDD?? cchhaarr((66))
));;
DML (データ操作言語)
主要なDDLコマンドをアルファベット順で表示しています。
CALL
PSMまたは式の呼び出し
DELETE
テーブルの不要なレコードの削除
EMPTY
テーブルの全レコードの削除
INSERT
テーブルへ新しいレコードを追加
LOCK TABLE トランザクションの間、テーブルのロック
SELECT
テーブルからのデータ検索
SORT
1つ以上のアトリビュートのテーブルソート
UPDATE
テーブルの存在するレコードの更新
代表的なDMLの構文例の一覧
SELECT文:データ
SELECT * FROM PERSON WHERE person_id = 1;
の検索
UPDATE文:デー
タの更新
UPDATE CONTACT SET contact=“[email protected]" WHERE person_id=2;
INSERT文:データ
INSERT INTO CONTACT (person_id, contact_type) VALUES (2, 1);
の登録
DELETE文:データ
DELETE * FROM CONTACT WHERE person_id=2 AND contact_type=1;
の削除
テーブルの結合
SELECT name, contact FROM PERSON, CONTACT WHERE PERSON.person_id =
CONTACT.person_id;
WHERE文の演算子 =、!= 、<> 、!、~ 、> 、>= 、< 、<= 、IN 、RANGE 、BETWEEN 、LIKE 、MATCH 、
SMATCH
サブクエリ
SELECT name FROM PERSON WHERE person_id in (SELECT person_id FROM
CONTACT);
集計関数の使用
COUNT, AVG, MAX, MIN, AVGSELECT name, count(*) FROM PERSON, CONTACT
WHERE PERSON.person_id = CONTACT.person_id GROUP BY name HAVING name
MATCH “山本%”
DMLの使用方法とサンプルは以下の通りです。
[使用方法]
13
Empress 導入ガイド
IINNSSEERRTT [[IINNTTOO]] ttaabbllee ((aattttrr {{,, aattttrr}}))
VVAALLUUEESS ((aattttrr__vvaalluuee {{,, aattttrr__vvaalluuee}}));;
[サンプル]
IINNSSEERRTT IINNTTOO jjoobb ((jjoobb__iidd,, jjoobb__ssttaattuuss,, jjoobb__ssttaarrtt__ttiimmee,, jjoobb__eenndd__ttiimmee))
VVAALLUUEESS ((7733,, 22,, 0099::0000::0000,, 1177::0000::0000,,
7744,, 33,, 0099::0000::0000,, 1177::0000::0000));;
DCL (データ制御言語)
COMMIT WORK 現在のトランザクション中のデータベースに対する すべての変更を永続的に保存し、トランザク
ションを終了します。
DISPLAY WORK 現在のトランザクションのステータスを表示。また、 データベースに影響しているトランザクショ
ンのプロセスのステータスの表示します。
ROLLBACK
ロールバックします。
SAVEPOINT
ネストしたトランザクションを起動し、トランザクションのセーブポイントを設定。ROLLBACKコ
マンドによってセーブポイントにトランザクションを戻すことが可能します。
14
Empress 導入ガイド
第7章 データタイプ
Empress データタイプは3つの種別があります。
NO 名称
解説
1
ANSI
ANSI準拠のデータベースタイプ
2
ODBC
XOPEN準拠のデータタイプ
3
extension Empress独自のデータタイプ
データタイプ一覧表
データタイプ名は同じデータタイプでもいくつかの別名がある場合があります。 1つのセルに表示されているデータタイ
プは同じものを表します。
種類
文字列
データタイプ
種別
シンタックスと範囲
CHARACTER
CHAR
SQL_CHAR
ANSI
ANSI
ODBC
CHARACTER [(length)]
NATIONAL CHARACTER
NATIONAL CHAR
NCHAR
ANSI
ANSI
ANSI
ECHARACTER
ECHAR
Extension ECHARACTER [(length [, type])]
Extension 1からC言語のintの限界まで、通常231-1 bytes
NLSCHARACTER
NLSCHAR
Extension NLSCHARACTER [(length [, type])]
Extension 1からC言語のintの限界まで、通常231-1bytes
CHARACTER VARYING
CHAR VARYING
VARCHAR
SQL_VARCHAR
ANSI
ANSI
ANSI
ODBC
NATIONAL CHARACTER
VARYING
NATIONAL CHAR VARYING
NCHAR VARYING
VARNCHAR
ANSI
ANSI
ANSI
ANSI
1からC言語のintの限界まで、通常2
31
-1 bytes
NATIONAL CHARACTER [(length)]
31
-1)/2
31
-1)/2
1文字から最大のバイトで割られたC intの極大値、(2
バイト
VARCHAR [(length)]
1からC言語のintの限界まで、通常2
31
-1bytes
VARNCHAR [(length)]
1文字から最大のバイトで割られたC intの極大値、(2
バイト
TEXT [ (display [, primary [, overflow [, extents ]]])]
TEXT
Extension 1バイトから最大のバイトで割られたC intの極大値、
31
(2
-1)/2バイト
NLSTEXT [ (display [, primary [, overflow [, extents ]]])]
NLSTEXT
Extension 1バイトから最大のバイトで割られたC intの極大値、
31
(2
CHARACTER LARGE
OBJECT
CHAR LARGE OBJECT
CLOB
ANSI
ANSI
ANSI
NATIONAL CHARACTER
LARGE OBJECT
NATIONAL CHAR LARGE ANSI
ANSI
ANSI
-1)/2バイト
CLOB [(length)]
1バイトから最大のバイトで割られたC intの極大値、
31
(2
-1)/2バイト
NCLOB [(length)]
1バイトから最大のバイトで割られたC intの極大値、
15
Empress 導入ガイド
OBJECT
ANSI
(2
TINYINT
ANSI
TINYINT
INTEGER8
Extension -127 から127 (2 -1)
NCLOB
SQL_TINYINT
ODBC
SMALLINT
SQL_SMALLINT
ANSI
ODBC
INTEGER
INT
ANSI
ANSI
INTEGER32
Extension
INTEGER16
整数
31
NCHAR LARGE OBJECT
SQL_INTEGER
BIGINT
SQL_BIGINT
INTEGER64
-1)/2バイト
7
SMALLINT
15
Extension -32767 から 32767 (2
ODBC
-1)
INTEGER
31
-2147483647 から 2147483647 (2
ANSI
BIGINT
ODBC
63
63
Extension -(2 -1) から 2 -1
SEQUENCE seq
シーケン
SEQUENCE
ス
Extension For 32: 0 tから2147483647 (2
Boolean BOOLEAN
ANSI
For 64: 0 から 2
31
63
-1)
-1
BOOLEAN
有効な値は 'true' と'false'; '0' and '1'; 't' と'f'; 'yes' と 'no'; 'y'
と 'n'
REAL
SQL_REAL
FLOAT32
ANSI
REAL
ODBC
Extension システム依存- 4-バイトのシングルフロート
DOUBLE PRECISION
SQL_DOUBLE
FLOAT64
ANSI
DOUBLE PRECISION
ODBC
Extension システム依存- 8-バイトのダブルフロート
EFLOAT
EFLOAT [decimal places]
システム依存-小数位の数が1と6の間にある場合、4バイトの
Extension
シングルフロート
7と12の間にある場合、それは8バイトのダブルフロート
FLOAT
SQL_FLOAT
ANSI
ODBC
FLOAT [binary precision]
システム依存- 2進法の数が1と24の間にある場合は4バイトの
シングルフロートです。25と53の間にある場合は8バイトのダ
ブルフロート
DECIMAL
DEC
NUMERIC
SQL_DECIMAL
SQL_NUMERIC
ANSI
ANSI
ANSI
ODBC
ODBC
DECIMAL [(total_digits [, decimal_places])]
1から38桁
DOLLAR
Extension
DOLLAR [(max_digits [ , type])]
1から13桁
EDATE
EDATE [(type)]
Extension yyyymmddのフォーマットで00000101 から 99991231
(January 1, 0000 to December 31, 9999)
EPOCH_TIME
EPOCH_TIME [(type)]
Extension January 1, 1970 00:00:00から December 31, 2035
23:59:59
Float
Decimal
-1)
Date
16
Empress 導入ガイド
ETIME [(type)]
ETIME
Extension January 1, 0000 00:00:00から December 31, 9999
MICROTIMESTAMP
Extension January 1, 0000 00:00:00.000000から December 31,
DATE
ANSI
SQL_TYPE_DATE
TIME
TIME WITHOUT TIME ZONE
SQL_TYPE_TIME
TIMESTAMP
TIMESTAMP WITHOUT TIME
ZONE
SQL_TYPE_TIMESTAMP
BULK
23:59:59
MICROTIMESTAMP [(type)]
9999 23:59:59.999999
ODBC
ANSI
ANSI
ODBC
ANSI
ANSI
ODBC
DATE
yyyy-mm-ddのフォーマット,i0000-01-01 から 9999-12-31
(January 1, 0000 to December 31, 9999)
TIME [(prec)]
00:00:00.000000000 から 23:59:59.99999999
TIMESTAMP [(prec)]
January 1, 0000 00:00:00.000000000から December
31, 9999 23:59:59.999999999
BULK [(display [, primary [, overflow [, extents]]])]
Extension 1バイトから最大のバイトで割られたC intの極大値、
(2
バイナリ
BINARY LARGE OBJECT
BLOB
ANSI
ANSI
31
-1)/2バイト
BLOB [(n)]
1バイトから最大のバイトで割られたC intの極大値、
31
(2
17
-1)/2バイト
Empress 導入ガイド
第8章 Empressの基本コマンド
Empressでデータベースデータベースを作成したり、対話型SQLなどのEmpressの基本コマンドについて解説していま
す。
Windows環境でEmpressでコマンドを実行するにはOSのバージョンによっての2種類の方法があります。Windows XP
系の環境では、コマンドプロンプトを起動してempversと入力して下さい。Windows 7とWindows Server R2 では、
スタートメニューに登録されたEmpressのフォルダ以下にEmpressコマンドプロンプトがありますのでここを起動して
empversと入力して下さい。
データベースの作成: empmkdb
役割
使い方
新しいデータベースを作成します。
empmkdb database_name
database_name: データベース名
該当するC言語の関数 mrexecdirect関数内でcreate databaceを実行して下さい。
※ 詳しい使用方法は empmkdb -helpで参照下さい。
データベースの削除: emprmdb
役割
使い方
データベースを削除します。
emprmdb database_name
database_name: データベース名
該当するC言語の関数 mrexecdirect関数内でdrop databaceを実行して下さい。
データベースへアクセスする: empsql
役割
使い方
対話型SQLを実行します。
empsql database_name
database_name: データベース名
該当するC言語の関数 SELECT文の実行にはmrexecquery、それ以外にはmrexecdirectを使用して下さい。
18
Empress 導入ガイド
単一のSQL文の実行: empcmd
役割
Shell・コマンドライン上でSQL文を実行します。
empcmd database_name "SQL_command"
使い方
database_name: データベース名
SQL_command: SQL文
例
empcmd db "insert into t1 values('test01','test02');"
該当するC言語の関数 SELECT文の実行にはmrexecquery、それ以外にはmrexecdirectを使用して下さい。
複数のSQL文の実行: empbatch
役割 バッチモードで複数のSQL文を実行します。
Linuxでの使い方
1. SQL文を1つのテキストファイルに保存します。
2. empbatchコマンドか、シェルコマンドで実行します。
シナリオ1
empbatchコマンドでsample.sqlをmaster_dbで実行します。
create table t1 (number integer not null);
sample.sqlの内容 insert into t1 values (1,2,3,4,4);
select * from t1;
[test-user@ip-192-168-0-4 testdir]$ empbatch master_db < sample.sql
number
実行例
シナリオ2
1
2
3
4
4
シェルコマンドでsample.shをmaster_dbで実行します。
empbatch testdb << EOF
create table t1 (number integer not null);
sample.shの内容 insert into t1 values (1,2,3,4,4);
select * from t1;
EOF
[test-user@ip-192-168-0-4 testdir]$ sh sample.sh
number
実行例
1
2
3
4
4
19
Empress 導入ガイド
Windowsでの使い方
1. SQL文を1つのテキストファイルに保存します。
2. empbatch [データベース名] > [テキストファイル名] で実行します。
シナリオ
sample.sqlをmaster_dbで実行します。
create table t1 (number integer not null);
sample.sql insert into t1 values (1,2,3,4,4);
select * from t1;
C:\Empress>empbatch master_db < sample.sql
number
実行例
1
2
3
4
4
データベースのエクスポート: empexpt
役割
使い方
データベースのエクスポートファイルを作成します。
empexpt testdb.ept testdb
データベース(testdb)の情報をtestdb.eptファイルにエクスポートします。
empexpt [options] outfile database_name [table_list] [module_list]
シンタックス
outfile:出力ファイル名 (または、"-"を指定して標準出力に出力)
database_name:データベース名
※ empexptの詳しい使い方はempexpt -helpを参照して下さい。
注意
テーブル定義をエクスポートするには display特権が、データをエクスポートするにはdisplay特権
とselect特権の両方が必要です。
該当する C言語の
関数
msdbexport
データベースのインポート: empimpt
役割
使い方
empexptコマンドでエクスポートしたファイルを、Empressデータベースにインポートします。
empimpt testdb.ept newtestdb
testdb.eptファイル内のデータをデータベースnewtestdbにインポートしています。
empimpt [options] infile database_name [table_list] [module_list]
シンタックス
infile:インポート元ファイル名 (または、"-"を指定して標準入力から入力)
database_name:データベース名
※ empimptの詳しい使い方はempimpt -helpを参照して下さい。
注意
テーブルをインポートするにはsys_tables テーブルに対してinsert特権を持っている必要がありま
す。もしインポートするテーブルが既に存在する場合にはそれらに対してinsert特権がなければなりま
せん。
該当するC言語
の関数
msdbimport
20
Empress 導入ガイド
データベースのメンテナンス: empclean
データベースのチェックと修復を行います。cronジョブ等も利用されます。
役割
1. 断電されたトランザクションを検知し解決します。
2. 断電されたロックを検知し取り除きます。
3. 断電されたデータベースの整合性を確認し、修復します。
empclean database_name
使い方
database_name:データベース名
※ empcleanの詳しい使い方はempclean -helpを参照して下さい。
C:\Empress>empclean testdb
実行例 1
EMPCLEAN バージョン 10.20
sample_user により開始 : 13 2014 16:49:01
データベースをチェック中です。: testdb
次段階 : 必要なシェアードメモリを検索中です。
次段階 : 不適切に終了したすべてのクライアントを発見しました。
次段階 : セマフォをチェックします。
次段階 : トランザクションを解決します。
次段階 : ロックを解除します。
次段階 : コーディネータをチェックします。
EMPCLEAN 終了 : 13 Feb 2014 16:49:01
C:\Empress>empclean testdb recompile_all data_check index_check
実行例 2
EMPCLEAN バージョン 10.20
sample_user により開始 : 13 2014 16:52:43
データベースをチェック中です。: testdb
次段階 : 必要なシェアードメモリを検索中です。
:
:
次段階 : コーディネータをチェックします。
NEXT PHASE:インデックスをチェックしています。
EMPCLEAN 終了 : 13 Feb 2014 16:52:43
該当するC言語の関数 msdbmaintain
empclean(msdbmaintain)のお勧めのオプション
recompile_all sys_tableの情報の整合性を確認して必要があれば作り直します。
data_check
断電により壊れた.relファイル、.dtfファイルを探し、修復します。
index_check 断電により壊れたインデックスをチェックして、壊れていたら修復します。
temp
断電により不明な一時ファイルを消去します。
21
Empress 導入ガイド
第9章 Empress mrインターフェース
Empressは、C/C++プログラミング言語を用いたmrインターフェースを提供します。mrは、組込みSQLをmr内に組込む
手法と純粋にmrのみでプログラムを作成する2つのプログラミング開発手法を提供します。Empressは、通常の処理で
はSQLをmrに組込む手法を、処理時間や最重要視するプログラムを作成したい場合、mrでプログラムを作成するように
お薦めします。
開発環境
mrを使用する場合、以下のCコンパイラが必要です。
Linuxの場合
gcc、ccコンパイラ等
Windowsの場合 Visual Studio
※ Visual Studioのバージョンに付いてはEmpressのWindowsの各バージョンに記載されております。
ヘッダーファイルmscc.h
mrを使用する場合、ヘッダーファイルmscc.hはプログラムの先頭でインクルードが必要です。 mscc.hはすべてのmr関数
の定義と、多数のデータタイプ(addr、booleanなど)と定数の定義が含まれています。 mscc.hファイルは、バージョン
によって内容が異なります。正確なファイルの内容は、$EMPRESSPATH/includeディレクトリにあるファイルを参照し
てください。
初期化とクリーンアップ
mr インターフェースは、msinit関数を呼び出して初期化し、msexit関数を呼び出してクリーンアップします。非プロセス
ベースのO/Sまたはスレッド・タスクベースアプリケーションのケースについては、Empress マニュアルのB2の
『C/C++カーネルレベルインターフェースーmrルーチン』の3.24 Empress タスクモデルのmr ルーチンを参照して下さ
い。
コンパイル
mrを使用したプログラムは、cc等ではなくempccまたはempc++で、コンパイルしてください。
【例】
eemmppcccc tteesstt..cc --oo tteesstt..ddllll
Makefileへの取り込みも可能です。内容については、empcc -listlines aaa.c (aaa.cは架空のファイル名で可)コマ
ンドで確認可能です。表示された内容をMakefileに追加して下さい。Windowsの場合は、Visual Studioの中のプロジェ
クト設定に追加して下さい。
今回のサンプルの実行方法
次の項以降に、mrインターフェースのサンプルがあります。このサンプルの前にはサンプルで使用しているデータベー
ス、テーブル構成、サンプル実行に必要なデータがSQL文の形式で表示されています。それらを準備した上サンプルをc
ファイルとして保存し、コンパイルの上実行して下さい。
22
Empress 導入ガイド
Empressの提供するディスクリプタタイプ
Empressは以下に示す、7つのディスクリプタを提供しています。EmpressのデータベースにMRインターフェースを用い
てアクセスする場合、下記のディスクリプタを使用することで、使用するポインタを混同することなくコードを記述する
ことができます。
ディスクリプタタイプと C/C++ での定義との関連表
ディスクリプタタイ
C/C++ 上での定
table
mrdes*
テーブルディスクリプタ
attribute
mrades*
アトリビュートディスクリプタ
record
mrrdes*
レコードディスクリプタ
qualification
mrqdes*
retrieval
mrretrdes*
リトライバルディスクリプタ(テーブルと条件を関連付け)
expression
mrxdes*
数学的な表現式ディスクリプタ
strings
char*
アトリビュート値の外部フォーマットに一致する文字列ポインタ
プ
義
説明
クオリフィケーションディスクリプタ(アトリビュートまたはレコードとの条
件関連付け)
エラーの取得方法
mr関数では、falseが返されたとき、または失敗時には変数mroperrにエラーコードがセットされます。この変数でエ
ラー原因を調べることができます。またエラー直後にmrerrmsg関数を使用するとエラーメッセージを取得できます。
関数
解説
直前のエラー状態を示す文字列を取得します。
mrerrmsg
[mrerrmsgの使用方法]
ssttrriinngg == mmrreerrrrmmssgg (());;
外部フォーマット、内部フォーマット、ファイルフォーマット
アトリビュート値の内部、外部、ファイルフォーマットについて解説します。これらについては、下記に記載されている
サンプルコードを見てからの方がわかりやすいので、読み飛ばしていただいて構いません。
外部フォーマット
外部フォーマットは、Empressが最終的にデータを出力するときに表示されるフォーマットです。外部フォーマットの値
は文字列です。
内部フォーマット
内部フォーマットは、Empressで処理されるフォーマットです。これは外部フォーマットと必ずしも一致しません。
例えば edate (1)タイプの値は、"1 May 1998"という形で出力されますが、Empressの内部処理では"1 May 1998"の
まま処理されているわけではありません。
ファイルフォーマット
ファイルフォーマットは、Empressがディスクに値を保存する場合に使用されているフォーマットです。 アプリケーショ
ンプログラムでファイルフォーマットを直接操作することはありません。
各フォーマット同士の関連性について
アトリビュート値は通常外部フォーマットで検索されますが、integer値または内部フォーマット値で直接検索することも
可能です。
23
Empress 導入ガイド
アトリビュート値の割り当ては、通常は外部フォーマットまたはinteger値で行いますが、内部フォーマットで直接割り当
てることも可能です。
外部フォーマットで検索された値の計算を行なう場合は、sscanfやatofを使用して、文字列から数値に変換する必要があ
ります。
フォーマット変換関数
関数
解説
外部フォーマットから、ファイルフォーマットへ値を変換します。
[mrcvtの使用方法]
vvaalluuee == mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg));;
mrcvt
value
ファイルフォーマットのアトリビュート値へのポインタ(void*)です。
attr_desc
mrigeta または mrngetaによって返されるアトリビュートディスクリプタ
string
外部フォーマットのアトリビュート値へのポインタ(const char*)です。
(mrades*)です。
外部フォーマットから、ファイルフォーマットへ値を変換します。
mrcvtv
[mrcvtvの使用方法]
vvaalluuee == mmrrccvvttvv ((aattttrr__ddeesscc,, ssttrriinngg));;
value
ファイルフォーマットのアトリビュート値へのポインタ(void*)です。
attr_desc
mrigeta または mrngetaによって返されるポインタ(mrades*)です。
string
外部フォーマットのアトリビュート値へのポインタ(const char*)です。
内部フォーマットから、ファイルフォーマットへ値を変換します。
mrcvti
[mrcvtiの使用方法]
vvaalluuee == mmrrccvvttii ((aattttrr__ddeesscc,, vvaarr__ppttrr));;
value
ファイルフォーマットのアトリビュート値へのポインタ(void*)
attr_desc
mrigeta または mrngetaから返るアトリビュートディスクリプタ(mrades*)
です。
var_ptr
外部フォーマットのアトリビュート値へのポインタ(void*)です。
24
Empress 導入ガイド
組込みSQLを用いた開発
EmpressはmrにSQL組込むために、2つのmr関数を提供します。mrexecdirectはDDL系(Create table, alter, create
index, empty, drop tableなど)とSelect文以外のDML系(Insert、Update、Delete文等)で使用されます。
mrexecqueryはSelect文でのみ使用されます。
1.mrexecdirect関数を使用した組込みSQL開発
mrexecdirectで組込みSQLを使用した例です。ステップ、サンプルコードは下記の様に非常にシンプルになっています。
関数
解説
DDL系(Create table, alter, create index, empty, drop tableなど)とSelect文以外のDML系
(Insert、Update、Delete文等)で使用されます。
mrexecdirect
[mrexecdirectの使用方法]
mmrreexxeeccddiirreecctt ((ddaattaabbaassee__nnaammee,,SSQQLL__ccoommmmaanndd));;
mrexecdirectにはSelect文以外の全てのSQLコマンド、例えば管理者用コマンド、レプリケーション
用SQLコマンドを実行することが可能です。
組込みSQLを用いたデータベース作成のサンプル
このサンプルでは、testdbというデータベースを作るためにcreate database testdbというSQL文を実行していま
す。mrexecdirectの第一引数に指定するデータベース名はハイフン(-)になります。
##iinncclluuddee <<mmsscccc..hh>>
##ddeeffiinnee DDAATTAABBAASSEE ""tteessttddbb""
int main (int argc, char** argv)
{
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt(())) {
printf("Unable to initialize Empress\n");
mmsseenndd(());
return 1;
}
/* データベースtestdbを作成します */
if (! mmrreexxeeccddiirreecctt ((""--"",,""ccrreeaattee ddaattaabbaassee tteessttddbb"")))
{
fprintf (stderr, "mrexecdirect failed\n");
fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
mmsseenndd(());
return 1;
}
printf("success.\n");
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
25
Empress 導入ガイド
組込みSQLを用いたデータ登録のサンプル
このサンプルでは、t1テーブルに対してinsert into t1 values ('Dan','Smith')というSQL文を実行しています。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL create table t1(s1 nlschar, s2 nlschar);
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt(())) {
printf("Unable to initialize Empress\n");
mmsseenndd(());
return 1;
}
/* t1テーブルにレコードを追加します */
if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,,""iinnsseerrtt iinnttoo tt11 vvaalluueess ((''DDaann'',,''SSmmiitthh''))"")))
{
fprintf (stderr, "mrexecdirect failed\n");
fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg(()), mmrrooppeerrrr);
mmsseenndd(());
return 1;
}
printf("success.\n");
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
26
Empress 導入ガイド
組込みSQLを用いたデータ更新のサンプル
このサンプルでは、t1テーブルに対してupdate t1 set s1 = 'Roy' where s1 = 'Dan'というSQL文を実行していま
す。
データベースの更新を行う場合、WHERE節による条件を付ける必要がありますので開発が容易な組込みSQLの使用をお
勧めします。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL
create table t1(s1 nlschar, s2 nlschar);
登録済みデータ用SQL insert into t1 values ('Dan','Smith');
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt(())) {
printf("Unable to initialize Empress\n");
mmsseenndd(());
return 1;
}
/* t1テーブルのレコードを変更します */
if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,,""uuppddaattee tt11 sseett ss11 == ''RRooyy'' wwhheerree ss11 == ''DDaann''"")))
{
fprintf (stderr, "mrexecdirect failed\n");
fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg(()), mmrrooppeerrrr);
mmsseenndd(());
return 1;
}
printf("success.\n");
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
27
Empress 導入ガイド
組込みSQLを用いたデータ削除のサンプル
このサンプルでは、t1テーブルに対してdelete from t1 where s1 = 'Roy'というSQL文を実行しています。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL
create table t1(s1 nlschar, s2 nlschar);
登録済みデータ用SQL insert into t1 values ('Roy','Smith');
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt(())) {
printf("Unable to initialize Empress\n");
mmsseenndd(());
return 1;
}
/* t1テーブルから該当するレコードを削除します */
if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,,""ddeelleettee ffrroomm tt11 wwhheerree ss11 == ''RRooyy''"")))
{
fprintf (stderr, "mrexecdirect failed\n");
fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg(()), mmrrooppeerrrr);
mmsseenndd(());
return 1;
}
printf("success.\n");
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
28
Empress 導入ガイド
組込みSQLを用いたcsvデータ登録のサンプル
Empressでは、insertコマンドの拡張で、csvファイルをデータベースに一括登録することが可能です。
読込みに使用するファイルは、MSVALSEPで指定してあるセパレータ文字で区切ったテキストデータになります。
Empressのデフォルト設定では、Ctrl-Vがセパレータになります。
セパレータを変更したいときには、initfile.txt(データベースエンジンに関連する設定ファイルです。ファイルはEmpress
のインストールディレクトリ内の/config/initfile.txtに存在します。)内のMSVALSEPの値を変更して下さい。
例えば次のようになります。
MMSSVVAALLSSEEPP=="",,""
テキストファイルの文字コードは、インストールされたEmpressの文字コードと同一にして下さい。
このサンプルでは、t1テーブルに対してinsert into t1 from 'data.csv'というSQL文でcsvファイルを登録していま
す。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL
create table t1(s1 nlschar, s2 nlschar);
Suzuki,Ichiro
登録するCSVファイル
Saito,Taro
(ファイル名: data.csv)
Okada,Takashi
MSVALSEPの値
MSVALSEP=","
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt(())) {
printf("Unable to initialize Empress\n");
mmsseenndd(());
return 1;
}
/* t1テーブルへdata.csvファイルからデータを登録します */
if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,,""iinnsseerrtt iinnttoo tt11 ffrroomm ''ddaattaa..ccssvv''"")))
{
fprintf (stderr, "mrexecdirect failed\n");
fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
mmsseenndd(());
return 2;
}
printf("success.\n");
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
29
Empress 導入ガイド
組込みSQLを用いたcsvデータ出力のサンプル
ファイルからの一括登録と同様に、Empressではselectコマンドの拡張でファイルにデータを一括出力することが可能で
す。
SQL文の例は次のようになります。
sseelleecctt ~
~ ffrroomm テ
テー
ーブ
ブル
ル名
名 wwhheerree ~
~ oorrddeerr bbyy ~
~ dduummpp iinnttoo フ
ファ
ァイ
イル
ル名
名
このサンプルでは、t1テーブルに対してselect * from t1 dump into 'data.csv'というSQL文でcsvファイルを登録し
ています。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL
create table t1(s1 nlschar, s2 nlschar);
insert into t1('Dan','Smith');
登録済みデータ用SQL insert into t1('Anna','White');
insert into t1('Ben','Lee');
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt(())) {
printf("Unable to initialize Empress\n");
mmsseenndd(());
return 1;
}
/* t1テーブルからdata.csvファイルへデータを出力します */
if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,,""sseelleecctt ** ffrroomm tt11 dduummpp iinnttoo ''ddaattaa..ccssvv''"")))
{
fprintf (stderr, "mrexecdirect failed\n");
fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
mmsseenndd(());
return 2;
}
printf("success.\n");
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
30
Empress 導入ガイド
2.mrexecqueryを用いた組込みSQL開発
mrexecquery関数で組込みSQLを使用したデータ検索の例です。下記の様にシンプルなコードになっています。
関数
解説
Select文を実行します。
mrexecquery
[mrexecqueryの使用方法]
rreettrriieevvaall__ddeesscc == mmrreexxeeccqquueerryy ((ddaattaabbaassee__nnaammee,,SSQQLL__ccoommmmaanndd,,NNUULLLL));;
while文でmrget関数をコールすることにより、Resultsetからレコードを取得することが可能となり
mrget
ます。
[mrgetの使用方法]
mmrrggeett ((rreettrriieevvaall__ddeesscc)) ==== MMSSMMRR__GGEETT__OOKK
while文内で該当するカーソルのアトリビュートの値を取得します。 ここで取得したデータは
Empressの内部バッファに保存されています。
次のmrrsget_stringをコールされるまで有効です。このデータは必要であれば、ユーザバッファにコ
mrrsget_string ピーして下さい。
[mrrsget_stringの使用方法]
ddaattaa__vvaalluuee == mmrrrrssggeett__ssttrriinngg ((rreettrriieevvaall__ddeesscc)),, aattttrr__nnuummbbeerr));;
mrgetend
mrget関数で呼びだしたクオリフィケーションディスクリプタのクリーンアップを行います。忘れる
とメモリリークの原因となりますのでご注意ください。
[mrgetendの使用方法]
mmrrggeetteenndd ((rreettrriieevvaall__ddeesscc));;
31
Empress 導入ガイド
組込みSQLを用いたデータ検索のサンプル
このサンプルでは、t1テーブルに対してselect * from t1 where s2 = "Miller"というSQL文を実行しています。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL
create table t1(s1 nlschar, s2 nlschar);
登録済みデータ用SQL
insert into t1 values ('Roy','Smith');
insert into t1 values ('Bob','Miller');
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
mmrrrreettrrddeess** retrieve_desc; /* クオリフィケーションディスクリプタ */
char* data_value;
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt(()))
{
fprintf (stderr, "Unable to initialize Empress\n");
mmsseenndd (());
return 1;
}
/* SELECT SQLコマンドの実行を行います */
retrieve_desc = mmrreexxeeccqquueerryy ((DDAATTAABBAASSEE,,
""sseelleecctt ** ffrroomm tt11 wwhheerree ss22 == ''MMiilllleerr''"",, NNUULLLL));
/* クオリフィケーションディスクリプタがNULLの場合はエラーメッセージを取得します */
if (retrieve_desc == NULL)
{
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg(()));
return 1; } /* 検索したresultsetからレコードを取得します */
while (mmrrggeett ((rreettrriieevvee__ddeesscc)) == MMSSMMRR__GGEETT__OOKK) {
/* 検索したカーソルから最初のアトリビュート値を取得します */
data_value = mmrrrrssggeett__ssttrriinngg ((rreettrriieevvee__ddeesscc,, 11)); printf ("%-22s", data_value);
/* 検索したカーソルから2番目のアトリビュート値を取得します */
data_value = mmrrrrssggeett__ssttrriinngg ((rreettrriieevvee__ddeesscc,, 22));
printf ("%-12s\n", data_value);
}
/* mrget関数で呼びだしたクオリフィケーションディスクリプタのクリーンアップを行います */
mmrrggeetteenndd ((rreettrriieevvee__ddeesscc));
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
32
Empress 導入ガイド
mrのみを用いた開発
mrのみでプログラムを作成する方法を解説します。処理時間の高速化と小フットプリントを重視するプログラムを作成し
たい場合お薦めしています。
1.テーブルのオープンとクローズ
テーブルへのアクセスの第一ステップは、テーブルをオープンし、テーブルディスクリプタを取得することです。 mropen
関数が、テーブルをオープンしテーブルディスクリプタを返します。 mropen関数では、データディクショナリで設定され
ているロックレベルをテーブルに設定します。
mropen関数でオープンしたテーブルは、最後にmrclose関数でクローズする必要があります。
関数
解説
テーブルをオープンします。
[mropenの使用方法]
ttaabbllee__ddeesscc == mmrrooppeenn ((ddaattaabbaassee__nnaammee,, ttaabbllee__nnaammee,, mmooddee));;
モードは以下の通りです。
r: 読取りモード u: 更新モード n: ダーティリードモード
mropen
テーブルをクローズし、テーブルがロックされているときにはロックを解放します。
mrclose
[mrcloseの使用方法]
ffllaagg == mmrrcclloossee ((ttaabbllee__ddeesscc));;
以下の例では、loansテーブルを更新モードでオープンしています。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL create loans (name ECHAR (25, 1), date EDATE (1), amount DOLLAR (6, 1));
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
mmrrddeess** loans_tabdesc; /* テーブルディスクリプタ */
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt (()))
{
fprintf (stderr, "Unable to initialize Empress\n");
msend();
return 1;
}
/* テーブルを更新モードで開きます */
if ((loans_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""llooaannss"",, ''uu''))) == NULL)
{
fprintf (stderr, "Unable to open the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* テーブルをクローズします */
else if (!mmrrcclloossee ((llooaannss__ttaabbddeesscc)))
33
Empress 導入ガイド
{
fprintf (stderr, "Unable to close the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
34
Empress 導入ガイド
2. アトリビュートディスクリプタ取得
アトリビュートのデータを扱う場合はアトリビュートディスクリプタを取得する必要があります。これにはmrngeta関数
を使用します。
※ アトリビュート番号によってディスクリプタを取得するmrngeti関数もあります。
関数
解説
アトリビュートディスクリプタを取得します。
mrngeta
[mrngetaの使用方法]
aattttrr__ddeesscc == mmrrnnggeettaa ((ttaabbllee__ddeesscc,, aattttrr__nnaammee));;
以下のサンプルでは、mrngeta関数を使用して、personnelテーブル内のアトリビュートに対して、アトリビュートディ
スクリプタを取得します。
今回使用するデータベース
データベース
testdb
テーブル作成用
SQL
CREATEcreate personnel (number INTEGER, name ECHAR (25, 1), phone ECHAR (15,
1));
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
mmrrddeess** pers_tabdesc; /* テーブルディスクリプタ */
mmrraaddeess** number_attrdesc; /* numberのアトリビュートディスクリプタ */
mmrraaddeess** name_attrdesc; /* nameのアトリビュートディスクリプタ */
mmrraaddeess** phone_attrdesc; /* phoneのアトリビュートディスクリプタ */
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt (()))
{
fprintf (stderr, "Unable to initialize Empress\n");
mmsseenndd(());
return 1;
}
/* テーブルを読取モードで開きます */
if ((pers_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""ppeerrssoonnnneell"",, ''rr''))) == NULL)
{
fprintf (stderr, "Unable to open the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
mmsseenndd(());
return 1;
}
/* mrngeta関数でアトリビュートディスクリプタを取得します */
if ((number_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""nnuummbbeerr""))) == NULL)
{
fprintf (stderr, "Unable to locate attribute 'number' in the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
if ((name_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""nnaammee""))) == NULL)
{
fprintf (stderr, "Unable to locate attribute 'name' in the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
35
Empress 導入ガイド
}
if ((phone_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""pphhoonnee""))) == NULL)
{
fprintf (stderr, "Unable to locate attribute 'phone' in the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* テーブルをクローズします */
if (!mmrrcclloossee ((ppeerrss__ttaabbddeesscc)))
{
fprintf (stderr, "Unable to close the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
36
Empress 導入ガイド
3.レコードディスクリプタ取得
レコードを扱うために、レコードを保存するスペースを割当てる必要があります。mrmkrec関数を使用します。
使用後は、mrfrrec関数を使用して解放する必要があります。
関数
解説
mrmkrec関数でレコードディスクリプタを取得します。
mrmkrec
[mrmkrecの使用方法]
rreeccoorrdd__ddeesscc == mmrrmmkkrreecc ((ttaabbllee__ddeesscc));;
以下のサンプルでは、mrmkrec関数を使用して、loansテーブルレコードディスクリプタを作成し、その後に割当てられ
たスペースを解放します。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL cleate loans (name ECHAR (25, 1), date EDATE (1), amount DOLLAR (6, 1));
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
mmrrddeess** loans_tabdesc; /* テーブルディスクリプタ */
mmrrrrddeess** loans_recdesc; /* レコードディスクリプタ */
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt (()))
{
fprintf (stderr, "Unable to initialize Empress\n");
mmsseenndd(());
return 1;
}
/* テーブルを読取モードで開きます */
if ((loans_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""llooaannss"",, ''rr''))) == NULL)
{
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
mmsseenndd(());
return 1;
}
/* レコードディスクリプタを取得します */
if ((loans_recdesc = mmrrmmkkrreecc ((llooaannss__ttaabbddeesscc))) == NULL)
{
fprintf (stderr, "ERROR in getting record descriptor\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* レコードディスクリプタを解放します */
else if (!mmrrffrrrreecc ((llooaannss__rreeccddeesscc)))
{
fprintf (stderr, "ERROR in freeing record descriptor\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* テーブルをクローズします */
if (!mmrrcclloossee ((llooaannss__ttaabbddeesscc)))
{
37
Empress 導入ガイド
fprintf (stderr, "Unable to close the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
38
Empress 導入ガイド
4.テーブルへのデータ登録
テーブルへのレコードを追加するためには、以下の作業が必要になります。
1. アトリビュートディスクリプタに値を割り当てます。mrputvs関数を使用します。
2. テーブル(レコードディスクリプタ)にレコードを挿入します。mradd関数を使用します。
3. データ登録操作を完了し、テーブルの内部整理を行います。mraddend関数を使用します。
4. レコードディスクリプタを開放します。mrfrrec関数を使用します。
関数
解説
レコード内のアトリビュートに、外部フォーマット値を割当てます。
mrputvs
[mrputvsの使用方法]
ffllaagg == mmrrppuuttvvss ((rreeccoorrdd__ddeesscc,, aattttrr__ddeesscc,, vvaalluuee));;
テーブルにレコードを挿入します。
mradd
[mraddの使用方法]
ffllaagg == mmrraadddd ((rreeccoorrdd__ddeesscc));;
データ登録操作を完了し、テーブルの内部整理を行います。
mraddend
[mraddendの使用方法]
ffllaagg == mmrraaddddeenndd ((rreeccoorrdd__ddeesscc));;
値をレコードディスクリプタに割当てるには、以下の3つの関数が使用されます。
mrputvs アトリビュートに割当てられる値が、外部フォーマットである場合
mrputvi アトリビュートに割当てられる値が、Cのinteger値である場合
mrputi
アトリビュートに割当てられる値が内部フォーマットアトリビュート値のポインタである場合
通常mrputiが一番早い方法です。
レコードにアトリビュート値が割当てられている場合、そのレコードはテーブルに追加することができます。 これは
mradd関数によって実行されます。
テーブルへの挿入が終了した場合、mraddend関数を呼び出してください。テーブルのヘッダの整理を行います。
※ 複数レコードを追加するときmraddendは最後に一回だけ呼び出して下さい。更に高速化が要求されるときには
Empressサポートに問い合わせてください。
以下のサンプルでは、loansテーブル内にレコードを1つ挿入します。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL create loans (name ECHAR (25, 1), date EDATE (1), amount DOLLAR (6, 1));
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
mmrrddeess** loans_tabdesc; /* テーブルディスクリプタ */
mmrrrrddeess** loans_recdesc; /* レコードディスクリプタ */
mmrraaddeess** name_attrdesc; /* nameのアトリビュートディスクリプタ */
mmrraaddeess** date_attrdesc; /* dateのアトリビュートディスクリプタ */
mmrraaddeess** amount_attrdesc; /* amountのアトリビュートディスクリプタ */
/* mrインターフェースの初期化を行います */
39
Empress 導入ガイド
if (!mmssiinniitt (()))
{
fprintf (stderr, "Unable to initialize Empress\n");
mmsseenndd (());
return 1;
}
/* テーブルを更新モードで開きます */
loans_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""llooaannss"",, ''uu''));
/* mrngeta関数でアトリビュートディスクリプタを取得します */
name_attrdesc = mmrrnnggeettaa ((llooaannss__ttaabbddeesscc,, ""nnaammee""));
date_attrdesc = mmrrnnggeettaa ((llooaannss__ttaabbddeesscc,, ""ddaattee""));
amount_attrdesc = mmrrnnggeettaa ((llooaannss__ttaabbddeesscc,, ""aammoouunntt""));
/* レコードディスクリプタを取得します */
loans_recdesc = mmrrmmkkrreecc ((llooaannss__ttaabbddeesscc));
/* アトリビュートnameに、外部フォーマット(Jones)を割当てます */
if (! mmrrppuuttvvss ((llooaannss__rreeccddeesscc,, nnaammee__aattttrrddeesscc,, ""JJoonneess"")))
{
fprintf (stderr, "Name conversion unsuccessful\n"); mmrrffrrrreecc ((llooaannss__rreeccddeesscc));
mmrrcclloossee ((llooaannss__ttaabbddeesscc));
mmsseenndd(());
return 1;
}
/* アトリビュートdateに、外部フォーマット(2 July 2010)を割当てます */
else if (! mmrrppuuttvvss ((llooaannss__rreeccddeesscc,, ddaattee__aattttrrddeesscc,, ""22 JJuullyy 22001100"")))
{
fprintf (stderr, "Date conversion unsuccessful\n"); mmrrffrrrreecc ((llooaannss__rreeccddeesscc));
mmrrcclloossee ((llooaannss__ttaabbddeesscc));
mmsseenndd(());
return 1;
}
/* アトリビュートamountに、外部フォーマット($75.00)を割当てます */
else if (! mmrrppuuttvvss ((llooaannss__rreeccddeesscc,, aammoouunntt__aattttrrddeesscc,, ""$$7755..0000"")))
{
fprintf (stderr, "Amount conversion unsuccessful\n"); mmrrffrrrreecc ((llooaannss__rreeccddeesscc));
mmrrcclloossee ((llooaannss__ttaabbddeesscc));
mmsseenndd(());
return 1;
}
/* mradd関数でテーブルにレコードを挿入します */
if (!mmrraadddd ((llooaannss__rreeccddeesscc)))
{
fprintf (stderr, "ERROR in adding record\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* データ登録操作を完了し、テーブルの内部整理を行います */
if (!mmrraaddddeenndd ((llooaannss__rreeccddeesscc)))
{
fprintf (stderr, "ERROR in flushing cache\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
40
Empress 導入ガイド
}
/* レコードディスクリプタを解放します */
if (!mmrrffrrrreecc ((llooaannss__rreeccddeesscc)))
{
fprintf (stderr, "ERROR in freeing record buffers\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* テーブルをクローズします */
if (!mmrrcclloossee ((llooaannss__ttaabbddeesscc)))
{
fprintf (stderr, "Unable to close the table\n");
fprintf (stderr, "mroperr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
41
Empress 導入ガイド
5. データの検索
データを検索するには、以下の6グループの関数が使用されます。検索条件がある場合、テーブルと条件を関連付けるクオ
リフィケーションディスクリプタmrretrdes*を使用します。
No. 役割
関数名
1
データベース検索の初期化
2
resultsetの取得
3
mrgetbegin
mrsrbegin
mrget
アトリビュート値の保存用のス
ペース割当て
検索条件、ソート条件(order by)を設定します。
mrgetbegin関数はソート無しの場合、
mrsrbegin関数はソート有の場合使用します。
他にも以下のような関数があります。
mrprev関数、 mrreget関数、 mrreprev関数
mrxget関数、mrgetrec関数
mrspv
mrgetvs
mrgetvi
mrgeti
mrgfunc
mrgetvs、mrgetvi、mrgetiはresutsetからアトリビュートの
値を取得します。
mrgfunc関数は集計関数を実行します。
詳しい使い方はEmpressのサポートにお問い合わせ下さい。
4
アトリビュート値の取得
5
後に使用するレコードへのポイン
タを取得
mrgetptr
6
検索後のクリーンアップ
mrgetend
mrfree
関数
その他
解説
外部フォーマットのアトリビュート値を保存するためにアトリビュート値の保存用のスペース割当てま
す。
mrspv
[mrspvの使用方法]
ssppaaccee == mmrrssppvv ((aattttrr__ddeesscc));;
mrfreeで解放しない限り、スペースは割付けられたままです。 TEXTまたはBULKデータタイ
プのアトリビュートには使用できません。
検索の初期化を行います。
[mrgetbeginの使用方法]
rreettrriieevvaall__ddeesscc == mmrrggeettbbeeggiinn ((qquuaall__ddeesscc,, rreeccoorrdd__ddeesscc__11,, rreeccoorrdd__ddeesscc__22,, ........ ,,
NNUULLLL));;
mrgetに渡されるクオリフィケーションディスクリプタへのポイン
retrieval_desc
タ(mrretrdes*)です。
mrgetbegin
qual_desc
mrq関数から返されるクオリフィケーションディスクリプタへのポ
インタ(mrqdes*)です。 検索条件が与えられなかった場合、0に置
き換えられます。ここがwhere節に該当します。
record_desc_1~n
mrmkrecによって返されるポインタ(mrrdes*)です。SQL文の
from節 table_1, table_2 ~,table_nに該当します。
NULL
NULLターミネートが必要です。
resultsetからデータを取得します。
mrget
[mrgetの使用方法]
ffllaagg == mmrrggeett ((rreettrriieevvaall__ddeesscc));;
成功した場合MSMR_GET_OKを返します。 レコードがすべて検索された場合は
MSMR_GET_EORを、 レコードがロックされている場合、失敗した場合はMSMR_GET_ERR
を返します。
42
Empress 導入ガイド
mrcopyv
レコードとアトリビュートを指定して、値を外部フォーマットの形で取得します。
[mrcopyvの使用方法]
ffllaagg == mmrrccooppyyvv ((rreeccoorrdd__ddeesscc,, aattttrr__ddeesscc,, ssppaaccee));;
データ取得後のクリーンアップを行ないます。
mrgetend
[mrgetendの使用方法]
mmrrggeetteenndd ((rreettrriieevvaall__ddeesscc));;
mrspv関数に割当てられたアトリビュート値の保存用のスペースを解放します。
mrfree
[mrfreeの使用方法]
mmrrffrreeee ((ssppaaccee));;
spaceはmrspv関数の戻り値です。
サンプル1 where節がない検索
このサンプルでは、personnelテーブルに対して全てのレコードの検索をして、名前と電話番号を表示します。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL
create personnel (number INTEGER, name ECHAR (25, 1), phone ECHAR (15, 1),
date EDATE (1));
登録済みデータ用SQL
insert
insert
insert
insert
insert
insert
実行する操作に相当す
るSQL
select name, phone from personnel
into
into
into
into
into
into
personnel
personnel
personnel
personnel
personnel
personnel
values(10,'Kilroy','03-9999-9991','12 January 2014');
values(3,'Jones','03-9999-9992','13 January 2014');
values(5,'Mosca','04-9999-9993','12 February 2014');
values(17,'Wladislaw','04-9999-9994','13 February 2014');
values(8,'Peterson','03-9999-9995','12 March 2014');
values(4,'Scarlatti','03-9999-9996','12 April 2014');
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
mmrrddeess** pers_tabdesc; /* テーブルディスクリプタ */
mmrraaddeess** name_attrdesc; /* アトリビュートディスクリプタ */
mmrraaddeess** phone_attrdesc; /* アトリビュートディスクリプタ */ mmrrrrddeess** pers_recdesc; /* レコードディスクリプタ */
mmrrrreettrrddeess** retrieve_desc; /* テーブルと条件を関連付けるリトライバルディスクリプタ */
int employees;
char* name_value;
char* phone_value;
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt(())) {
fprintf(stderr, "Unable to initialize Empress\n");
mmsseenndd (());
return 1;
}
/* テーブルを読取モードで開きます */
pers_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""ppeerrssoonnnneell"",, ''rr''));
43
Empress 導入ガイド
/* レコードディスクリプタを取得します */
pers_recdesc = mmrrmmkkrreecc ((ppeerrss__ttaabbddeesscc));
/* アトリビュートディスクリプタを取得します */ name_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""nnaammee"")); phone_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""pphhoonnee""));
/* 外部フォーマットのアトリビュート値を保存するために
アトリビュート値の保存用のスペース割当てます。 */ name_value = mmrrssppvv ((nnaammee__aattttrrddeesscc)); phone_value = mmrrssppvv ((pphhoonnee__aattttrrddeesscc)); printf ("名前 電話番号\n");
employees = 0;
/* 検索の初期化を行います。where節がないために、第一パラメータにNULLをセットします。 */
retrieve_desc = mmrrggeettbbeeggiinn ((NNUULLLL,, ppeerrss__rreeccddeesscc,, NNUULLLL)); /* 各レコードを取得するループを実行します */
while (mmrrggeett ((rreettrriieevvee__ddeesscc)) ==== MMSSMMRR__GGEETT__OOKK) {
/* レコードとアトリビュートを指定して、値を外部フォーマットの形で取得します */
mmrrccooppyyvv ((ppeerrss__rreeccddeesscc,, nnaammee__aattttrrddeesscc,, nnaammee__vvaalluuee)); /* 名前 */ mmrrccooppyyvv ((ppeerrss__rreeccddeesscc,, pphhoonnee__aattttrrddeesscc,, pphhoonnee__vvaalluuee)); /* 電話番号 */ printf ("%-12s%-12s\n", name_value, phone_value);
employees++;
}
/* レコード検索を終了します */
mmrrggeetteenndd ((rreettrriieevvee__ddeesscc));
printf ("\nTotal Number of Employees = %d\n", employees); /* mrspv関数に割当てられたスペースを解放します */
mmrrffrreeee ((nnaammee__vvaalluuee));
mmrrffrreeee ((pphhoonnee__vvaalluuee));
/* レコードディスクリプタスペース割当を解放します */ if (!mmrrffrrrreecc ((ppeerrss__rreeccddeesscc)))
{
fprintf (stderr, "ERROR in freeing record buffers\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* テーブルをクローズします */
if (!mrclose (pers_tabdesc))
{
fprintf (stderr, "Unable to close the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* mrインターフェースのクリーンアップを行います */
mmsseenndd (());
return 0;
}
44
Empress 導入ガイド
サンプル2 ソートを伴う検索
関数
解説
ソートのある検索の初期化を行います。
[mrsrtbeginの使用方法]
rreettrriieevvaall__ddeesscc == mmrrssrrttbbeeggiinn ((qquuaall__ddeesscc,, rreeccoorrdd__ddeesscc__11,, rreeccoorrdd__ddeesscc__22,, ........ ,,
NNUULLLL,, aattttrr__ddeesscc__11,, ttyyppee,, aattttrr__ddeesscc__22,, ttyyppee,, ........ ,, NNUULLLL));;
mrgetから返されるクオリフィケーションディスクリプタのポイン
retrieval_desc
タ (mrretrdes*)です。
qual_desc
indicator
mrsrtbegin
mrq~関数群によって返される、 SQLのwhere節に該当するクオ
リフィケーションディスクリプタのポインタ(mrqdes*)です。 検索
条件がない場合、NULLに置き換えられます。
'u'または's'はユニークなソート(u)か、標準的なソート(s)かを意味
しています。
これはシングルクォートで囲む必要があります。
mrmkrecから返されるポインタ(mrrdes*)です。必要な数だけ指定
record_desc_1~n できます。SQL文のfrom節 table_1, table_2 ~ ,table_nに該当し
ます。
NULL
レコードディスクリプタのNULLターミネートが必要です。
attr_desc_1~n
mrngeta または mrigetaによって返されるポインタ(mrades*)で
す。必要な数だけ指定できます。SQL文のorder by節に該当しま
す。
type
'a'または 'd'は、ソート順を昇順(ascending)にするか降順
(descending)にするかを指定します。
NULL
order byで使用しているアトリビュートディスクリプタのNULL
ターミネートが必要です。
このサンプルでは、personnelテーブルに対して全てのレコードの検索をして、名前の降順でソートを行います。
今回使用するデータベース
データベース
testdb
テーブル作成用
SQL
create personnel (number INTEGER, name ECHAR (25, 1), phone ECHAR (15, 1), date
EDATE (1));
登録済みデータ用
SQL
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
personnel
personnel
personnel
personnel
personnel
personnel
values(10,'Kilroy','03-9999-9991','12 January 2014');
values(3,'Jones','03-9999-9992','13 January 2014');
values(5,'Mosca','04-9999-9993','12 February 2014');
values(17,'Wladislaw','04-9999-9994','13 February 2014');
values(8,'Peterson','03-9999-9995','12 March 2014');
values(4,'Scarlatti','03-9999-9996','12 April 2014');
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
mmrrddeess** pers_tabdesc; /* テーブルディスクリプタ */
mmrraaddeess** name_attrdesc; /* アトリビュートディスクリプタ */
mmrraaddeess** phone_attrdesc; /* アトリビュートディスクリプタ */ mmrrrrddeess** pers_recdesc; /* レコードディスクリプタ */
mmrrrreettrrddeess** retrieve_desc; /* テーブルと条件を関連付ける
クオリフィケーションディスクリプタ */
int employees;
45
Empress 導入ガイド
char* name_value;
char* phone_value;
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt(())) {
fprintf(stderr, "Unable to initialize Empress\n");
mmsseenndd (());
return 1;
}
/* テーブルを読取モードで開きます */
pers_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""ppeerrssoonnnneell"",, ''rr''));
/* レコードディスクリプタを取得します */
pers_recdesc = mmrrmmkkrreecc ((ppeerrss__ttaabbddeesscc));
/* アトリビュートディスクリプタを取得します */ name_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""nnaammee"")); phone_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""pphhoonnee""));
/* 外部フォーマットのアトリビュート値を保存するために
アトリビュート値の保存用のスペース割当てます。 */ name_value = mmrrssppvv ((nnaammee__aattttrrddeesscc)); phone_value = mmrrssppvv ((pphhoonnee__aattttrrddeesscc)); printf ("名前 電話番号\n");
employees = 0; /* クオリフィケーションディスクリプタにカーソルをセットします 第1パラメータのNULLは検索条件、
第2パラメータのsはソートを表します */
retrieve_desc = mmrrssrrttbbeeggiinn ((NNUULLLL,, ''ss'',, ppeerrss__rreeccddeesscc,, NNUULLLL,, nnaammee__aattttrrddeesscc,, ''dd'',, NNUULLLL)); /* 各レコードを取得するループを実行します */
while (mmrrggeett ((rreettrriieevvee__ddeesscc)) ==== MMSSMMRR__GGEETT__OOKK) {
/* レコードとアトリビュートを指定して値を外部フォーマットの形で取得します */
mmrrccooppyyvv ((ppeerrss__rreeccddeesscc,, nnaammee__aattttrrddeesscc,, nnaammee__vvaalluuee)); /* 名前 */ mmrrccooppyyvv ((ppeerrss__rreeccddeesscc,, pphhoonnee__aattttrrddeesscc,, pphhoonnee__vvaalluuee)); /* 電話番号 */ printf ("%-12s%-12s\n", name_value, phone_value);
employees++; /* レコード数をインクリメントしています */
}
/* レコード検索終了 */
mmrrggeetteenndd ((rreettrriieevvee__ddeesscc));
/* レコード数を入れていたemployeesをつかってレコード数を表示します */
printf ("\nTotal Number of Employees = %d\n", employees); /* mrspv関数に割当てられたスペースを解放します */
mmrrffrreeee ((nnaammee__vvaalluuee));
mmrrffrreeee ((pphhoonnee__vvaalluuee));
/* レコードディスクリプタスペース割当を解放します */ 46
Empress 導入ガイド
if (!mmrrffrrrreecc ((ppeerrss__rreeccddeesscc)))
{
fprintf (stderr, "ERROR in freeing record buffers\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* テーブルをクローズします */
if (!mrclose (pers_tabdesc))
{
fprintf (stderr, "Unable to close the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* mrインターフェースのクリーンアップを行います */
mmsseenndd (());
return 0;
}
47
Empress 導入ガイド
検索条件の作成
SQL文のWHERE句に似た条件を作成するためには、mrq~ 関数を使用します。これらの関数は mrgetbegin関数グルー
プの1つに受け渡される、クオリフィケーションディスクリプタを返します。
関数
解説
アトリビュート値をファイルフォーマットの定数と比較します。
例えば、アトリビュート = 検索値、アトリビュート >= 検索値、アトリビュート != 検索値というような場
合です。
検索値には、mrcvt関数群の1つによって返されるファイルフォーマットへのポインタを使用します。
例)qual_desc = mrqcon (">", price_attrdesc, mrcvt (amount_attrdesc, amount));
[mrqconの使用方法]
qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, &&vvaarr));;
qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg))));;
mrqcon
qual_desc
mrgetbeginで使用されるクオリフィケーションディスクリプタのポインタ
(void*)です。
operator
次に示すいずれかの文字列(const char*)。
">", "<", ">=", "<=", "=", "!=" ("~="は"!="と同義です。)
attr_desc
mrigetaまたは mrngetaから返るアトリビュートディスクリプタです。
var
ファイルフォーマットの定数を含む値です。
string
外部アトリビュートフォーマット値のポインタ(const char*)です。
[mrcvtの使用方法]
vvaalluuee == mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg));;
value
ファイルフォーマットのアトリビュート値へのポインタ(void*)です。
attr_desc
mrigeta または mrngetaによって返されるアトリビュートディスクリプタ
(mrades*)です。
string
外部フォーマットのアトリビュート値へのポインタ(const char*)です。
アトリビュート値を指定範囲と比較します。
[mrqrngの使用方法]
qquuaall__ddeesscc == mmrrqqrrnngg ((aattttrr__ddeesscc,, lloowweerr__lliimmiitt,, lliimmiitt__ttyyppee__11,, uuppppeerr__lliimmiitt,,
lliimmiitt__ttyyppee__22));;
qquuaall__ddeesscc == mmrrqqrrnngg ((aattttrr__ddeesscc,, mmrrccvvttvv ((aattttrr__ddeesscc,, ssttrriinngg__11)),,
lliimmiitt__ttyyppee__11,, mmrrccvvttvv22 ((aattttrr__ddeesscc,, ssttrriinngg__22)),, lliimmiitt__ttyyppee__22));;
mrqrng
qual_desc
mrgetbeginで使用されるクオリフィケーションディスクリプタのポインタ
(mrqdes*)です。
attr_desc
mrigetaまたはmrngetaから返るアトリビュートディスクリプタ(mrades*)で
す。
string_1
外部フォーマットのアトリビュート値へのポインタ(const char*)です。
string_2
外部フォーマットのアトリビュート値へのポインタ(const char*)です。
limit_type_1
'i' または 'e'です。下限に指定した値を限界値に含むか (inclusive)、含まない
か(exclusive)の指定です。
limit_type_2
'i' または 'e'です。上限に指定した値を限界値に含むか (inclusive)、含まない
か(exclusive)の指定です。
lower_limit
範囲の下限値を表すファイルフォーマット値へのポインタ (void*)です。
upper_limit
範囲の上限値を表すファイルフォーマット値へのポインタ(void*)です。
48
Empress 導入ガイド
2つのアトリビュート値を比較します。
[mrqatrの使用方法]
qquuaall__ddeesscc == mmrrqqaattrr ((ooppeerraattoorr,, aattttrr__ddeesscc__11,, aattttrr__ddeesscc__22));;
qual_desc
mrqatr
mrgetbeginまたはmrsrtbeginで使用されるクオリフィケーションディス
クリプタ(mrqdes*)です。
operator
次のいずれかの一つの文字列(const char*)です。
attr_desc_1
mrigeta または mrngetaから返るアトリビュートディスクリプタ
attr_desc_2
mrigeta または mrngetaから返るアトリビュートディスクリプタ
"=", ">=", ">", "<=", "<", "!=" ("~="と"!="は同義です。)
(mrades*)です。
(mrades*)です。
アトリビュート値を定数とマッチングします。
[mrqmchの使用方法]
qquuaall__ddeesscc == mmrrqqmmcchh ((ooppeerraattoorr,, aattttrr__ddeesscc,, ppaatttteerrnn));;
mrqmch
qual_desc
mrgetbeginで使用される クオリフィケーションディスクリプタ(mrqdes*)
です。
operator
次の文字列(const char*)のうちの1つです。
MATCH、SMATCH、 !MATCH、!SMATCH ("~"は"!"と同義語です。)
attr_desc
mrigetaまたはmrngetaから返るアトリビュートディスクリプタ(mrades*)
です。
pattern
パターンのポインタ(const char*)です。
アトリビュート値をNULLと比較します。
[mrqnulの使用方法]
qquuaall__ddeesscc == mmrrqqnnuull ((ooppeerraattoorr,, aattttrr__ddeesscc));;
mrqnul
qual_desc
mrgetbeginで使用されるクオリフィケーションディスクリプタ(mrqdes*)
です。
operator
次に示す文字列(const char*)です。=、!=、(~= は != と同義語です。)
attr_desc
mrigeta または mrngetaから返るアトリビュートディスクリプタ
(mrades*)です。
アトリビュート値が文字列と等しいか調べます。
[mrqseqの使用方法]
qquuaall__ddeesscc == mmrrqqsseeqq ((aattttrr__ddeesscc,, ssttrriinngg));;
mrqseq
qual_desc
mrgetbegin または mrsrtbeginで使用されるクオリフィケーションディス
クリプタ(mrqdes*)です。
attr_desc
mrigetaまたはmrngetaから返るアトリビュートディスクリプタ(mrades*)
です。
string
外部フォーマットのアトリビュート値へのポインタ(const char*)です。
アトリビュート値が整数(C integer)と等しいか調べます。
mrqieq
[mrqieqの使用方法]
qquuaall__ddeesscc == mmrrqqiieeqq ((aattttrr__ddeesscc,, iinntteeggeerr));;
49
Empress 導入ガイド
qual_desc
mrgetbegin または mrsrtbeginを使用したクオリフィケーションディスク
attr_desc
mrigetaまたはmrngetaから返るアトリビュートディスクリプタ(void*) で
integer
Integer値またはInteger変数です。
リプタ(void*) です。
す。
2つの条件をAND結合します。
[mrqandの使用方法]
qquuaall__ddeesscc == mmrrqqaanndd ((qquuaall__ddeesscc__11,, qquuaall__ddeesscc__22));;
mrqand
qual_desc
mrgetbeginまたは mrsrtbeginによって返されるクオリフィケーション
qual_desc_1
mrq~関数によって返されるクオリフィケーションディスクリプタ
qual_desc_2
mrq~関数によって返されるクオリフィケーションディスクリプタ
(mrqdes*)です。
ディスクリプタ(mrqdes*)です。
(mrqdes*) です。
2つの条件をOR結合します。
[mrqorの使用方法]
qquuaall__ddeesscc == mmrrqqoorr ((qquuaall__ddeesscc__11,, qquuaall__ddeesscc__22));;
mrqor
qual_desc
クオリフィケーションディスクリプタ(mrqdes*)です。
qual_desc_1
mrq~関数によって返されるクオリフィケーションディスクリプタ
(mrqdes*)です。
qual_desc_2
mrq~関数によって返されるクオリフィケーションディスクリプタ
(mrqdes*)です。
比較条件を否定します。
mrqnot
[mrqnotの使用方法]
qquuaall__ddeesscc == mmrrqqnnoott ((qquuaall__ddeesscc));;
qual_desc mrq~関数で使用されるクオリフィケーションディスクリプタ(mrqdes*)です。
以前に取得した、レコードへのポインタのリストで、レコードを制限します。
[mrqlstの使用方法]
qquuaall__ddeesscc == mmrrqqllsstt ((ttaabbllee__ddeesscc,, aarrrraayy));;
mrqlst
qual_desc
mrgetbegin または mrsrtbeginで使用される、クオリフィケーション
ディスクリプタ(void*)です。
table_desc
mropenから返される、オープンされたテーブルディスクリプタ (mrdes*)
です。
array
mrgetptr関数によって取得した、レコードへのポインタ(long)配列です。
検索条件を伴う検索
関数
解説
検索条件を作成します。SQLでは price > 3000 and price <=8000 の部分です。
mrqrng
mrqrng関数でアトリビュート値を与えられた範囲と比較します。 範囲の限界は、ファイルフォーマット値へ
のポインタとして指定されます。 比較する値には、mrcvt関数群(今回はmrcvtv関数とmrcvtv2関数)に
よって返されるポインタが使用されます。
50
Empress 導入ガイド
[mrqrngの使用方法]
qquuaall__ddeesscc == mmrrqqrrnngg ((aattttrr__ddeesscc,, lloowweerr__lliimmiitt,,
lliimmiitt__ttyyppee__11,, uuppppeerr__lliimmiitt,,
lliimmiitt__ttyyppee__22));;
qquuaall__ddeesscc == mmrrqqrrnngg ((aattttrr__ddeesscc,,
mmrrccvvttvv ((aattttrr__ddeesscc,, ssttrriinngg__11)),,
lliimmiitt__ttyyppee__11,,
mmrrccvvttvv22 ((aattttrr__ddeesscc,, ssttrriinngg__22)),,
lliimmiitt__ttyyppee__22));;
qual_desc
mrgetbeginで使用されるクオリフィケーションディスクリプタ (mrqdes*)で
す。
attr_desc
mrigetaまたはmrngetaから返るアトリビュートディスクリプタ(mrades*)で
す。
string_1
外部フォーマットのアトリビュート値へのポインタ(const char*)です。
string_2
外部フォーマットのアトリビュート値へのポインタ(const char*)です。
limit_type_1
'i' または 'e'です。下限に指定した値を限界値に含むか (inclusive)、含まない
か(exclusive)の指定です。
limit_type_2
'i' または 'e'です。上限に指定した値を限界値に含むか (inclusive)、含まない
か(exclusive)の指定です。
lower_limit
範囲の下限値を表すファイルフォーマット値へのポインタ (void*)です。
upper_limit
範囲の上限値を表すファイルフォーマット値へのポインタ(void*)です。
以下のサンプルは、mrqrng関数を使用して、金額が3001円以上8千円以下のレコードを検索します。
今回使用するデータベース
データベース
テーブル作成用SQL
testdb
create table products(pid smallint, name nlschar(40, 1, 0), price integer);
insert
insert
登録済みデータ用SQL insert
insert
insert
into
into
into
into
into
products
products
products
products
products
values(1,
values(2,
values(3,
values(4,
values(5,
'CD-R 700MB 50枚', 2000);
'CD-R 700MB 100枚', 4000);
'ワイヤレスマウス', 2800);
'外付けHDD 500GB', 8000);
'外付けHDD 1TB', 9000);
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
int ret;
mmrrddeess** prod_tabdesc; /* テーブルディスクリプタ */
mmrrrrddeess** prod_recdesc; /* レコードディスクリプタ */
mmrraaddeess** pid_attrdesc; /* pid用アトリビュートディスクリプタ */
mmrraaddeess** name_attrdesc; /* name用アトリビュートディスクリプタ */
mmrraaddeess** price_attrdesc; /* price用アトリビュートディスクリプタ */
mmrrqqddeess** qual; /* 条件関連付けディスクリプタ */
mmrrrreettrrddeess** retrieve_desc; /* テーブルと条件を関連付けるディスクリプタ */
51
Empress 導入ガイド
char* pid_value;
char* name_value;
char* price_value;
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt(()))
{
fprintf (stderr, "Unable to initialize Empress\n");
mmsseenndd (());
return 1;
}
/* productsテーブルを読取モードで開きます */
prod_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""pprroodduuccttss"",, ''rr''));
/* レコードディスクリプタを作成します */
prod_recdesc = mmrrmmkkrreecc ((pprroodd__ttaabbddeesscc));
/* アトリビュートディスクリプタを作成します */
pid_attrdesc = mmrrnnggeettaa ((pprroodd__ttaabbddeesscc,, ""ppiidd""));
name_attrdesc = mmrrnnggeettaa ((pprroodd__ttaabbddeesscc,, ""nnaammee""));
price_attrdesc = mmrrnnggeettaa ((pprroodd__ttaabbddeesscc,, ""pprriiccee""));
/* mrspv関数で外部フォーマットアトリビュート値を保存するためのスペースを割当てます。*/
pid_value = mmrrssppvv ((ppiidd__aattttrrddeesscc));
name_value = mmrrssppvv ((nnaammee__aattttrrddeesscc));
price_value = mmrrssppvv ((pprriiccee__aattttrrddeesscc));
printf ("価格が3001円以上8000円以下の商品一覧\n\n");
printf ("%-8s%-22s%-12s\n", "PID", "Name", "Price");
/* mrqrng関数でアトリビュートの値をファイルフォーマットの定数と比較を設定します。
範囲は 3001円〜~8000円です */ qual = mmrrqqrrnngg ((pprriiccee__aattttrrddeesscc,, mmrrccvvttvv((pprriiccee__aattttrrddeesscc,, ""33000000"")),, ''ee'',, mmrrccvvttvv22((pprriiccee__aattttrrddeesscc,, ""88000000"")),, ''ii''));
/* mrgetbegin関数で検索条件をレコードと関連付けます。 */
retrieve_desc = mmrrggeettbbeeggiinn ((qquuaall,, pprroodd__rreeccddeesscc,, NNUULLLL));
/* レコード検索開始 */
while (mmrrggeett ((rreettrriieevvee__ddeesscc)) ==== MMSSMMRR__GGEETT__OOKK)
{
/* アトリビュートの値を外部フォーマットの形で取得します (pid) */
ret = mmrrccooppyyvv ((pprroodd__rreeccddeesscc,, ppiidd__aattttrrddeesscc,, ppiidd__vvaalluuee));
if (ret == MMSSMMRR__OOKK)
printf ("%-4s", pid_value); /* pidのNULL以外の値 */
else if (ret == MMSSMMRR__NNUULLLL)
printf ("%-4s", "NULL"); /* pidの値がNULLのとき */
else
{
printf ("%s\n", "ERROR in getting 'pid'");
printf ("mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
break;
}
/* アトリビュートの値を外部フォーマットの形で取得します (name) */ 52
Empress 導入ガイド
ret = mmrrccooppyyvv ((pprroodd__rreeccddeesscc,, nnaammee__aattttrrddeesscc,, nnaammee__vvaalluuee));
if (ret == MMSSMMRR__OOKK)
printf ("%-22s\t", name_value); /* nameのNULL以外の値 */
else if (ret == MMSSMMRR__NNUULLLL)
printf ("%-22s\t", "NULL"); /* nameの値がNULLのとき */
else
{
printf ("%s\n", "ERROR in getting 'name'");
printf ("mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
break;
}
/* アトリビュートの値を外部フォーマットの形で取得します (price) */ ret = mmrrccooppyyvv ((pprroodd__rreeccddeesscc,, pprriiccee__aattttrrddeesscc,, pprriiccee__vvaalluuee));
if (ret == MMSSMMRR__OOKK)
printf ("%-12s\n", price_value); /* priceのNULL以外の値 */
else if (ret == MMSSMMRR__NNUULLLL)
printf ("%-12s\n", "NULL"); /* priceの値がNULLのとき */
else
{
printf ("%s\n", "ERROR in getting 'price'");
printf ("mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
break;
}
}
/* テーブルからのレコード検索後のクリーンアップを行います */
mmrrggeetteenndd ((rreettrriieevvee__ddeesscc));
/* mrspv関数でによって割り当てられたスペースを解放します */
mmrrffrreeee ((ppiidd__vvaalluuee));
mmrrffrreeee ((nnaammee__vvaalluuee));
mmrrffrreeee ((pprriiccee__vvaalluuee));
/* レコードディスクリプタスペース割当を解放します */
if (!mmrrffrrrreecc ((pprroodd__rreeccddeesscc)))
{
fprintf (stderr, "ERROR in freeing record buffers\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* テーブルをクローズします */
if (!mmrrcclloossee ((pprroodd__ttaabbddeesscc)))
{
fprintf (stderr, "Unable to close the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
53
Empress 導入ガイド
6. レコードの削除
レコードを削除するためには、以下の作業が必要になります。
1. 検索条件を設定し、検索を行います。対象レコードは、mrgetbegin関数と検索条件関数により初期化され、mrget関数
で特定されます。
2. 該当レコードを1レコードずつ削除します。mrdel関数を使用します。
3. すべての削除が完了したら、mrdelend関数を使用します。
関数
解説
delete文のwhere節に該当するクオリフィケーションディスクリプタを作成します。mrqcon関数でアトリ
ビュート値をファイルフォーマットの定数と比較します。
[mrqconの使用方法]
qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, &&vvaarr));;
qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg))));;
mrqcon
qual_desc
mrgetbeginで使用されるクオリフィケーションディスクリプタ (void*)で
す。
operator
次に示すいずれかの文字列(const char*)。
">", "<", ">=", "<=", "=", "!=" ("~="は"!="と同義です。)
attr_desc
mrigeta または mrngeta から返るアトリビュートディスクリプタ(void*)
です。
var
ファイルフォーマットの定数を含む値です。
string
外部アトリビュートフォーマット値のポインタ(const char*)です。
外部フォーマットのアトリビュート値を、ファイルフォーマット(パブリックバッファ)に変換します。
[mrcvtの使用方法]
vvaalluuee == mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg));; mrcvt
value
ファイルフォーマットのアトリビュート値へのポインタ(void*)です。
attr_desc
mrigeta または mrngetaによって返されるアトリビュートディスクリプ
タ(mrades*)です。
string
外部フォーマットのアトリビュート値へのポインタ(const char*)です。
テーブルから1レコードを削除します。
mrdel
[mrdelの使用方法]
ffllaagg == mmrrddeell ((rreeccoorrdd__ddeesscc));;
テーブルからのレコード削除後にクリーンアップ処理を実行します。
mrdelend
[mrdelendの使用方法]
ffllaagg == mmrrddeelleenndd ((rreeccoorrdd__ddeesscc));;
以下のサンプルでは、2010年5月以前に作成されたレコードを削除しています。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL
create loans (name ECHAR (25, 1), date EDATE (1), amount DOLLAR (6, 1));
登録済みデータ用SQL
insert into loans values('Mosca', '2 February 2010', '150.00');
insert into loans values('Jones', '7 February 2010', '33.95');
54
Empress 導入ガイド
insert into loans values('Kilroy', '16 February 2010 ', '250.00');
insert into loans values('Wladislaw', '27 February 2010 ', '55.00');
insert into loans values('Jones', '3 April 2010 ', '25.00');
insert into loans values('Mosca', '4 May 2010 ', '200.00');
insert into loans values('Wladislaw', '12 May 2010 ', '25.00');
insert into loans values('Peterson', '6 June 2010 ', '50.00');
insert into loans values('Wladislaw', '25 June 2010 ', '75.00');
insert into loans values('Jones', '12 August 2010 ', '300.00');
insert into loans values('Jones', '25 December 2010 ', '100.00');
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
mmrrddeess** loans_tabdesc; /* テーブルディスクリプタ */ mmrraaddeess** date_attrdesc; /* アトリビュートディスクリプタ */
mmrrrrddeess** loans_recdesc; /* レコードディスクリプタ */
mmrrqqddeess** qual; /* クオリフィケーションディスクリプタ */
mmrrrreettrrddeess** retrieve_desc; /* テーブルと条件を関連付けるディスクリプタ */
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt (()))
{
fprintf (stderr, "Unable to initialize Empress\n");
mmsseenndd (()); return 1;
}
/* テーブルを更新モードで開きます */
loans_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""llooaannss"",, ''uu''));;
/* レコードディスクリプタを取得します */
loans_recdesc = mmrrmmkkrreecc ((llooaannss__ttaabbddeesscc));
/* mrngeta関数でアトリビュートディスクリプタを取得します */
date_attrdesc = mmrrnnggeettaa ((llooaannss__ttaabbddeesscc,, ""ddaattee""));
/* mrqcon関数でクオリフィケーションディスクリプタを設定します
検索条件として使用する値「1 May 2010」は外部フォーマット値なので
mrcvt関数で変換します。 */
qual = mmrrqqccoonn ((""<<"",, ddaattee__aattttrrddeesscc,, mmrrccvvtt ((ddaattee__aattttrrddeesscc,, ""11 MMaayy 22001100""))));
/* mrgetbegin関数で検索条件をレコードと関連付けます。 */
retrieve_desc = mmrrggeettbbeeggiinn ((qquuaall,, llooaannss__rreeccddeesscc,, NNUULLLL));
/* mrget関数で各レコードを取得するループを実行します
ここではmrdel関数による削除のみです。 */
while (mmrrggeett ((rreettrriieevvee__ddeesscc)) ==== MMSSMMRR__GGEETT__OOKK)
mmrrddeell ((llooaannss__rreeccddeesscc));
/* mrgetend関数でレコード検索終了します */
mmrrggeetteenndd ((rreettrriieevvee__ddeesscc));
/* mrdelend関数でテーブルからのレコード削除後にクリーンアップ処理を実行します。 */
if (!mmrrddeelleenndd ((llooaannss__rreeccddeesscc)))
{
55
Empress 導入ガイド
fprintf (stderr, "ERROR in writing internal buffers\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* レコードディスクリプタを解放します */
if (!mmrrffrrrreecc ((llooaannss__rreeccddeesscc)))
{
fprintf (stderr, "ERROR in freeing record buffers\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* テーブルをクローズします */
if (!mmrrcclloossee ((llooaannss__ttaabbddeesscc)))
{
fprintf (stderr, "Unable to close the table\n");
fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));
}
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
56
Empress 導入ガイド
7. レコードの更新
テーブルへのレコードを更新するためには、2つのレコードディスクリプタを取得する必要があります。更新前用と更新後
用です。
以下の順番で行います。
1. 新旧データ用レコードディスクリプタを取得します。mrmkrec関数を使用します。
2. 検索条件を設定し、クオリフィケーションディスクリプタを作成します。mrqcon関数を使用します。
3. クオリフィケーションディスクリプタを旧データ用レコードディスクリプタと関連付け、検索ディスクリプタを取得しま
す。mrgetbegin関数を使用します。
4. 検索でヒットしたレコードを取得します。mrget関数を使用します。
5. 1レコード毎に旧データのレコードを新データのレコードにコピーします。mrcopyr関数を使用します。
6. 1レコード毎に新データのレコードに更新するアトリビュートの値を割り当てます。mrputvs関数、mrputi関数、
mrputvi関数を使用します。
7. 1レコード毎にレコードを更新します。mrput関数を使用します。
8. 全てのヒットしたレコードの更新が完了したら、新旧データ用レコードディスクリプタを開放します。mrgetend関数と
mrfreerec関数を使用します。
関数
解説
update文のwhere節に該当するクオリフィケーションディスクリプタを作成します。mrqcon関数を使用し
て、アトリビュート値をファイルフォーマットの定数と比較します。 比較する値は、mrcvt関数で外部
フォーマットからファイルフォーマットへ値を変換して使用します。
[mrqconの使用方法]
qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, &&vvaarr));;
qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg))));;
mrqcon
qual_desc
mrgetbeginで使用されるクオリフィケーションディスクリプタのポインタ
(void*)です。
operator
次に示すいずれかの文字列(const char*)。
">", "<", ">=", "<=", "=", "!=" ("~="は"!="と同義です。)
attr_desc
mrigetaまたはmrngetaから返るポインタ(void*)です。
var
ファイルフォーマットの定数を含む値です。
string
外部アトリビュートフォーマット値のポインタ(const char*)です。
外部フォーマットのアトリビュート値を、ファイルフォーマット(パブリックバッファ)に変換します。
mrcvt
[mrcvtの使用方法]
vvaalluuee == mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg));;
value
ファイルフォーマットのアトリビュート値へのポインタ(void*)です。
attr_desc
mrigetaまたはmrngetaによって返されるポインタ(mrades*)です。
string
外部フォーマットのアトリビュート値へのポインタ(const char*)です。
レコードのアトリビュート値を、旧データ用レコードディスクリプタから新データのレコードディスクリプタ
にコピーします。
[mrcopyrの使用方法]
ffllaagg == mmrrccooppyyrr ((nneeww__rreecc__ddeesscc,, oolldd__rreecc__ddeesscc));;
mrcopyr
flag
関数が成功したかを表示する為の識別子(msbool)です。
new_rec_desc 新たに更新される新データ用として使用するポインタ (mrrdes*) です。
mrmkrecによって返されているものです。
これは old_rec_descとは異なるレコードディスクリプタでなくてはなり
ません。 しかし、同一テーブルから作成されたものであれば、他のどのレ
コードディスクリプタでも構いません。
57
Empress 導入ガイド
old_rec_desc
更新前の旧データ用として使用するポインタ (mrrdes*) です。mrmkrec
によって返されているものです。
以下のサンプルでは、テーブルt1のレコードのうち、s1の値がpeterのものをjulieに更新しています。
mrmkrec関数でレコードディスクリプタを取得しますが、更新前の値と更新後の値を別のレコードディスクリプタに設定
する必要があるため、新旧2つのレコードディスクリプタを取得することです。
今回使用するデータベース
データベース
testdb
テーブル作成用SQL
create table t1(s1 nlschar, s2 nlschar);
登録済みデータ用SQL insert into t1 values('peter', 'tim');
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
int main (int argc, char** argv)
{
mmrrddeess** tab_desc; /* テーブルディスクリプタ */ mmrrrreettrrddeess** ret_desc; /* テーブルと条件を関連付けるディスクリプタ */
mmrrqqddeess** qual_desc; /* クオリフィケーションディスクリプタ */
mmrrrrddeess** old_rec_desc; /* 旧(更新前)データ用レコードディスクリプタ */
mmrrrrddeess** new_rec_desc; /* 新データ用レコードディスクリプタ */
mmrraaddeess** s1_attr_desc; /* アトリビュートディスクリプタ */
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt (())) {
fprintf(stderr, "Unable to initialize Empress\n");
mmsseenndd (());
return 1;
}
/* テーブルを更新モードで開きます */
if (ptrnil (tab_desc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""tt11"",, ''uu''))))
{
fprintf (stderr, "Error:%s (%d)\n", mrerrmsg (), mmrrooppeerrrr);
mmsseenndd (());
return 2;
}
/* mrngeta関数でアトリビュートディスクリプタ(s1用)を取得します */
if (ptrnil (s1_attr_desc = mmrrnnggeettaa ((ttaabb__ddeesscc,, ""ss11""))))
{
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
mmrrcclloossee ((ttaabb__ddeesscc));
mmsseenndd (());
return 3;
}
/* mrmkrec関数で旧データ用のレコードディスクリプタを取得します */
if (ptrnil (old_rec_desc = mmrrmmkkrreecc ((ttaabb__ddeesscc))))
{
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
mmrrcclloossee ((ttaabb__ddeesscc));
mmsseenndd (());
58
Empress 導入ガイド
return 4;
}
/* mrmkrec関数で新データ用のレコードディスクリプタを取得します */
if (ptrnil (new_rec_desc = mmrrmmkkrreecc ((ttaabb__ddeesscc))))
{
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
mmrrcclloossee ((ttaabb__ddeesscc));
mmsseenndd (());
return 5;
}
/* mrqcon関数でクオリフィケーションディスクリプタを設定します(s1 = 'peter') */
if (ptrnil (qual_desc = mmrrqqccoonn ((""=="",, ss11__aattttrr__ddeesscc,, mmrrccvvtt((ss11__aattttrr__ddeesscc,, ""ppeetteerr""))))))
{
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
mmrrffrrrreecc ((oolldd__rreecc__ddeesscc));
mmrrffrrrreecc ((nneeww__rreecc__ddeesscc));
mmrrcclloossee ((ttaabb__ddeesscc));
mmsseenndd (());
return 6;
}
/* mrgetbegin関数で検索条件と旧データ用レコードディスクリプタを関連付けます */
if (ptrnil (ret_desc = mmrrggeettbbeeggiinn ((qquuaall__ddeesscc,, oolldd__rreecc__ddeesscc,, NNUULLLL))))
{
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
mmrrffrrrreecc ((oolldd__rreecc__ddeesscc));
mmrrffrrrreecc ((nneeww__rreecc__ddeesscc));
mmrrcclloossee ((ttaabb__ddeesscc));
mmsseenndd (());;
return 7;
}
/* mrget関数で各レコードを取得するループを実行します */
if (mmrrggeett((rreett__ddeesscc)) ==== 11)
{
/* mrcopyr関数で各レコードの値新データ用のレコードディスクリプタにコピーします */
if (!mmrrccooppyyrr ((nneeww__rreecc__ddeesscc,, oolldd__rreecc__ddeesscc)))
{
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
}
/* mrputvs関数で新データ用のレコードのアトリビュート(s1) に、
外部フォーマットの値「julie」を割当てます。 */
else if (!mmrrppuuttvvss ((nneeww__rreecc__ddeesscc,, ss11__aattttrr__ddeesscc,, ""jjuulliiee"")))
{
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
}
/* mrput関数で、レコードを更新します。 */
else if (!mmrrppuutt((nneeww__rreecc__ddeesscc,, oolldd__rreecc__ddeesscc)))
{
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
}
else
printf ("Record changed\n");
}
59
Empress 導入ガイド
/* mrgetend関数でレコード検索終了します */
if (!mmrrggeetteenndd ((rreett__ddeesscc)))
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
/* mraddend関数でEmpressの内部バッファから、ファイルに書き込みを行います。 */
if (!mmrraaddddeenndd ((nneeww__rreecc__ddeesscc)))
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
/* mrfrrec関数で新旧のレコードディスクリプタを解放します */
if (!mmrrffrrrreecc ((oolldd__rreecc__ddeesscc)))
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
if (!mmrrffrrrreecc ((nneeww__rreecc__ddeesscc)))
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
/* テーブルをクローズします */
if (!mmrrcclloossee ((ttaabb__ddeesscc)))
fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
60
Empress 導入ガイド
トランザクション
トランザクションとは、関連する複数の処理を一つの分割できない処理単位としてまとめたものです。
mrインターフェースでのトランザクションコマンド
mrインターフェースのトランザクションコマンドは、mrtr~から始まる関数です。
関数
解説
トランザクションを開始します。
mrtrstart
[mrtrstartの使用方法]
ffllaagg == mmrrttrrssttaarrtt (());;
トランザクションをコミットし、データベースへの変更を確定します。
mrtrcommit
[mrtrcommitの使用方法]
ffllaagg == mmrrttrrccoommmmiitt (());;
トランザクションをキャンセルし、データベースをトランザクションを開始する前の状態に戻します。
mrtrcancel
[mrtrcancelの使用方法]
ffllaagg == mmrrttrrccaanncceell (());;
トランザクション内にセーブポイントを設定します。
mrtrsave
[mrtrsaveの使用方法]
ffllaagg == mmrrttrrssaavvee ((ssaavveeppooiinntt));;
savepointはセーブポイント名へのポインタ(char*)です。savepoint名は英字で始まる文字列
になります。
セーブポイントまでトランザクションをロールバックします。
mrtrrollback
[mrtrrollbackの使用方法]
ffllaagg == mmrrttrrrroollllbbaacckk ((ssaavveeppooiinntt));;
セーブポイント名が(char*)(" ")の場合、mrtrcancelと同一となります。
サンプル
このサンプルは、transaction_logテーブルを使用して、2013/11/1にJoeが 自分の口座からPennyに40ドル振り込ん
だ、というものです。Joeの口座からお金を引き出しPennyに入金するまでの2つのtransaction_logテーブルへの2件の新
規レコード登録を1つのトランザクションとして行います。
今回使用するデータベース
データベース
testdb
テーブル作成用
SQL
create sequence seq2 startvalue 1;
create table transaction_log(id sequence(seq2), name nlschar, date edate, credit dollar,
debit dollar );
サンプル中で以下のSQLを実行します。
備考
1. insert into transaction_log (name, date, credit, debit) values ('Joe', '20131101', 0, 40);
2. insert into transaction_log (name, date, credit, debit) values ('Penny', '20131101', 40, 0);
##iinncclluuddee <<mmsscccc..hh>>
#define DATABASE "testdb"
61
Empress 導入ガイド
int main (int argc, char** argv)
{
int i;
/* 実行SQL文: この2つをトランザクションで同時処理とします */
char sql[2][200]= {"insert into transaction_log "
"(name, date, credit,debit) "
"values ('Penny', '20131101', 40, 0)",
"insert into transaction_log "
"(name, date, credit,debit) "
"values ('Joe', '20131101', 0, 40)"};
/* mrインターフェースの初期化を行います */
if (!mmssiinniitt(())) {
printf("Unable to initialize Empress\n");
mmsseenndd(());
return 1;
}
/* トランザクション開始 */
if (! mmrrttrrssttaarrtt(()))
{
fprintf (stderr, "mrtrstart failed\n");
fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
mmsseenndd(());
return 2;
}
/* SQL実行 */
for (i = 0 ; i < 2 ; i = i + 1) {
if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,, &&ssqqll[[ii]][[00]])))
{
fprintf (stderr, "mrexecdirect failed\n");
fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
/* トランザクションキャンセル */
if (mmrrttrrccaanncceell(()))
{
fprintf (stderr, "mrtrcancel failed\n");
fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);
mmsseenndd(());
return -1; }
mmsseenndd(());
return 3;
}
}
/* トランザクションコミット */
if (! mmrrttrrccoommmmiitt(()))
{
fprintf (stderr, "mrtrcommit failed\n");
fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()) mmrrooppeerrrr);
mmsseenndd(());
return 4;
}
62
Empress 導入ガイド
printf("success.\n");
/* mrインターフェースのクリーンアップを行います */
mmsseenndd(());
return 0;
}
まとめ
mrインターフェースの詳しい資料は、Empress マニュアルセットの「C/C++API カーネルレベルインターフェース - mr
ルーチン」を参照してください。
性能をアップするためには、適切なデータタイプをご使用ください。高速化するオプションは多数用意していますのでサ
ポートにお問い合わせください。
サポート先は次の通りです。
[email protected]
63
Empress 導入ガイド
第10章 Empressの管理コマンド
Empressでデータベースの管理機能を実行するコマンドです。
empvers
役割
EMPRESS のバージョンを表示する
EMPRESSのインストールキーを更新する (-updatekeyオプション)
EMPRESSのライセンス情報を表示する (-licinfoオプション)
empvers path [option]
使い方 path: Empressのインストールパス
option: -updatekey / -licinfo
empvers
empvers -licinfo
例
empupgrd
役割
使い方
旧バージョンで作成されたデータベースをバージョン 10.20用に変換
empupgrd [-f] database
database:データベース名
例
empupgrd db
注意
バックアップを取ってから行ってください。
データベースに他にアクセスが無いときに実行してください。
データベース上の全てのトランザクションが無効となります。
tabzeroファイルが編集されます。
64
Empress 導入ガイド
第11章 Empress管理API
Empress管理API(Empress Callable Administration API Routine)は管理コマンドをサポートするために実装されま
す。管理コマンドと管理者用APIの関係は以下の表になります。
管理コマンド 管理API
empclean
msdbmaintain
empexpt
msdbexport
empimpt
msdbimport
[シンタックス]
iinntt mmssddbbmmaaiinnttaaiinn
((ccoonnsstt cchhaarr** ddaattaabbaassee,,
cchhaarr**** ttaabblleelliisstt,,
iinntt ooppttiioonn,,
mmssbbooooll vveerriiffyy,,
iinntt** ppssssttaattuuss,,
mmssbbooooll** ffoouunndd__eerrrroorr__aanndd__ffiixx))
[サンプル]
ffllaagg ==mmssddbbmmaaiinnttaaiinn ((ddaattaabbaassee,,ttaabblleelliisstt,,
ooppttiioonn,,
vveerriiffyy,,
ppssssttaattuuss,,
ffoouunndd__eerrrroorr__aanndd__ffiixx));;
msdbmaintain
概略:Empressデータベース保全保証ユーティリティ(断電回復)
msdbmaintainはデータベースの矛盾をレポート、修理します。 不完全なロック、トランザクション、一時ファイル、
コーディネータ情報、および他のデータベースに関する問題を検出解決します。msdbmaintain以下のPHASEで個々の操
作を実行します。
タスク
PHASE オプション
機能
1
MSCLEAN_PHASE_SHM
必要に応じて共有メモリを再生
2
MSCLEAN_PHASE_SCAN_COORD
すべてのクライアントで不適切に終わったものを発
見
3
MSCLEAN_PHASE_SEM
セマフォーをチェック
4
MSCLEAN_PHASE_TRANS
トランザクションを解決
5
MSCLEAN_PHASE_LOCKS
ロックを解決
6
MSCLEAN_PHASE_CHECK_COMPILE_ENTRIES
コンパイルされたデータ辞書RELファイルをチェッ
ク
7
MSCLEAN_PHASE_GEN_COMPILE_ENTRIES
データ辞書のためのエントリーをコンパイル
8
MSCLEAN_PHASE_DICT_FILES
データ辞書REL/DTFファイルのチェック
9
MSCLEAN_PHASE_REBUILD_SYS_INDICES
システム・テーブルにインデックスリストを再生成
10
MSCLEAN_PHASE_RECOMPILE_MISSING_ENTRIES データ辞書のヌルエントリーを再コンパイル
11
MSCLEAN_PHASE_RECOMPILE_ALL_ENTRIES
65
データ辞書におけるすべてのエントリーを再コンパ
イル
Empress 導入ガイド
12
MSCLEAN_PHASE_DICT_TABLES
データ辞書テーブルの一貫性をチェック
13
MSCLEAN_PHASE_DB_CONSISTENCY
データベース・ファイルの一貫性をチェック
14
MSCLEAN_PHASE_TEMP_TABLES
TMP_*_TAB_*テーブルのチェック
15
MSCLEAN_PHASE_REL_DTF_FILES
REL/DTFファイルのチェック
16
MSCLEAN_PHASE_COORD
コーディネータのチェック
17
MSCLEAN_PHASE_CHECK_USER_INDICES
ユーザテーブルにインデックスリストを再生
18
MSCLEAN_PHASE_REBUILD_USER_INDICES
ユーザテーブルインデックスのリビルド
19
MSCLEAN_PHASE_REPLICATION
レプリケーションテーブルのレコードのパージ
20
MSCLEAN_PHASE_TEMP_FILES
テンポラリファイルディレクトリのチェック
21
MSCLEAN_PHASE_IGNORE_COORD
コーディネータとトランザクションロールバックの
無視
msdbmaintainはfull check とquick check の2つのオペレーションモードをサポートします。quick checkは
Phases1、2、3、4、5and16を実行します。
オプションとグループタスク
msdbmaintainのオプションとタスクの一覧表は以下の通りです。
オプション
グループタスク
MSCLEAN_PHASE_IGNORE_COORD MSCLEAN_PHASE_SHM
MSCLEAN_PHASE_SCAN_COORD MSCLEAN_IGNORE_COORDINATOR MSCLEAN_PHASE_SEM MSCLEAN_PHASE_TRANS MSCLEAN_PHASE_LOCKS
MSCLEAN_PHASE_COORD
MSCLEAN_LIGHT
MSCLEAN_PHASE_IGNORE_COORD MSCLEAN_PHASE_SHM
MSCLEAN_PHASE_SCAN_COORD MSCLEAN_PHASE_SEM
MSCLEAN_PHASE_TRANS MSCLEAN_PHASE_LOCKS
MSCLEAN_PHASE_COORD
MSCLEAN_RECOMPILE
MSCLEAN_PHASE_SHM MSCLEAN_PHASE_SCAN_COORD
MSCLEAN_PHASE_SEM MSCLEAN_PHASE_TRANS
MSCLEAN_PHASE_LOCKS
MSCLEAN_PHASE_COORD
MSCLEAN_PHASE_CHECK_COMPILE_ENTRIES
MSCLEAN_PHASE_GEN_COMPILE_ENTRIES MSCLEAN_PHASE_DICT_FILES
MSCLEAN_PHASE_RECOMPILE_MISSING_ENTRIES
MSCLEAN_TABLE_CHECK
MSCLEAN_PHASE_SHM MSCLEAN_PHASE_SCAN_COORD
MSCLEAN_PHASE_SEM MSCLEAN_PHASE_TRANS
MSCLEAN_PHASE_LOCKS
MSCLEAN_PHASE_COORD
MSCLEAN_PHASE_CHECK_COMPILE_ENTRIES
MSCLEAN_PHASE_GEN_COMPILE_ENTRIES
66
Empress 導入ガイド
MSCLEAN_PHASE_DICT_FILES
MSCLEAN_PHASE_REBUILD_SYS_INDICES
MSCLEAN_PHASE_RECOMPILE_MISSING_ENTRIES
MSCLEAN_PHASE_DICT_TABLES
MSCLEAN_PHASE_DB_CONSISTENCY
MSCLEAN_PHASE_TEMP_TABLES
MSCLEAN_PHASE_SHM
MSCLEAN_PHASE_SCAN_COORD
MSCLEAN_PHASE_SEM
MSCLEAN_PHASE_TRANS
MSCLEAN_DATA_CHECK
MSCLEAN_PHASE_LOCKS
MSCLEAN_PHASE_COORD
MSCLEAN_PHASE_CHECK_COMPILE_ENTRIES
MSCLEAN_PHASE_GEN_COMPILE_ENTRIES
MSCLEAN_PHASE_DICT_FILES
MSCLEAN_PHASE_REL_DTF_FILES
MSCLEAN_INDEX_CHECK
MSCLEAN_PHASE_SHM
MSCLEAN_PHASE_SCAN_COORD
MSCLEAN_PHASE_SEM
MSCLEAN_PHASE_TRANS
MSCLEAN_PHASE_LOCKS
MSCLEAN_PHASE_CHECK_COMPILE_ENTRIES
MSCLEAN_PHASE_CHECK_USER_INDICES
MSCLEAN_PHASE_SHM
MSCLEAN_PHASE_SCAN_COORD
MSCLEAN_PHASE_SEM
MSCLEAN_PHASE_TRANS
MSCLEAN_PHASE_LOCKS
MSCLEAN_PHASE_CHECK_COMPILE_ENTRIES
MSCLEAN_REBUILD_USER_INDICES
MSCLEAN_PHASE_GEN_COMPILE_ENTRIES
MSCLEAN_PHASE_DICT_FILES
MSCLEAN_PHASE_RECOMPILE_ALL_ENTRIES
MSCLEAN_PHASE_DB_CONSISTENCY
MSCLEAN_PHASE_COORD
MSCLEAN_PHASE_REBUILD_USER_INDICES
MSCLEAN_REPLICATION_CHECK
MSCLEAN_PHASE_SHM
MSCLEAN_PHASE_SCAN_COORD
MSCLEAN_PHASE_REPLICATION
MSCLEAN_TEMP
MSCLEAN_PHASE_SHM MSCLEAN_PHASE_SCAN_COORD
MSCLEAN_PHASE_SEM MSCLEAN_PHASE_TRANS
MSCLEAN_PHASE_LOCKS MSCLEAN_PHASE_COORD
MSCLEAN_PHASE_TEMP_FILES
MSCLEAN_FULL
MSCLEAN_PHASE_SHM MSCLEAN_PHASE_SCAN_COORD
MSCLEAN_PHASE_SEM MSCLEAN_PHASE_TRANS
MSCLEAN_PHASE_LOCKS MSCLEAN_PHASE_CHECK_COMPILE_ENTRIES
MSCLEAN_PHASE_GEN_COMPILE_ENTRIES MSCLEAN_PHASE_DICT_FILES
MSCLEAN_PHASE_REBUILD_SYS_INDICES MSCLEAN_PHASE_RECOMPILE_ALL_ENTRIES 67
Empress 導入ガイド
MSCLEAN_PHASE_DICT_TABLES
MSCLEAN_PHASE_DB_CONSISTENCY MSCLEAN_PHASE_TEMP_TABLES
MSCLEAN_PHASE_REL_DTF_FILES MSCLEAN_PHASE_COORD
MSCLEAN_PHASE_CHECK_USER_INDICES
MSCLEAN_PHASE_REPLICATION MSCLEAN_PHASE_TEMP_FILES
オプションの解説
各オプションの解説は以下の一覧表の通りです。
オプション
説明
このオプションを選択した場合、MSCLEAN_LIGHTオプションを実行しま
す。死んでいるクライアントが検知された場合、それに関連したロック、クラ
イアントをロールバックします。
MSCLEAN_IGNORE_COORDINATOR 注意:
このオプションはリブートの後、もしくはすべてのEmpressコマンドが実行さ
れる前に実行して下さい。そうでなければ、データベースにダメージを与える
かもしれません。
MSCLEAN_LIGHT
死んでいるクライアントが検知された場合、それに関連したロック、クライア
ントをロールバックします。これはLiveデータベースに対しても実行できま
す。
MSCLEAN_RECOMPILE
このオプションはMSCLEAN_LIGHTのオプションを実行します。 システム辞
書ファイルが構造上、正常か、再構築するか確認します。正常でないと分かっ
た場合システム辞書エントリーをコンパイルします。
注意:
このオプションは静止したデータベースに実行します。
警告:
verifyパラメーターがTrueならば、検証だけが実行されます。
MSCLEAN_RECOMPILE_ALL
MSCLEAN_RECOMPLIEに関連した過程をすべて実行します。同時にデータ
辞書中の無効のエントリーを再コンパイルします。もしくはデータ・ディク
ショナリー中のエントリーをすべて再コンパイルします。システム辞書ファイ
ルのコンパイルファイルの状態に関わらずシステム辞書ファイルを再コンパイ
ルします。
注意:
このオプションは静止したデータベースに実行します。
警告:
確認パラメーターがTrueならば確認過程だけが実行されます。
MSCLEAN_TABLE_CHECK
システムテーブルの構造および内容の確認。もしデータベースでDDLオペレー
ションを行なっており、そのデータベースが、このオペレーションに中に電断
が発生した場合はこのオプションを使用します。
注意:
このオプションは静止したデータベースに実行します。
警告:
verifyパラメーターがTrueならば、システムテーブルの構造確認のみします
が、修正はしません。
MSCLEAN_DATA_CHECK
物理的データベースファイルの構造が正確かどうか確認します。
警告:
verifyパラメーターがTrueならば、データ構造の確認はしますが、修正は実行
されません。
tablelistパラメーターがセットされた場合テーブルに関連したデータ構造だけ
がチェックされます。
68
Empress 導入ガイド
verifyパラメーターがTrueで、tablelistがNULLでない場合、tablelistパラ
メーターで見つかったテーブルに関連したデータ構造だけがチェックされ修正
はされません。
このオプションがチェックされた場合、すべてのインデックスが必要に応じ再
作成します。インデックスは確認しますが、データの各キーの確認は実行しま
せん。
MSCLEAN_INDEX_CHECK
警告:
verifyパラメーターがTrueならば、インデックスを単にチェックします。.
tablelistパラメーターがセットさると、リストで見つかったテーブルに関連し
たインデックスだけをチェック、リビルドします。
verifyオプションがTrueならば、インデックスはチェックしますがリビルドし
ません。
このオプションを選択した場合、ユーザインデックスはすべてリビルドされま
す。
MSCLEAN_REBUILD_USER_INDICES
警告:
verifyパラメーターがTrueならばインデックスはリビルドしません。
tablelistパラメーターがセットするとリストされたテーブルに関連したイン
デックスだけをリビルドします。
MSCLEAN_REPLICATION_CHECK
レプリケーションでロジカル的に削除がマークされたレコードは削除されま
す。
MSCLEAN_TEMP
MSCLEAN_LIGHT過程をすべて実行し、Empressのテンポラリディレクトリ
あるファイルも削除されます。
MSCLEAN_FULL
フェーズ18を除いてすべての過程を実行します。このオプションは、データ
ベースのチェック、確認および修正フェーズを実行します。
注意:
このオプションは静止しているデータベースに実行します。
tablelistパラメーターはセットされた場合、リストされたテーブルに対して実
行されます。
verifyパラメーターがTrueならば、各過程の確認部分だけを実行します。
msdbexport
概略:Empressデータベースのエクスポート
msdbexportはEmpressデータベースからテーブルをエクスポートします。「テーブル」入力のパラメータは、エクス
ポートするテーブルを指定します。テーブルを指定しない場合は、データベースのすべてのテーブルをエクスポートしま
す。各テーブルでインデックスリスト、ロックレベル、コメント、レンジチェック、および特権情報をエクスポートしま
す。
アウトプットは指定された“outfile” に記述されます。EMPRESSがテーブル定義をエクスポートするためには"display"特
権を持たなければなりません。"display" "select"特権でデータをエクスポート可能です。
msdbpimpt
概略:Empressデータベースのインポート
msdbimportはEmpressデータベースにテーブルをインポートします(データベースは既に存在しなければなりません。
データベースは、empmkdbを使用するか、またはCREATEDATABASE SQLコマンドで作成可能です。
msdbexportかempexpt(データベースエクスポートファイル)の形式でインポートされるデータフォーマットが存在しま
す。“infile”という入力ファイルにすべてのテーブルがインポートされます。
データ辞書テーブルに関するデータをインポートすべきではありません。 インポートするコメントとロックレベルは、既
存のコメントとレベルをロックを変更し、システム・テーブルに既に存在しているインデックスをインポートすると誤り
69
Empress 導入ガイド
を引き起こします。
インポートされたテーブルは、データベースディレクトリで作成されプログラムを実行するユーザによって所有されていま
す。
テーブルをインポートするためには、“sys_tables”に“insert” 特権を持たなければなりません。インポートされるべき
テーブルがすでに存在しているならそれらのテーブルに対しても"insert" 特権を持たなければなりません。
70
Empress 導入ガイド
第12章 データベース設定
Empressはデータベースの動作を次の設定ファイルで制御します。設定を変更するには、設定ファイルに設定項目を追加
します。変更するときには、データベースにアクセスの無い状態で行ってください。
通常、Empressの設定ファイルは変更の必要はありません。基本的には初期状態のままご使用いただくことをお勧めして
います。リソースが制限された環境の場合は設定変更が必要な場合があります。詳しくはサポートにお問い合わせくださ
い。
initfile.txt
データベースエンジンに関連する設定ファイルです。ファイルはEmpressのインストールディレクトリ内の/config
/initfile.txtです。
ユーザにEmpressデータベースエンジンの動作に対するコントロール権を与えます。
※ オペレーティングシステム、Shellのリセットされた値は、initfileの中のセッティングを無視します。
※ そのオペレーティング・システム、Shellの範囲においてのみ有効です。
tabzero.txt
データベース毎の設定を行うファイルです。データベースのディレクトリ内に存在します。
[tabzeroファイル内のパラメータの変更方法例]
eemmppaaddmm tteessttddbb ttaabbzzeerroocchhaannggee MMSSDDBBIIDD ''mmaasstteerr__ddbb''
ここではデータベース「testdb」の MSDBID(データベースID名)を'master_db'に変更しています。
良く使う設定
次の表は、良く使用される設定項目です。
設定項目
内容
設定ファイル
MSVALSEP
データをファイルにダンプするとき、データを一括登録するときにアトリビュートの区切
り文字を設定するのに使用します。
initfile
MSDBID
データベースIDが定義されています。レプリケーション設定で使用されることが多い項目で
tabzero
す。
一時的な設定方法
開発時などに一時的に設定を変更するにはSETコマンドを使用します。SETコマンドは現在の設定を確認する場合にも使
えます。
C:\Empress>empsql sample01
EMPRESS V10.20
(c) Copyright Empress Software Inc. 1983, 2013
1* set; ← 現在SETコマンドで指定した設定の一覧を確認しています。
2* set MSVALSEP ','; ← MSVALSEPの値をカンマに設定しています。
3* set; ← 現在SETコマンドで指定した設定の一覧を確認しています。
MSVALSEP=, 次の行に設定内容が表示されています。
71