外部アプリケーションからのSQL呼び出し / カーソル


外部アプリケーションからの SQL 呼び出し

SQL は、C や JAVA 等の手続き型言語とは異なり、一つの命令が完結した意味を持ち、それだけでデータベースを処理することができます。

コマンド入力により、対話方式でデータベースに処理が行えるのは、非手続き型言語である SQL の特徴です。
裏を返せば、SQL は一つの命令で一つの処理しかできず、データベースの処理しか行うことしかできません。

しかし、データベースを利用したアプリケーションを開発しようとすると、データベースから取り出したデータに対して、条件判断やループなどの様々な処理を行う必要があります。
このような場合、SQL だけでは対処できる範囲は限られていますが、C や JAVA などの手続き型言語と組み合わせることにより実現することができます。

他の言語と組み合わせて SQL を呼び出すには、次の3つの方法があります。
これ以降の説明で出てくるホスト言語というのは、SQL を呼び出す C や JAVA 等の言語のことを指します。

  1. モジュール呼び出し
  2. 静的 SQL
  3. 動的 SQL

モジュール呼び出しは、SQL によって作成されたモジュールを、ホスト言語からサブルーチンとして呼び出す方法です。
ホスト言語側にモジュールを呼び出す機能が必要だが、モジュールを独立した形で作成することができます。

静的 SQL は、ホスト言語によって書かれるプログラムソース内に、直接 SQL 文を記述するものです。

これは埋め込み SQL とも呼ばれていますが、例えばプログラムソースの中に EXEC SQL ~; と記述することにより、プログラム実行時に SQL が実行され、データベースを処理することができるようになります。
これは、一度プログラムをコンパイルしてバイナリにしてしまえば、SQL は変化することがないことから静的 SQL と呼ばれています。

これに対して、SQL が変化するものを 動的 SQL といいます。
動的 SQL はホスト言語のプログラム実行時に、SQL を生成する方法です。

動的 SQL は静的 SQL に比べて、用途に応じた SQL をその都度生成できることから、柔軟性の高いアプリケーションを開発することができます。
しかし、パフォーマンスは静的 SQL のほうが優れています。

SQL は、データベースからまとめてデータを取り出し、一括して処理することが得意な言語ですが、ここで説明したような他のアプリケーションとの連携では、まとめて取り出したデータに対して、1つずつ処理することが必要になることが多いと考えられます。

SQL92 にはデータを 1つずつ取り出すための構文も用意されています。
これにはカーソルという考え方が必要になります。

カーソル

SQL はデータベースから複数行のデータを取り出し、一括して処理することに向いています。

しかし、他のプログラムや SQL 非標準のストアドプロシージャにおけるループでは、一行ごとにデータを処理したい場合があります。
このような場合にカーソルを利用します。

カーソルとは、クエリの結果集合を一時的に蓄えておくための仮想的な作業領域のことです。
この中の現在位置を示すポインタと呼ばれるものが、ループ処理が実行されるたびに一行ずつ進んでいき、次の処理対象を示します。

カーソルは非手続き型の SQL で、C や JAVA などの手続き型言語と同様の処理形態を可能とする手法と言えます。
カーソルを利用することにより、よりきめ細かな処理が可能になります。

カーソルを使用するときの手順は次のようになっています。

  1. カーソルの宣言
  2. カーソルを開く
  3. 一行ごとにデータを取り出す(ループ処理)
  4. カーソルを閉じる

カーソルの宣言

DECLARE CURSOR文

カーソルを宣言にはDECLARE CURSOR 文を用います。
宣言とは定義することと理解して問題ありません。

DECLARE カーソル名 [ INSENSITIVE ] [ SCROLL ] CURSOR
    FOR { SELECT文 [ 更新可能性句 ] } | {準備された文} ; 

INSENSITIVE

INSENSITIVE を指定するとカーソルを開いた後、カーソルの内容が固定されます。
カーソルを開いている間、他のトランザクションによるデータの変更の影響は受けません。

INSENSITIVE と指定できるのは、後で説明する読み取り専用カーソルに限定されます。

SCROLL

SCROLL を指定すると、後に述べる FETCH 文の「方向」で NEXT 以外も指定することができるようになります。
SCROLL を指定しない場合は、NEXT だけがサポートされます。

これも、読み取り専用カーソルに限定されます。

更新可能成句

更新可能性句は、そのカーソルが更新可能なのか、読み取り専用なのかを指定するものです。
更新可能性句は次のように記述します。

