1
我創建Postgres的遊標
Create Type TestDetailReportType1 As
(
sName text,
cDetailsTimeStamp timestamp,
number text,
dropdi text,
queue text,
agent text,
status int,
reference int
)
我創建了一個光標,我希望返回複合類型的列表複合類型...但是當我執行SELECT * FROM TestdetailsCursortest11(「ABC」)沒有記錄返回 但在執行時直接返回31行的函數內寫入的查詢...我是新來的postgress所以我不明白哪個地方我做錯了,而使這個功能,真的很感謝前面的任何指導。
注 - >我特別想在這種情況下寫一個遊標......當函數返回表時,我成功地得到了結果。
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'將只執行一次,所以如果你只得到一個結果行並不奇怪。 PostgreSQL文檔有幾個關於如何在PL/pgSQL中編寫循環的例子,最簡單的方法是我在我的答案中發佈的代碼,它使用隱式遊標而不是顯式遊標。 –