オブジェクト指向、Javaを取り入れた
新しい業界標準「SQL99」詳細解説

第一章 高度なデータ操作(1)

第一章では、SQL99の概要を説明するとともに、再帰SQLやOLAPなど、新しく可能になった高度なデータ操作を中心に紹介する。

SQL99の背景と特徴

 1999年5月に島根県松江市の「くにびきメッセ」において、データベース分野の標準化についての重要な国際会議が、情報処理学会の主催で開かれた。

 この会議では、情報処理分野で最も成功した国際標準(International Standard)の1つと言ってよいSQL言語が、SQL92版の制定から約7年の歳月をかけて大幅に改訂され、3世代目にあたる次期SQL標準の主要部分(表2を参照)を最終的に国際標準とすることが確認されたのである。新しいSQL標準はそれまでコード名「SQL3」と呼ばれていたが、1999年度版を意味する「SQL99」として1999年内にもISO(国際標準化機構)/IEC(国際電気標準会議)によって制定される見込みである。ISOのSQL標準は、同じ内容で米国のANSI SQLとして制定され、我が国でも同様にJIS SQLとして制定されることになっている。


図1 SQL99の発展と範囲

 これまでのSQL92は、リレーショナルデータベースのための完全な言語になることを目指した大変意欲的な言語であった(表1)。

 SQL99はSQL92を基盤とし、さらに機能拡張を行うべく、米国や日本などのDBMS製品を開発・販売している主要国が中心になって標準化作業が進められた。現時点では、すでにオブジェクト指向がプログラミング言語の分野で大きな成功を収めていたことと、リレーショナルデータベースを批判する立場のオブジェクト指向データベースの研究が盛んであったことが背景になって、リレーショナル機能の拡張だけでなく、オブジェクト指向の考え方をSQLに取りいれる努力と検討が重ねられた。

 仕様開発を実際に行っている標準化委員会(実際、標準化委員会は、リレーショナルの枠にとらわれないように「データベース言語」委員会と名づけられていた)の委員は、米国や日本などの主要なDBMS製品のベンダーから送り込まれているのだが、互いに日々、開発や販売競争にしのぎを削っているだけに利害の衝突が激しい。リレーショナルデータベースのために開発したはずのSQLに、表現能力に優れているが単純で簡潔なSQLの良さを生かしながらどのようにオブジェクト指向を導入するのかについて繰り返し仕様案が検討された。仕様の確定には困難を極め、長い議論と調整を経て、ようやくオブジェクトリレーショナル技術として仕様が具体化し、各国およびベンダの間で合意に到達したのである(結果として、SQL99はSQL92をページ数で大幅に上回る規格になる見込みである)。

表1 国際標準SQL言語の歩み。参考までに掲載したSQL89の規格文書のページ数と比較しても、SQL99の仕様の規模がうかがえる
国際規格
制定年度
国際標準規格 ページ数
1987年

SQL86

  • DML文
    COBOL、FORTRAN、PL/Iなど、親言語への埋込みSQL文
 
1989年

SQL89

  • スキーマ定義言語を追加(CREATE TABLE文、CREATE VIEW文、GRANT文。ただし、DROP文、ALTER文、REVOKE文はなし)
  • 整合性機能を追加(DEFAULT、UNIQUE、NOT NULL、PRIMARY KEY、CHECK句、参照整合性)
  • C言語への埋込みSQL文
120
1992年

SQL92

  • 直交性の改善(表式)
  • データ型の拡張(可変長、ビット、文字集合、日付・時刻・時間間隔)
  • 外結合(アウタージョイン)
  • 定義域(ドメイン)
  • 表明(アサーション)
  • 一時表
  • スキーマ操作言語の追加(DROP文、ALTER文)
  • 動的SQL
  • スクロール可能カーソル
  • クライアント/サーバのためのCONNECT文
622
1995年

SQL/CLI(コールレベルインタフェース)

  • 業界標準ODBCインタフェースに相当する機能を国際標準化した規格
200
1996年

SQL/PSM(永続格納モジュール)

  • 一般にストアドプロシージャと呼ばれる機能を国際標準化した規格
250
1999年〜2000年 SQL99 >1700

