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

答えて

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'は一度だけ実行されるので、結果行が1つしかない場合は驚くことではありません。 PostgreSQLのドキュメントには、PL/pgSQLでループを書く方法の例がいくつかあります。最も簡単な方法は、私の答えに投稿したコードです。答えは明示的なカーソルではなく暗黙のカーソルを使用しています。 –