1
私は複合型のリストを返すことを期待カーソルを作成しPostgresはカーソル
Create Type TestDetailReportType1 As
(
sName text,
cDetailsTimeStamp timestamp,
number text,
dropdi text,
queue text,
agent text,
status int,
reference int
)
複合型を作成した...しかし、レコードが、私は* TestdetailsCursortest11から(「ABC」)を選択し実行すると、返されません しかし、関数内で直接実行されたクエリは31行を返します...私はこの関数を作成している間に間違っている場所を理解することができませんので、私は前進に新しいです。
注 - >私は特にこのシナリオでカーソルを書いています...関数がテーブルを返すときに正常に結果を得ることができました。 セットを返す関数(別称、表関数)で
CREATE OR REPLACE FUNCTION public.TestdetailsCursortest11(
hgname text)
RETURNS SETOF TestDetailReportType1
LANGUAGE 'plpgsql'
AS $TestdetailsCursortest11$
DECLARE
cDetailcursor refcursor;
cDetailtEvent RECORD; -- variable to store agent event.
cDetail callDetailReportType1;
BEGIN
OPEN cDetailcursor FOR
select tblUsers.UserName,tblCallEvent.StateCreateDate,tblCallRegister.Cli,tblCallRegister.DDI,tblhuntGroup.name,
tblUsers.Extension,
tblCallEvent.StateID,
tblCallRegister.CallID
from tblCallRegister
inner join tblCallEvent on tblCallRegister.callregisterid= tblCallEvent.callregisterid
inner join tblUsers on tblUsers.userid=tblCallEvent.agentid
inner join tblhuntGroup on tblhuntGroup.HGID=tblCallEvent.HGID
where name=hgname;
FETCH NEXT FROM callDetailcursor INTO callDetailtEvent;
callDetail.sName=callDetailtEvent.UserName;
callDetail.cDetailsTimeStamp=callDetailtEvent.StateCreateDate;
callDetail.number =callDetailtEvent.Cli;
IF callDetailtEvent.StateID = 19
THEN
callDetail.dropdi=callDetailtEvent.DDI;
ELSE
callDetail.dropdi=callDetailtEvent.DDI+1;
END IF;
callDetail.queue=callDetailtEvent.name;
callDetail.agent=callDetailtEvent.Extension;
callDetail.status =callDetailtEvent.StateID;
callDetail.reference=callDetailtEvent.CallID;
RETURN;
CLOSE callDetailcursor;
END;
$TestdetailsCursortest11$;
ありがとうLaurenz Albe ....あなたの提案私は結果を見るのに役立ちます...ちょうどここで私は31行を期待していましたが、1行だけクエリの最初の行が返されています...あなたが助けることができる私はここに..私はカーソルだけをループに追加していません –
ループがなければ、 'RETURN NEXT'は一度だけ実行されるので、結果行が1つしかない場合は驚くことではありません。 PostgreSQLのドキュメントには、PL/pgSQLでループを書く方法の例がいくつかあります。最も簡単な方法は、私の答えに投稿したコードです。答えは明示的なカーソルではなく暗黙のカーソルを使用しています。 –