如何从PostgreSQL返回多个引用游标?

如何从PostgreSQL返回多个引用游标?,postgresql,Postgresql,我已经成功地创建了一个函数。我想返回多个ref游标,如下所示。当我执行这个函数时,我会得到一个如下图所示的响应。我怎样才能解决这个问题 CREATE OR REPLACE FUNCTION public.get_dashboard_graph( p_fromdate character varying, p_todate character varying) RETURNS SETOF refcursor LANGUAGE 'plpgsql' COST

我已经成功地创建了一个函数。我想返回多个ref游标,如下所示。当我执行这个函数时,我会得到一个如下图所示的响应。我怎样才能解决这个问题

CREATE OR REPLACE FUNCTION public.get_dashboard_graph(
    p_fromdate character varying,
    p_todate character varying)
    RETURNS SETOF refcursor 
    LANGUAGE 'plpgsql'
    COST 100.0
    VOLATILE 
    ROWS 1000.0
AS $function$

DECLARE
      process_wise_positrol refcursor;           
      process_wise_micro_audit refcursor;
      process_wise_positrol_line_stop refcursor;          
      process_wise_micro_audit_line_stop refcursor;
BEGIN

-- process wise positrol completed
OPEN process_wise_positrol FOR
    select count(*), d.dd_value from audit_transaction t, audit_master m, dd_type_details d 
    where t.audit_id = m.audit_id and m.activity_id = 9 and t.iscompleted = 'completed' and d.dd_id = m.process 
    and audit_start_time BETWEEN p_fromdate::timestamp AND p_todate::timestamp group by d.dd_value;
RETURN NEXT process_wise_positrol;

-- process wise Micro audit completed
OPEN process_wise_micro_audit FOR
    select count(*), d.dd_value from audit_transaction t, audit_master m, dd_type_details d 
    where t.audit_id = m.audit_id and m.activity_id = 8 and t.iscompleted = 'completed' 
    and d.dd_id = m.process 
    and audit_start_time BETWEEN p_fromdate::timestamp AND p_todate::timestamp group by d.dd_value;
RETURN NEXT process_wise_micro_audit;

-- process wise positrol line stop
OPEN process_wise_positrol_line_stop FOR
    select count(*), d.dd_value from audit_transaction t
    left join audit_master m on m.audit_id= t.audit_id
    left join dd_type_details d on d.dd_id= m.process
    left join audit_ques_link al on al.audit_trans_id= t.audit_trans_id
    where t.audit_id = m.audit_id and m.activity_id = 9 and al.line_stop = 0
    and t.iscompleted = 'completed' and d.dd_id = m.process 
    and audit_start_time BETWEEN p_fromdate::timestamp AND p_todate::timestamp 
    group by d.dd_value;
RETURN NEXT process_wise_positrol_line_stop;

-- process wise Micro audit line  stop
OPEN process_wise_micro_audit_line_stop FOR
    select count(*), d.dd_value from audit_transaction t
    left join audit_master m on m.audit_id= t.audit_id
    left join dd_type_details d on d.dd_id= m.process
    left join audit_ques_link al on al.audit_trans_id= t.audit_trans_id
    where t.audit_id = m.audit_id and m.activity_id = 8 and al.line_stop = 0
    and t.iscompleted = 'completed' and d.dd_id = m.process 
    and audit_start_time BETWEEN p_fromdate::timestamp AND p_todate::timestamp 
    group by d.dd_value;
RETURN NEXT process_wise_micro_audit_line_stop;

END;

$function$;

ALTER FUNCTION public.get_dashboard_graph(character varying, character varying)
    OWNER TO postgres;
当我执行上述函数时,它返回如下输出

select * from get_Dashboard_Graph('09/01/2018','09/28/2018');

你得到了你想要的东西——四个光标

在cou调用函数之后,您可以运行SQL语句

FETCH NEXT FROM "<unnamed portal 26>";
在函数完成后,您可以像这样调用
FETCH

FETCH NEXT FROM auditcursor;

我认为这是pgAdmin的一个限制。在你的代码中你什么都做不了我上面的问题已经解决了现在我正在努力用MVC调用这个函数?谢谢你的回复。我已经尝试并成功地得到了我想要的响应,但每次我执行上述功能时,它都会更改“未命名门户”的计数。如何解决此问题?正如我所说,为函数中的
refcursor
变量指定一个名称。好的,谢谢。我是否也应该在函数中写“fetchnext FROM”“;”?否;在调用函数后运行。我将编辑答案以使其更清楚。谢谢@Laurenz Albe。我认为postgresql非常糟糕,如果我有n个refcurser,那么我必须为每个游标编写FETCH语句。
FETCH NEXT FROM auditcursor;