Microsoft SQL Server
や、Sybaseでは、こんな風にストアドプロシージャでSELECT文を実行し、その結果セットをストアドプロシージャから返すことができます。
create procedure sp_foo
@key nvarchar(10)
as
SELECT empno, ename FROM emp
WHERE empno >= @key
end
OracleのPL/SQLプロシージャは、結果セットを返すことはありませんが、上記に近い機能は、以下のようにカーソルを返すプロシージャを定義することで、実現できます。
create or replace package TestPkg is
cursor empcursor is select empno, ename from emp;
type t_empcursor is ref cursor return empcursor%rowtype;
procedure SelectRecords(p_key in number, p_empcursor in out t_empcursor);
end TestPkg;
create or replace package body TestPkg is
procedure SelectRecords(p_key in number, p_empcursor in out t_empcursor) is
begin
open p_empcursor for select empno, ename from emp where key >= p_key;
end;
end TestPkg;
カーソル変数の出力をDelphiアプリケーションで処理する方法
TOracleQueryによる方法
すでにTOracleQueryのセクションで説明した通り、ストアドプロシージャから返されたカーソルをもう一つのTOracleQueryに割当てて、そのQueryをOpenすることでカーソルからデータをフェッチします。
//OpenQuery.SQL =
// BEGIN
// TestPkg.SelectRecords(:Key, :EmpCursor);
// END;
//OpenQuery.Variables: の変数宣言
// KEY = NUMBER型の変数
// EMPCURSOR = CURSOR型の変数
//として…
//
procedure TForm1.Button4Click(Sender: TObject);
begin
with OpenQuery do begin
SetVariable('Key', 1238);
SetComplexVariable('EmpCursor', EmpFetchQuery);
Execute;
end;
with EmpFetchQuery do begin
Execute;
while not Eof do begin
Memo1.Lines.Add(Field('ENAME'));
Next;
end;
end;
end;
TOracleDataSetによる方法
TOracleDataSetは、SQLプロパティにセットされたSQL文中で、カーソル型の変数が一つ定義されている場合に、そのカーソルからレコードをフェッチしたものを、自身のデータセットとして扱うようになっています。したがって、SQLで変数にカーソルを取り出すように設定するだけで、結果セットをTDataSetとしてアクセスできるようになります
//OraDataSet.SQL =
// BEGIN
// TestPkg.SelectRecords(:Key, :EmpCursor);
// END;
// Key=number型の変数
// EmpCursor=カーソル型の変数
//として…
//
procedure TForm1.Button4Click(Sender: TObject);
begin
with OraDataSet do begin
SetVariable('Key', 1238);
Open;
end;
with OraDataSet do begin
First;
while not Eof do begin
Memo1.Lines.Add(Field('ENAME'));
Next;
end;
end;
end;