初期値は READ ONLY になっているので、読み取り専用である場合は、明示的に指定する必要はありません。

FOR { READ ONLY | UPDATE [ OF 列リスト] }

UPDATE を指定すると、更新可能なカーソルと定義されます。
UPDATE の後ろに記述された特定の列に対してカーソルを更新することができるようになります。

PREPARE

「準備された文」のところには、あらかじめ PREPARE 文により SQL 文と文字列を関連付けておき、その文字列を記述します。
その文字列を記述することにより、動的に SQL 文が呼び出されます。

PREPARE 文の基本構文は次の通りです。

PREPARE [ GLOBAL | LOCAL ] SQL文名 FROM 文字列変数 ;

PREPARE 文では、予め文字列変数 := ‘ SQL 文 ‘; としておき、DECLARE 文で SQL 文名が呼び出されたときに、文字列変数に格納された SQL 文が出力されます。

また GLOBAL を指定すると、DECLARE 文などの SQL 文から呼び出すことが可能であることを示し、LOCAL を指定すると、モジュールまたはコンパイルユニットからしか呼び出すことができないことを示します。

カーソルを開く

OPEN CURSOR文

次に、カーソルを開く方法ですが、これは OPEN CURSOR 文を使用します。
基本構文は次の通りです。

OPEN カーソル名 [ USING 値ソース ] ;

DECLARE 文で定義されたカーソルを開きます。
カーソルを開くことにより、カーソルのデータを処理することができるようになります。

USING 句は、動的 SQL の場合にのみ指定すします。
値ソースは次のように記述して指定します。

パラメータ | { SQL DESCRIPTOR 記述子 }

このように二通りの指定方法があるが、パラメータはアプリケーションから渡される変数リストを指定するものです。

後者の SQL DESCRIPTOR は、動的に生成される SQL 文のパラメータを取り出すときに使用されるものです。

カーソルからデータを取り出す

FETCH文

次に FETCH 文を使用してカーソルから一行ずつデータを取り出す方法を説明します。

OPEN 文で利用できるようになったカーソルから、データを一行ずつ取り出してアプリケーションによるループ処理を行います。

FETCH 文の基本構文は次の通りです。

FETCH [ [ 方向 ] FROM ] カーソル名 INTO 変数リスト ;

「方向」は行を示すポインタがどこに移動した後に、行のデータを読み取るのかを指定するものです。
「方向」の指定の仕方は、次の通りです。

NEXT | PRIOR | FIRST | LAST | { ABSOLUTE | RELATIVE オフセット }

NEXT

NEXT を指定すると、ポインタは次の行へ移動します。
最終行の次の行にポインタがあるときは、「NO DATA」という情報がポインタから返されます。

この情報を、アプリケーションやストアドプロシージャが受け取ることができ、ループ処理を終了したりできます。

PRIOR

PRIOR を指定すると、ポインタは前の行へ移動します。
先頭行の前の行にポインタがあるときは、「NO DATA」を返します。

FIRST

FIRST はポインタを先頭行へ、LAST はポインタを最終行へ移動します。

ABSOLUTE

ABSOLUTE オフセットを指定すると、オフセットの指定する行へポインタは移動します。

オフセット = 5 の場合は、5 番目の行に移動します。オフセットの示す行が、カーソルの最大行を超える場合は「NO DATA」を返します。

RELATIVE

RELATIVE オフセットを指定すると、オフセットに指定した行だけ移動します。

例えば、オフセット = 3 の場合、現在行が 10 番目の行であるならば、13 番目の行へ移動します。
また、オフセット = -3 の場合は、7 番目の行へ移動します。

ポインタの行き先が先頭行より前、または最終行より後ろになる場合は、「NO DATA」を返します。
ちなみに、「方向」を省略すると NEXT が採用されます。

ターゲット変数リストは、ポインタの示す行のデータを格納する変数のことで、アプリケーションやストアドプロシージャで使用する変数です。

つまり、FETCH 文が実行されると、現在の行からポインタを「方向」で示した行へ移動し、その行の各データを変数リストへ格納します。
FROM は省略しても問題ありません。

カーソルを閉じる

最後に、処理が終わったカーソルは閉じなければなりません。
カーソルを閉じるための基本構文は次の通りです。

CLOSE カーソル名 ;

カーソルを閉じることにより、カーソルに蓄えられていたクエリの結果集合が破棄されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


9 − = 3

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>