C言語に変換できるDeviceSQLによるプログラミング―― テーブルへの挿入と検索使って覚える
組み込みデータベース入門（前編）

近年の組み込みシステムでは，大容量データを扱う需要が増えている．本稿では，組み込みシステム向けのデータベースを使ったプログラミング手法について解説する．ここで取り上げる DeviceSQL 言語は C 言語への変換を前提とするなど，組み込みシステムとの親和性が高い．DeviceSQL の評価版はhttp://www.encirq.co.jp/からダウンロードできる． （編集部）

高橋 君夫

このように，多くの組み込みシステムにおいて「データを効率良く扱う」ことが要求されています．その一つの方法として，データベース・ソフトウェアを活用するユーザが増えています．これまでなかなかデータベースが組み込組み込みシステム開発において，製品の世代交代ととみシステムの世界で日の目を見なかったのは，「限られたもにアーキテクチャを一新し，すべてを新規に作り直す資源と低消費電力」という制約のためだと思います．実際ことがあります．そのような場合，今後の何世代かの間に採用を検討しようと思っても「フットプリントが何 M バに陳腐化しない製品アーキテクチャの検討や，開発コスイト」というようなスペックを見た瞬間，採用の候補からトを低く抑え，効率良く開発するための検討が必要にな外れてしまってもおかしくありません．しかし，ここ数年，るでしょう．

データベース・ベンダ各社の努力もあって「限られた資源」● カーナビなどではデータベース搭載が標準というハンデの中でも高速に動作する，組み込みアプリ

最近の組み込みシステムでは，より高度な機能が求めらケーションに特化したデータベースが登場しています．つれています．一つの例として，ハード・ディスク装置

まり，数十 K バイトから 100 数十 K バイトでなおかつ 16（HDD）内蔵カー・ナビゲーション・システムを考えます．

ビット CPU でも動作するようなデータベースです．

最近のカーナビは，当たり前のように CD から音楽を録音

本稿ではそのような組み込み向けデータベースを使用しでき，アルバム名やアーティスト名，曲名などの情報も自た簡単なデータベース向けプログラムの書き方と，それを動的に保存されます．ユーザは録音された曲を「アルバム」応用したサンプル・プログラムを紹介していきたいと思いや「アーティスト」，「ジャンル」などのキーワードで選ぶます．

ことができます．これらの機能を C 言語でゴリゴリ書いていくのは，正直なところかなり大変です．このようなコンシューマ製品で，なおかつ「検索」が必要なアプリケーションでは，確かにデータベースが必要です．

● FA 機器などの分野でもデータベースを使用

さて一口にデータベース・プログラミングといっても，ここのところ大きく変化しているのが，FA（Factory

大ざっぱに SQL をベースとするものと，まったく独自 API

Automation）など，非常に伝統的な組み込みシステム分野で記述するものの 2 種類があります．さらに SQL ベースです．近年の FA 関連装置では，単にデータをロギングするのものでも，SQL 文を API 経由で C アプリケーションかだけでなく，そのデータを分かりやすく活用できるようにしらデータベース・サーバに問い合わせるもの，手続き型たいという要望が高まっています．さらに，「このデータがSQL 言語を使用し，データ・アクセスをプロシージャとし取れるなら，関連してこれも…」というようなユーザ要求て処理するものなどに分類できます．そのような中で，今の増加により，「さすがに自分で一から構築するのは無理」

回はより C 言語から利用しやすい手続き型 SQL 言語であという話が増えています．

る Encirq 社の DeviceSQL 言語を利用し，いかにアプリ

Oct. 2007

KEYWORD ―― DeviceSQL，SQL 言語，C 言語への変換，データの挿入，データの検索155

DeviceSQL
ケーションからデータベースを使うかを説明します．

出発しています．つまり手続きを踏むことが可能な SQL● データベース記述言語 DeviceSQL は PL/SQL 由来

言語なので，簡単な SQL 文の組み合わせで，複雑な検索

DeviceSQL Language（ 以下，DeviceSQL）は Oracle 社を行うことが可能です．つまり「これから SQL を学んでみの PL/SQL をベースとしたデータベース記述言語です．

よう」という方にとって敷居の低い言語といえます．

SQL の良いところは，高度な検索を一つの SQL 文で処理

● DeviceSQL コンパイラを通じて C 言語に変換するできるという点ですが，SQL 単体は手続き型の言語ではな

今回使用する Encirq 社の DeviceSQL 環境では，Device

いため，ある SQL 文の結果を次の SQL 文の入力には使用

SQL 言語で記述したソース・コードは，DeviceSQL コンパできません．そのため，必然的に複雑な検索を行おうとすイラを通じて C 言語に変換し，コンパイル・リンクを行っると，SQL 文そのものが複雑になっていきます．て実行形式を作成します．この過程で SQL 文は Device

これに対して PL/SQL を基とする DeviceSQL はスト

SQL Framework が提供するライブラリ・コールに変換さアード・プロシージャ，つまり関数を記述する言語としてれます．このため，SQL 文を実行時に解釈するオーバヘッドがなく，ごく簡単な「SELECT *FROM table WHERE

リスト 1 DoNothing.epl
リスト 2 DoNothing.c

CREATE PROCEDUREDoNothingAS
EXPORT NAME "db_DoNothing";
BEGIN

void DoNothing(void){}END;/

リスト 3 InsertData.epl--**********TABLE CREATES**************************-- SQL 文でエラーが起きた場合は例外となり，こちらの例外-- ハンドラで処理を行う．この例では特に SQL エラー・コードに-- 合わせた処理は行わず，一律にエラーとして-1 を返している

CREATE TABLE UserTable(UserID
LONG,
Name
VARCHAR,AgeSHORT);/--**********

IMPORTED FUNCTIONSRETURN 0;

EXCEPTION
RETURN SQLCODE;
END;/*******************-- c_Print の実態は C 言語側で実装されており，それをインポート-- する
CREATE PROCEDURE c_Print (msg IN VARCHAR)ASIMPORTNAME "c_Print";/CREATE FUNCTION InsertData ( lUserID IN LONG, vName IN VARCHAR,sAge IN SHORT)
RETURN LONGAS
EXPORT NAME "db_InsertData";
BEGIN-- 年齢が 0 歳未満，150 歳より上であれば，-- 不正データとしてエラーを返す
IF (sAge < 0) OR (sAge > 150) THEN

CREATE FUNCTION GetRecordById (lUserID IN LONG)
RETURN LONGAS
EXPORT NAME "db_GetRecordById";-- ローカル変数は AS-BEGIN 間で定義する
vName VARCHAR;
BEGIN-- DeviceSQL ではローカル変数に検索した値を保持することができる
SELECT Name INTO vName FROM UserTable WHERE UserID =lUserID;-- C 言語で記述した関数を呼び出すことが可能なため，プリント文だけで-- なく，データにフィルタ処理をかけるなど，既に開発-- 済みの C 言語の資産を利用できる．
-- また，既存のデータで DB にデータがないものでも，インポート-- 関数を通じてデータの取得や保存が可能であるため，DB だけで-- なく，システムのデータ全体を DeviceSQL で記述できる

RETURN -1;
c_Print(vName);
ELSE
RETURN 0;-- テーブルへのレコードのインサート
INSERT INTO UserTable VALUES (lUserID, vName, sAge);END IF;

156

EXCEPTION
WHEN OTHERS THEN
RETURN -1;
END;/Oct. 2007