パイプとカーソルの使用

パイプとカーソルは、個別または組み合わせて使用することで、TDV 内でさまざまな課題を解決できます。SQL で条件記述が難しい行をなくす、XML JMS メッセージの XSLT 変換からフラット化された行を返すなど、複雑なデータに対して前処理を行う必要がある場合に有用です。

パイプ

パイプは、データを多くのソースから挿入できるカーソルです。TDV は、パイプをプロシージャの出力パラメーターとしてのみ認識します。INSERT ステートメントを使用して、データをパイプに取り込んで処理することができます。たとえば次のとおりです。

PROCEDURE q(OUT name VARCHAR)
BEGIN
	DECLARE c CURSOR (name VARCHAR);
	CALL /shared/rtnPipe(c);
	FETCH c INTO name;
END

カーソル

TDV のカーソルは、単一のデータ ソースから返される結果セットです。カーソルは、行セット内の 1行へのポインターと考えることができます。カーソルは一度に 1行しか参照できませんが、必要に応じて結果セットの他の行に移動できます。

カーソルを使用して、個々の行で複雑なロジックを実行できます。

SQL プロシージャでカーソルを使用するには、以下を行う必要があります。

結果セットを定義するカーソルを宣言します。
カーソルを開いて結果セットを確立します。
一度に 1 行ずつ、カーソルから必要に応じてデータをローカル変数にフェッチします。
完了したらカーソルを閉じます。

静的カーソルの例

DECLARE <cursor-name> CURSOR FOR <select>; 

動的カーソルの例

PROCEDURE p (OUT p_name VARCHAR) 
BEGIN
DECLARE c CURSOR (name VARCHAR); 
	OPEN c FOR SELECT name FROM /shared/T;
	FETCH c INTO p_name;
	CLOSE c;
END

動的カーソルを再度開くことができるのは、以下の場合です。

同じクエリまたは別のクエリで
クローズ後のみ
PROCEDURE p (OUT p_name VARCHAR) 
BEGIN
	DECLARE c CURSOR (name VARCHAR);
	OPEN c FOR SELECT name FROM /shared/T;
	CLOSE c;
	-- Reopen with same query
	OPEN c;
	CLOSE c;
	-- Reopen with new query
	OPEN c FOR SELECT name FROM /shared/U WHERE birthdate > ‘2000-01-01’;
	CLOSE c;
END