【问题标题】:Postgres cursorPostgres 游标
【发布时间】:2016-11-13 19:39:32
【问题描述】:

我创建了复合类型

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

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    set 返回函数(也称为表函数)中,您使用 RETURN 不是返回结果,而是退出函数。

    您使用RETURN NEXT <em>&lt;value&gt;</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>&lt;value&gt;</em>;

    【讨论】:

    • 感谢 Laurenz Albe ....您的建议帮助我看到了结果...这里只有一点我期待 31 行但只有 1 行查询的第一行只返回。 ..你能帮我吗..我没有添加循环只是光标
    • 好吧,没有循环,RETURN NEXT 只会执行一次,所以如果你只得到一个结果行也就不足为奇了。 PostgreSQL 文档有几个关于如何在 PL/pgSQL 中编写循环的示例,最简单的方法是我在答案中发布的代码,它使用隐式游标而不是显式游标。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多