CLI: Call Level Interface
PSM : Persistent Stored Module


SQL99の主な機能強化

 SQL99は、時代の要請にしたがって次のような狙いで機能を強化している。

  1. リレーショナルモデルの表現能力をより一層高める
  2. オブジェクト指向の考え方を取り入れたオブジェクトリレーショナル技術を具体化する
  3. インターネットやJavaの普及に対応したクライアント/サーバ機能を機能強化する
  4. SQL/MMに代表される、SQL99を基盤としたアプリケーションパッケージの開発を促進する

 上記の目標を実現するための、主な機能の概要を説明していこう。

■スキーマ定義の新機能

  • 新しい組込みデータ型
    真理値(BOOLEAN)型と配列(ARRAY)型が追加された。
  • LOB型
    長大なマルチメディアデータやテキストデータを格納できるLOB型を追加した。プログラムの中で入出力域に収まらないような大きなLOBデータを扱うためのロケータを提供する。
  • ユーザー定義型
    標準で提供される組込みデータ型をもとにしてユーザーが自由なデータ型を定義できる。
  • 構造型
    ユーザー定義型の機能を使って、構造をもった型を定義できる。構造型を1つの行として扱う行型と、その行を直接参照する参照型とがある。構造型は、オブジェクト指向でいうところのオブジェクトとして扱うことができ、オブジェクトの中に別のオブジェクトを格納するような複合オブジェクトも定義可能である。
  • ユーザー定義関数
    ユーザー定義の型に付随して、SQL文中に呼び出すことができる関数を定義できる。また構造型にはメソッドを定義できる。そのメソッド中の内部変数などの実装方法は隠蔽されてカプセル化されている。
  • スーパーテーブルとサブテーブル(上位表と副表)
    構造型で定義した表を上位表として、副表を定義することができる。副表は、上位表のすべての型とメソッドを継承する。必要であれば、上位表のメソッドを自分のメソッドでオーバーライドもできる。

■データ操作と演算子の新機能

  • 共通表式 WITH句
    SELECT文に現れるほかのSELECT文を、WITH句に記述することによって簡潔な表現ができる。
  • 再帰SQL
    部品構成表のように深さが不定な階層構造にあるデータを1個のSQL文で取り出すことができる。
  • OLAP
    多次元データベースを対象にしたドリルダウンやロールアップなど、OLAPの基本的な分析処理を効率的に行うための集約機能を提供する。
  • ユニオン・結合経由の更新
    ユニオン(UNION)や結合(JOIN)を含むビュー(視点)に対して、更新操作が可能になった。
  • カーソル操作の機能強化
    カーソルがオープン中にコミット文を発行してもカーソルの位置づけを保持できるので、カーソルを再オープンすることなくFETCH文を継続することができる。

■整合性の新機能

  • トリガ
    表に対する更新操作を要求したことを引き金(トリガ)として、あらかじめ定義しておいた別の表を更新するようなSQL文やSQLルーチンを自動的に起動させることができる。その表に付随したビジネスロジックをDBMSに格納する(カプセル化)ことによって、データとプログラムの独立性を高めることができる。

■セキュリティ(機密保護)の新機能

  • ユーザー定義の役割(ロール)
    ユーザーや管理者の仕事の役割に応じた権限の集まりに役割名を付けられるので、権限の付与と剥奪の操作性が向上する。

■トランザクション管理の新機能

  • セーブポイント
    更新トランザクションがその処理中にセーブポイントとして宣言した任意の時点までロールバックすることができる。

■クライアント/サーバの新機能

  • ストアドプロシージャ
    PSM(永続格納プロシージャ)規格によってすでに可能となっている。ストアドプロシージャそのものは、クライアント/サーバ環境での通信メッセージを軽減することによるクライアント性能の向上技術として実績がある。標準に関して重要なのは、変数の宣言やIF文やLOOP文などの手続き文をサポートするので、既存のプログラミング言語に依存しない、プラットフォームにも依存しないプロシージャを開発でき、CALL文で呼び出すことができるようになった点にある。これらの構文はユーザー定義関数やメソッドの中でも使用することができる。
  • SQLJ
    Javaプログラムに埋込むための静的SQLをサポートする。すでに業界標準になりつつあるSQLJを国際標準化しようとしている。従来のCLIやODBCが要求するSQL文は、サーバで動的SQLとして実行されるのでサーバの負荷が大きいという問題があったが、SQLJはサーバの負荷が小さい静的SQLとして実行できるので、大量のユーザーの処理やトランザクション処理に適している。

 以下では、こうしたSQL99に追加された新しい機能について、それぞれ詳しく紹介していくことにしよう。SQL99の構文がどうなったか、というよりも、新しいSQL99の機能によって、どのようなことができるようになるのかに焦点を絞って説明を進めて行きたいと思う。


