続いてHyperSQL 2.0での新機能のうち、特に使い勝手に影響するものピックアップして紹介していく。2.0での新機能の詳細なリストはこちらを参照してほしい。
SQL標準への準拠
SQLパーサなども大幅なリライトが行われており、ANSI-92 SQLのほぼすべてと、SQL:2008の多くをサポートするようになった。これによってBETWEENやMERGE文などが利用できるようになった。また、BIT、BLOB、CLOB、INTERVALなどSQL標準で定義されているデータ型や、SUBSTRINGやTRIMなどの標準的な関数も追加されている。
配列型
データ型として配列型が利用できるようになった。以下に配列型を使用したテーブル定義の例を示す。
CREATE TABLE CONTACT_LIST (
ID INT PRIMARY KEY,
NAME VARCHAR(100) NOT NULL,
MAILS VARCHAR(100) ARRAY[10])
このテーブルにレコードをインサートするには以下のようにする。
INSERT INTO CONTACT_LIST VALUES
(1, 'Naoki Takezoe',
ARRAY['takezoe@gmail.com', 'takezoe@example.com']);
トリガー
HyperSQL 2.0ではトリガーもサポートされている。以下にトリガー定義の例を示す。
CREATE TRIGGER INSERT_USER_INFO AFTER INSERT ON USER_INFO
FOR EACH ROW
UPDATE USER_INFO SET FULL_NAME = FIRST_NAME + ' ' + LAST_NAME
ストアドファンクション
これまではJavaで実装したstaticメソッドをSQLから呼び出すことはできたものの、いわゆる一般的なストアドファンクション/プロシージャはサポートされていなかった。HyperSQL 2.0ではSQL/Javaによるストアドが利用きるようになった。
以下はSQLによるストアドファンクションの定義例だ。このストアドファンクションは引数に渡した時間から-1時間した値を返す。
CREATE FUNCTION AN_HOUR_BEFORE (T TIMESTAMP)
RETURNS TIMESTAMP
RETURN T - 1 HOUR
この関数はSQLの中で通常の関数と同じように利用することができる。
SELECT
AN_HOUR_BEFORE(EVENT_TIMESTAMP) AS NOTIFICATION_TIMESTAMP,
EVENT_NAME
FROM EVENTS
ストアドプロシージャ
ストアドプロシージャの例も見てみよう。
CREATE PROCEDURE NEW_USER_INFO
(FIRST_NAME VARCHAR(100), LASTS_NAME VARCHAR(100))
MODIFIES SQL DATA
INSERT INTO USER_INFO
VALUES (DEFAULT, FIRST_NAME, LAST_NAME)
上記のストアドプロシージャは以下のようにして呼び出すことができる。
CALL NEW_USER_INFO('Naoki', 'Takezoe');
ここでは取り上げないが、ストアドファンクション/プロシージャはJavaで実装することも可能だ。複雑な処理や、外部リソースを使用するストアドを実装することができるだろう。
まとめ
HyperSQL 2.0は5年の開発期間を要しただけあり、新機能満載のリリースだ。HSQLDBはJavaにおける高速な組み込み/軽量データベースとして定評のあるプロダクトではあるが、近年はApache DerbyやH2など機能面で勝る競合プロダクトが多く登場し、それらの影にかくれがちだった面もある。今回のリリースによってHyperSQL 2.0が再び軽量Javaデータベースの主役に躍り出るかもしれない。