gpt4 book ai didi

postgresql - Postgres游标

转载 作者:行者123 更新时间:2023-11-29 13:21:38 25 4
gpt4 key购买 nike

我创建了复合类型

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$;

最佳答案

集合返回函数(又名表函数)中,您使用RETURN 不是返回结果,而是退出函数。

您使用 RETURN NEXT <em><value></em>;返回结果行。所以你的函数应该类似于这样:

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 <em><value></em>;。 .

关于postgresql - Postgres游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40571776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com