スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド
SQLJにはDECLARE CURSOR,OPEN文,及びCLOSE文がないため,カーソルの宣言,オープン,及びクローズは,Javaの命令として記述します。このとき,カーソル名の代わりに反復子オブジェクトを使用します。反復子オブジェクトは,オブジェクトへの参照変数として宣言されるため,名称規則と有効範囲についてはJavaの規則に従います。
検索結果の取得は,使用する反復子オブジェクトの型によって,FETCH文で取得する方法と,FETCH文を使用しない方法とがあります。FETCH文では,位置指定反復子型のオブジェクトを使用し,列名指定反復子のオブジェクトは使用できません。
FETCH文を使用して検索をする場合の,記述方法について説明します。
#sql 修飾子 iterator クラス名
(データ型1,データ型2,…) ;
修飾子 クラス名 反復子オブジェクト ;
|
#sql 修飾子 iterator クラス名
[ implements JP.co.Hitachi.soft.HiRDB.pdjpp.runtime.ForUpdate ]
[ with キーワード=設定値,…]
(データ型1,データ型2,…) ;
修飾子 クラス名 反復子オブジェクト ;
|
表19-7 WITH句のキーワードと値の組み合わせ
| WITH句のキーワード | 機能 | 設定値 |
|---|---|---|
| holdability | ホールダブルカーソルであることを示します。 | TRUE |
| updateColumns | 更新する列を示します。 | "列名,列名,…" |
宣言した反復子オブジェクトに,SELECT文の結果セットを代入します。
#sql [コンテキスト] 反復子オブジェクト = { SELECT文 } ;
|
カーソル名の代わりに,反復子オブジェクトを指定してFETCH文を実行します。反復子オブジェクトは,先頭にコロンを付けます。
#sql [コンテキスト] {
FETCH :反復子オブジェクト INTO :変数1,:変数2,…} ;
|
反復子オブジェクトのendFetchメソッドを呼び出して,NOT FOUNDかどうかを判定します。検索する行がない場合はtrueが返ります。次の行がある場合はfalseが返ります。カーソルを閉じた後に呼んだ場合はtrueが返ります。
while(! 反復子オブジェクト.endFetch()) {
取り出した行に対する処理
}
|
カーソルをクロースする場合は,closeメソッドを呼び出します。
反復子オブジェクト.close() ; |
FETCH文を使用した検索例を次に示します。
#sql public iterator ByPos(String, int);
:
{
ByPos positer;
String name = null;
int code = 0;
#sql positer = { SELECT SNAME,SCODE FROM ZAIKO };
#sql { FETCH :positer INTO :name,:code };
while( !positer.endFetch() ){
System.out.println(name + ":" + code);
#sql { FETCH :positer INTO :name,:scode };
}
positer.close();
}
|
列名指定反復子のフィールドを使用して,検索結果の各列を読み出します。
検索項目と同じ名称(大文字と小文字は区別しない)を,クラスのフィールドとして定義します。データ型は,検索結果を受け取るJavaの変数のデータ型を指定します。なお,ネイティブインタフェースの場合は使用できません。
検索項目が,値式,Javaで使用できない文字を含む列名などの場合,AS句で検索項目に別名を定義しておいて,その別名を使用します。
#sql 修飾子 iterator クラス名
(データ型1 列名1,
データ型2 列名2,…) ;
修飾子 クラス名 反復子オブジェクト;
|
宣言した反復子オブジェクトに,SELECT文の結果セットを代入します。
#sql [コンテキスト] 反復子オブジェクト = { SELECT文 } ;
|
反復子オブジェクトのnextメソッドを呼び出して,NOT FOUNDかどうかを判定します。NOT FOUNDの場合はTRUEが返ります。行がある場合はFALSEが返ります。カーソルがオープンした後,最初のnextメソッドが実行されるまで,カーソルは検索結果の最初の行に位置付けられません。
while(反復子オブジェクト.next()){
取り出した行に対する処理
}
|
反復子オブジェクトの各フィールドから,データを読み出します。NOT FOUNDの場合や,カーソルがクローズされた後に読み出すと,結果は不定となります。フィールドのデータ型がJavaの基本データ型で,検索結果がナル値の場合に読み出すと,SQLNullExceptionオブジェクトが発生します。
フィールドに対して代入しても,データベースには反映されません。
変数1 = 反復子オブジェクト.列名1 ;
変数2 = 反復子オブジェクト.列名2 ;
:
|
反復子オブジェクトのcloseメソッドを呼び出します。
反復子オブジェクト.close() ; |
FETCH文を使用しない検索例を次に示します。
(例)
#sql public iterator ByName(String sname,
int scode);
:
{
ByName nameiter;
String s;
int i;
#sql nameiter = { SELECT SNAME, SCODE FROM ZAIKO };
while( nameiter.next() ){
s = nameiter.sname();
i = nameiter.scode();
System.out.println(s + ":" + i);
}
nameiter.close();
}
|
ネイティブインタフェース版の場合,カーソルを使った更新ができます。
UPDATE文,DELETE文で,カーソルが位置付けられている行を操作する場合,カーソル名の代わりに反復子を指定します。なお,反復子のクラス定義のときに,必ずForUpdateインタフェースを継承しておく必要があります。
#sql [コンテキスト] { DELETE文 WHERE CURRENT OF :反復子オブジェクト } ;
#sql [コンテキスト] { UPDATE文 WHERE CURRENT OF :反復子オブジェクト } ;
|
反復子を使用した更新例を次に示します。
#sql public iterator ByPos
implements JP.co.Hitachi.soft.HiRDB.pdjpp.runtime.ForUpdate
(String, int);
:
{
ByPos positer;
String name = null;
int year = 0;
int newyear;
#sql positer = { SELECT FULLNAME, BIRTHYEAR FROM PEOPLE };
#sql { FETCH :positer INTO :name,:year };
while( !positer.endFetch() ){
newyear=year+10;
#sql { UPDATE PEOPLE SET YEAR=:newyear WHERE CURRENT OF :positer; };
}
positer.close();
}
|
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.