Web教材一覧データベース

SQLの動作環境(動的SQLと静的SQL)


独立言語方式と親言語方式

独立言語方式

独立言語方式とは、SQLを単独で使用する方式です。
 対話式SQL、コマンド方式とは、利用者がクライアント(パソコン)からSQL命令(コマンド)を1命令ずつ入力する方式です。サーバにあるDBMSがそれを解析し、誤りがあればエラーメッセージを表示、誤りがなければ直ちに実行して、その結果をクライアントに表示します。
 通常のプログラミング言語と同様に、SQL文をテキストファイルで作成しておき、それを起動して実行できます。このような場合も対話型SQLといいます。

WindowsではAccessというRDB処理ソフトがあります。SQL命令を直接記述する方法もあるし、画面のフォームで選択条件や照合条件を指定して内部的にSQL命令を生成する機能もありますが、いずれにせよ、「実行」をクリックすることにより対話式にSQLが実行されます。

親言語方式

そもそもSQLは、問合せ言語(query language)であり、関係データベースを操作して、新しい表を導出することが主目的で、SQLだけで複雑なアプリケーションを作成するのは困難です。また逆に、CやCOBOLのような手続き型言語では、関係データベースを直接操作する機能が欠けています。

それを解決するために、手続き型言語を親言語(ホスト言語)として、それからSQLを呼び出す方式を親言語方式といいます。次の二つの方法があります。

多くの言語がこのような機能をもっています。また、言語により方法に違いがあるのは不便ですので、インタフェースが標準規格化されています。

静的SQLと動的SQL

埋込みSQLは、静的SQLと動的SQLに分けられます。

静的SQL

静的SQLでは、親言語のソースプログラムを通常のコンパイルをする前に、SQL命令文の構文解析をして、DBMSを呼出してSQL命令を通常の親言語に変換します。この処理をプレコンパイルといいます。これ以降は通常の親言語プログラムと同様にコンパイルされ、実行プログラムが生成されます。

すなわち、静的SQLでは、プログラムを作る段階で、処理内容が確定しており、SQL命令にデータベースの表や項目の名称などの誤りがないことが前提になります。

動的SQL

動的SQLは、親言語を実行することにより、SQL文を生成する方式です。実行するたびにSQLを解析して実行形式に変換するため,処理効率が悪くなります(静的SQLはコンパイラ、動的SQLはインタプリタのようなイメージです)。

埋め込みSQLの例

商品表から親言語で与えた商品Aと等しい商品の価格を1.1倍する例を示します(あくまでも説明用で正確ではありません)。

 ① EXEC SQL DECLARE カーソル CURSOR FOR
 ②   SELECT 商品, 価格 FROM 商品表
 ③     WHERE 商品 = :商品A;
 ④ EXEC SQL OPEN カーソル;
 ⑤   EXEC SQL FETCH カーソル INTO :商品A, :価格B;
 ⑥   価格B = 価格B * 1.1;
 ⑦ EXEC SQL CLOSE カーソル;

EXEC SQL は、この命令がSQL文であることを示します。
 ここでは連続行になってきますが、EXEC SQLの間に親言語の文があってもかまいません。
①~③で、商品表から親言語で与えた商品Aと等しい行の商品と価格を取り出します。
③の :商品Aの「:」は、この変数が親言語で定義した変数であることを示します。
①は、CURSORの定義です。CURSORは、ここで導出した表の1行を指すポインタのようなものです。
 ここではカーソルという名称にしました。
④でカーソルを使うこと、⑦で終了することを示します。④~⑦の間は、①での導出表の行数だけ繰り返します。
⑤の FETCH は表から1行取り出す機能です。
 1行読んで列の商品, 価格を親言語で定義した変数である商品A、価格Bに入れる処理になります。
⑥親言語の文です。

ストアドプロシージャ

ストアドプロシージャ
ストアドプロシージャ(Stored Procedure)とは、よく利用される一連の処理をまとめた手続き(Procedure)にして、あらかじめDBMS(サーバ)に保存(Stored)しておくことです。イメージ的にいえば、ビューが原始プログラムなのに対して、ストアドプロシージャは実行プログラムに相当します。
 通常のSQL処理では、SQLコマンドを一つずつ送り、サーバで解析やコンパイルを行い処理します。それに対して、ストアドプロシージャは解析もコンパイルも行って保存されているので、クライアントから呼び出し命令を送信するだけで処理が実行できます。パラメタを設定することにより、柔軟性を持たせることもできます。
 ストアドプロシージャにより、サーバの処理効率の向上、クライアントとサーバ間の通信量削減ができます。
 なお、戻り値を返すストアドプロシージャのことを、関数だとして、ストアドファンクションということもあります。
データベーストリガー
トリガーとは、何かを行うキッカケのこと。データベーストリガー(database trigger)とは、何らかの操作がテーブルに対して加えられた際に、事前に動作するように設定しておいた処理が自動的に行われるようにするための機能のことです。
 データベース管理機能の1つでもありストアドプロシージャの一種でもあります。

本シリーズの目次へ