2016-11-13 81 views
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$; 

回答

1

集返回函數(又名錶函數)使用RETURN返回結果,而是退出功能。

您使用RETURN NEXT <value>;返回結果行。所以,你的函數應該類似於此:

DECLARE 
    cDetail callDetailReportType1; 
    cDetailtEvent RECORD; 
BEGIN 
    FOR cDetailtEvent IN 
     SELECT ... 
    LOOP 
     cDetail.field1 := ...; 
     cDetail.field2 := ...; 

     /* return the next result row */ 
     RETURN NEXT cDetail; 
    END LOOP; 

    /* 
    * This is optional; dropping out from the end 
    * of a function is an implicit RETURN 
    */ 
    RETURN; 
END; 

你的函數寫,因爲沒有RETURN NEXT <value>;它將alwazs返回一個空結果的方式。

+0

感謝Laurenz Albe ....您的建議幫助我看到結果...只要一點,我期待31行,但只有1行查詢的第一行只是返回...你能幫助我在這裏..我還沒有添加循環只是光標 –

+0

那麼,沒有循環'RETURN NEXT'將只執行一次,所以如果你只得到一個結果行並不奇怪。 PostgreSQL文檔有幾個關於如何在PL/pgSQL中編寫循環的例子,最簡單的方法是我在我的答案中發佈的代碼,它使用隱式遊標而不是顯式遊標。 –