表2 SQL99とSQL/MMの標準化予定
規格
標準化時期(見込み)

SQLフレームワーク

  • 標準化文書の構成や準拠について規定する。
1999年12月

SQLファウンデーション (備考1)

  • SQLの基本機能を規定する。
1999年12月

SQL/CLI

  • 既存規格をSQL99に対応させる。
2000年

SQL/PSM

  • 既存規格をSQL99に対応させる。
1999年12月

SQL言語バインディング

  • プログラミング言語に埋め込むSQL文を規定する。
1999年12月

SQL/MED(外部データ管理)

  • 非リレーショナルデータ(順次ファイルや階層型データベースなど)や他社のリレーショナルデータをSQLでアクセスするための規格。
2000年

SQL/OLB(オブジェクト言語バインディング)

  • SQLJを標準化する。Javaプログラムに埋め込むSQL文を規定する。
2000年

SQL/MM(マルチメディア)

  • フレームワーク
  • フルテキスト
  • スペーシャル(空間データ)
  • 静止画像
2000年

備考1:SQLファウンデーションだけで約900ページある。SQLフレームワーク、SQL/CLI, SQL/PSM、SQL言語バインディング,SQL/MED,SQL/OLBまでを加えると1700ページを超える見込みである。

とびら 新しい業界標準「SQL99」詳細解説

第一章 高度なデータ操作

SQL99の背景と特徴
SQL99の主な機能強化
  スキーマ定義の新機能
  データ操作と演算子の新機能
  整合性の新機能
  セキュリティ(機密保護)の新機能
  トランザクション管理の新機能
  クライアント/サーバの新機能
高度なリレーショナル操作
  共通表式 WITH句
  再帰SQL
OLAPによる分析手順
  ROLLUP
  CUBE
  GROUPING SETS
ユニオン(UNION)経由の更新
  結合(JOIN)経由の更新


第二章 柔軟さを増したデータ構造

ユーザー定義可能な新しいデータ
  新しい組込みデータ型
  真理値型(BOOLEAN型)
  配列型(ARRAY型)
LOBとは
  LOBデータ型の定義
  LOBデータ型の取り扱い
  LOBロケータの使用
  HOLD LOCATORとFREE LOCATOR
  LOBの挿入(更新)と検索方法の拡張
ユーザー定義型
  ユーザー定義DISTINCT型
ユーザー定義関数
関数のオーバーロード

オブジェクトリレーショナル
  ユーザー定義構造型と列オブジェクト
  ユーザー定義構造型と行オブジェクト
副表(サブテーブル)と継承(インヘリタンス)
  副型を持つ列オブジェクト
  行オブジェクトと経路式
オブジェクトビュー
トリガ


第三章 SQLJと今後の標準化動向

クライアント/サーバ環境のための機能強化
  ストアドプロシージャ
  新しいプロシージャ言語
静的埋め込みSQLを実現する「SQLJ」
  パフォーマンスの向上と移植性
  SQLJのコンパイル
  SQLJの記述方法
  SQLJ 対 JDBC
  イテレータの使用
  SQLデータ型としてのJavaクラス
オブジェクトリレーショナル機能の応用例
  SQL/MM全文検索(フルテキスト)
  SQL/MM地理情報(スペーシャル)
今後のSQL標準化動向
  コレクション型の拡張
  オブジェクトリレーショナル機能の拡張
  SQL/MED
  OLAP機能の拡張
  自由度が高まるデータアクセス


「Master of IP Network総合インデックス」


Master of IP Network フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Master of IP Network 記事ランキング

本日 月間