カーソルはブックマークのように動作する SQL 構成体で、行の位置を指定し、一連の検索結果 (つまり、テーブル行) を一度に 1 つずつステップスルーできるようにします。EGL はカーソルを管理できますが、カーソルを利用するための open および forEach ステートメントも提供します。
前回の演習で、delete ステートメントにキーワード noCursor が含まれていたことに気がついたかもしれません。get ステートメントがテーブル全体から 1 行以上を選択するのに対し、通常、delete ステートメントは前のステートメントで作成されたカーソルで示される 1 つの行に作用します。noCursor キーワードは、そのようなカーソルが存在しないことを示し、noCursor ステートメントがデフォルトの get ステートメントと同じ方法で行を指定するために Where 文節を使用することを指定します。
EGL open ステートメントはカーソルを作成し、結果セット、つまり、カーソルが移動可能な 1 行以上のセットを指定します。お客様は、カーソルに直接アクセスする代わりに、他の EGL ステートメントを使用して、カーソルで示されている結果セットから次の行を取得したり、カーソルを使用して一度に 1 行ずつステップスルーしながら、結果セット全体に対する操作を実行します。
tempItem Item; open allExpensiveItems for tempItem;この例における tempItem は、データベースの ITEMS テーブルを示す、SQLRecord パーツからの単一レコード変数です。コード for tempItem は、EGL がカーソルを使用して一度に 1 行ずつこのレコードに移動することを指定します。コード open allExpensiveItems は、結果セットに名前を付けます。allExpensiveItems は、厳密に言えば、変数ではなく識別子です。
tempItem Item;
open expensiveItems for tempItem with
#sql{
select
EGL.ITEM.ITEM_ID, EGL.ITEM.NAME, EGL.ITEM.IMAGE,
EGL.ITEM.PRICE, EGL.ITEM.DESCRIPTION
from EGL.ITEM
where
EGL.ITEM.ITEM_ID >= :tempItem.ItemId
order by
EGL.ITEM.ITEM_ID asc
};
このデフォルトの Where 文節で指定しているのは、各項目がその前の項目よりも大きい ITEM_ID 値を持つことのみです。(EGL は SQL DECLARE
CURSOR および OPEN CURSOR ステートメントを管理しますが、明示的な SQL では表示しません。) tempItem Item;
maxCost Price = 500;
open expensiveItems for tempItem with
#sql{
select
EGL.ITEM.ITEM_ID, EGL.ITEM.NAME, EGL.ITEM.IMAGE,
EGL.ITEM.PRICE, EGL.ITEM.DESCRIPTION
from EGL.ITEM
where
EGL.ITEM.PRICE >= :maxCost
order by
EGL.ITEM.ITEM_ID asc
};
これで、expensiveItems 結果セットに、500 に設定されている maxCost 変数より大きいか等しい PRICE 列を持つデータベースの行がすべて含まれます。tempItem Item;
maxCost Price = 500;
open expensiveItems for tempItem with
#sql{
select
EGL.ITEM.ITEM_ID, EGL.ITEM.NAME, EGL.ITEM.IMAGE,
EGL.ITEM.PRICE, EGL.ITEM.DESCRIPTION
from EGL.ITEM
where
EGL.ITEM.PRICE >= :maxCost
order by
EGL.ITEM.ITEM_ID asc
};
foreach (tempItem)
SysLib.writeStdout(tempItem.Name :: " " ::
tempItem.Description :: " $" :: tempItem.Price);
end
tempItem Item;
maxCost Price = 500;
open expensiveItems for tempItem with
#sql{
select
EGL.ITEM.ITEM_ID, EGL.ITEM.NAME, EGL.ITEM.IMAGE,
EGL.ITEM.PRICE, EGL.ITEM.DESCRIPTION
from EGL.ITEM
where
EGL.ITEM.PRICE >= :maxCost
order by
EGL.ITEM.ITEM_ID asc
};
// Retrieve the first row.
get next tempItem;
// As long as there are more rows,
// move the next row into the temporary variable
// and print its values.
while (sysvar.sqlData.sqlcode == 0)
SysLib.writeStdout(tempItem.Name :: " " ::
tempItem.Description :: " $" :: tempItem.Price);
get next tempItem;
end
get ステートメントには、オープン・カーソルおよび結果セットで使用可能な様々な操作が他にもあります。open expensiveItems scroll for tempItem;
close expensiveItems;カーソルと結果セットが閉じられると、カーソルに依存していた get next やその他のステートメントは機能しなくなります。
この演習では、forEach ステートメントを使用して結果セットをステップスルーし、データベースの項目のうち、ある価格を上回るものを取得します。
Laptop PC Great little machine. Take it anywhere with you. $1111.11 Combination Safe Keep your valuables safe and secure. Put 'em in here. $222.22 Desktop PC Lots'a power, at the right price. Includes monitor. $888.55
これで、selectItems.egl ファイルのコードが完成しました。 このファイル内にエラーがある場合 (赤の X 記号でマークされている場合) は、演習 3 で完成した selectItems.egl ファイルのファイルに記載されているコードと作成したコードが一致していることを確認してください。