オブジェクト指向、Javaを取り入れた
新しい業界標準「SQL99」詳細解説
第三章 SQLJと今後の標準化動向(1)
第三章では、ついにSQLの仕様の一部として採用されたJavaによるサーバプログラミングや、画像や音声なども格納可能なLOB型やユーザーが定義可能なデータ型、そしてオブジェクト機能など、新しいデータ構造を中心に解説するクライアント/サーバ環境のための機能強化
■ストアドプロシージャ
ストアドプロシージャは、クライアント/サーバ環境のクライアントがサーバに存在するデータベースを効率よくアクセスするための技術として、すでに多くの製品で実装されている。ストアドプロシージャを使用した場合は、クライアントプログラムからはストアドプロシージャの呼び出しだけになるので、次のような性能上の効果がある。
- 通信回数が減る。
- 通信データ量が減る。
これらの効果によってクライアントプログラムの経過時間が短縮し、通信プロトコル変換処理にかかるプロセッサ負荷の削減ができるのである。
またストアドプロシージャは、データベースサーバ側に格納されるので一元管理に適し、アプリケーションプログラムの部品化と流通を促進する技術としても注目された。しかしストアドプロシージャは製品固有の機能として開発されたので、ベンダ間の移植が事実上困難であるという問題があった。そこでSQL標準は、この問題を解決するために、1996年にストアドプロシージャの内部に書ける構文をプロシージャ言語として標準化し、そしてSQL99がストアドプロシージャを定義するCREATE PROCEDURE文とクライアントプログラムからストアドプロシージャを呼び出すCALL文を正式にサポートすることになったのである。 そのプロシージャ言語とはどのようなものかを簡単に説明したい。
■新しいプロシージャ言語
従来のSQL92では、埋め込みSQL文を含んだアプリケーションプログラムの構造は、アプリケーションロジックとデータベースをアクセスするSQL文とを明確に分離することを主な目的としていて図2のような構造を想定していた。
図31 SQL92が想定していたアプリケーションプログラムの構造
SQL文を含むプログラム(図31の右側)の中に記述する構文を特に、モジュール言語と呼んでいて、モジュール言語を実際にどのように既存のプログラミング言語に対応させるかは実装に任されていて、モジュール言語で記述したプロシージャを内部プロシージャとして呼び出すか外部プロシージャとして呼び出すかも、実装に任されている。このプログラム構造の特徴は、プロシージャの開発および呼び出し方が使用するC言語やCOBOL言語などのプログラミング言語の構文に従うので、結果としてそれらのプログラミング言語の稼動環境や言語仕様に依存することになり、特にクライアント/サーバ環境では、標準が目指すSQLアプリケーションの移植性に欠けるという問題があった。
そこでアプリケーションロジックとSQL文を含むプロシージャのための新しいプロシージャ言語が開発されて、永続格納モジュール(PSM、Persistent Stored Module)と呼ばれる規格にまとめられた。言い替えれば、このプロシージャ言語は、第2章で紹介した「SQLルーチン」と総称して呼ばれる次の3種類のプログラムを記述するための、SQLルーチン専用のプロシージャ言語である。
- ストアドプロシージャ
- ユーザー定義関数
- ユーザー定義メソッド
まず上記のSQLルーチンを定義する文の基本型を図32に示す。
図32 SQLルーチンの呼び出し。SQLルーチン定義文とプロシージャ言語の関係
ストアドプロシージャと、ユーザー定義関数およびユーザー定義メソッドとの主な相違点は、出力パラメータの個数である。ストアドプロシージャは任意の個数の出力パラメータを定義できるのに対して、後者は関数あるいはメソッドの戻り値としてただ1個を指定する。<ルーチンボディ>の場所には、プロシージャ言語を記述するか、次のようなEXTERNAL句によってDBMS管理外のC言語やCOBOL言語で開発した外部ルーチンを参照することができる。
EXTERNAL NAME 外部ルーチン名 |
ルーチンボディには、プロシージャ言語として埋め込みSQL文を記述することができるだけでなく、SQL99では新たに表5に掲げたような文を記述することができる。表5を見てわかるように、まさにプログラミング言語としてロジックの流れを制御することができる。その意味でSQLのプロシージャ言語はまさに手続き言語なのである。
備考:SQLプロシージャ言語だけでアプリケーションを記述できることを目標にしている。その意味でSQLは計算完備な言語を目指していると言える
表5 SQLプロシージャ言語の拡張
複合文 | BEGIN ...END; |
変数宣言 | DECLARE 変数 CHAR(6); |
IF文 | IF 変数<>'SQL' THEN ... ELSE ... END IF; |
CASE文 | CASE 変数 WHEN 'SQL' THEN ...ELSE .... END CASE; |
LOOP文 | LOOP <SQL文のリスト> END LOOP; |
WHILE文 | WHILE i<100 DO ... END WHILE; |
REPEAT文 | REPEAT ... UNTIL i<100 END REPEAT; |
FOR文 | FOR 結果 AS ... DO ... END; |
LEAVE文 | LEAVE ラベル名 ; |
RETURN文 | RETURN 戻り値; |
CALL文 | CALL プロシージャ名(引数1,引数2,引数3); |
SET文 | SET 変数='abc'; |
SIGNAL文 | SIGNAL 条件名 ; |
複合文は、BEGIN文とEND文との間にはさまれたSQL文をシリアルに実行するが、それにはデータ定義文(例:CREATE TABLE文など)、データ操作文(例:SELECT文など)、動的SQL文、表5の様々な制御文および条件文を記述できて、次のような構造をしている。
ラベル名: BEGIN [ATOMIC | NOT ATOMIC] |
ここで上記の例でBEGIN文のATOMICオプションを指定したとき、処理が途中で失敗した場合はINSERT文とUPDATE文の更新がロールバックされるが、もしNOT ATOMICオプションを指定してUPDATE文が失敗したときはUPDATE文の更新だけがロールバックされる。
ローカルハンドラ宣言は、例外処理のときに制御を受けるためのものである。次の例は重複キー違反が起きたとき、更新処理を元に戻してハンドラ宣言に記述した複合文を実行することを指定している。
DECLARE dup_key CONDITION |
また、宣言した条件は複合文中の任意の場所でSIGNAL文によって明示的に起こすこともできる。
SIGNAL dup_key ; |
次にプロシージャ言語を使用したストアドプロシージャの定義文の例を示す。
|
内容を順に見ていこう。
- ストアドプロシージャを定義する。1個の入力パラメタと2個の出力パラメタのデータ型を指定する
- プロシージャ言語を使用することを指定する
- ルーチンボディに複合文を記述する。BEGIN文からEND文の間に実行したいSQL文やプロシージャ言語を記述する。複合文中に別の複合文が入れ子になってもよい
- DECLARE文によって複合文内で参照するローカル変数を宣言する。変数名が有効な範囲は複合文内である。DEFAULTオプションで既定値を設定することができる
- 発行したいSELECT文のためにカーソルを宣言する。5と8は従来の埋め込みSQL文と同じである
- SET文を使用して値を変数に割り当てる。COBOL言語のMOVE文に相当する
- ここではCASE文を使用して入力パラメタkamokuの値によってロジックの流れを分岐させている
- 宣言したカーソルを使ったOPEN文、FETCH文およびCLOSE文を使用して表から結果行を読込む
- ここではLOOP文を利用して、SQLSTATEが
'
02000'
(NOT FOUND)になるまでFETCH文を繰り返す。LOOP文の代わりにWHILE文やFOR文を使用して表現することもできる。またここではIF文でSQLSTATEの値を検査している
このように、プロシージャ言語を利用すれば、データベースをアクセスするアプリケーションプログラムのプログラミング言語を標準化することができて移植性が向上し、製品の市場の流通性が増すことが期待できる。
とびら 新しい業界標準「SQL99」詳細解説 SQL99の背景と特徴 |
第二章 柔軟さを増したデータ構造
ユーザー定義可能な新しいデータ |
第三章 ストアドプロシージャとSQLJ クライアント/サーバ環境のための機能強化
|
「Master of IP Network総合インデックス」 |
- 完全HTTPS化のメリットと極意を大規模Webサービス――ピクシブ、クックパッド、ヤフーの事例から探る (2017/7/13)
2017年6月21日、ピクシブのオフィスで、同社主催の「大規模HTTPS導入Night」が開催された。大規模Webサービスで完全HTTPS化を行うに当たっての技術的、および非技術的な悩みや成果をテーマに、ヤフー、クックパッド、ピクシブの3社が、それぞれの事例について語り合った - ソラコムは、あなたの気が付かないうちに、少しずつ「次」へ進んでいる (2017/7/6)
ソラコムは、「トランスポート技術への非依存」度を高めている。当初はIoT用格安SIMというイメージもあったが、徐々に脱皮しようとしている。パブリッククラウドと同様、付加サービスでユーザーをつかんでいるからだ - Cisco SystemsのIntent-based Networkingは、どうネットワークエンジニアの仕事を変えるか (2017/7/4)
Cisco Systemsは2017年6月、同社イベントCisco Live 2017で、「THE NETWORK. INTUITIVE.」あるいは「Intent-based Networking」といった言葉を使い、ネットワークの構築・運用、そしてネットワークエンジニアの仕事を変えていくと説明した。これはどういうことなのだろうか - ifconfig 〜(IP)ネットワーク環境の確認/設定を行う (2017/7/3)
ifconfigは、LinuxやmacOSなど、主にUNIX系OSで用いるネットワーク環境の状態確認、設定のためのコマンドだ。IPアドレスやサブネットマスク、ブロードキャストアドレスなどの基本的な設定ができる他、イーサネットフレームの最大転送サイズ(MTU)の変更や、VLAN疑似デバイスの作成も可能だ。
|
|