Функция Postgres должна иметь запись типа возврата из-за параметров OUT - PullRequest
1 голос
/ 30 октября 2019

Я написал следующую функцию в postgresql и сталкиваюсь с упомянутой ниже ошибкой. Может кто-нибудь помочь мне, как это исправить?

ОШИБКА: тип результата функции должен быть записан из-за параметров OUT Состояние SQL: 42P13

CREATE OR REPLACE FUNCTION fun_audit_trail(in as_on_date date, out mail_id varchar, out user_id varchar, out user_name varchar, 
        out last_login_time timestamp, out last_logout_time timestamp, out logout_flag varchar, out user_available_flag varchar)
  RETURNS setof ret_cursor AS 
$BODY$

DECLARE ref_cursor ret_cursor;

BEGIN

    open ref_cursor for 
    select am.am_usrmailid,am.am_usr_loginid,am.am_usr_name,am.am_last_login_time,am.am_last_logout_time,am.am_logout_flag,am.am_usr_available_flag 
    into mail_id,user_id,user_name,last_login_time,last_logout_time,logout_flag,user_available_flag
    from auth_monitor am where am_last_login_time <= as_on_date
    return next ref_cursor;

END $BODY$
  LANGUAGE 'plpgsql' COST 100.0 SECURITY INVOKER

1 Ответ

2 голосов
/ 30 октября 2019

Зачем вообще использовать рефкурсор? И returns setof ref_cursor означает, что вы хотите вернуть более одного рефкурсора, который вы явно не хотите делать.

A language sql Функция, объявленная как returns table(), является правильным выбором, если вы хотите вернуть результатиз функции:

CREATE OR REPLACE FUNCTION fun_audit_trail(in as_on_date date)
  RETURNS table(mail_id varchar, user_id varchar, user_name varchar, 
                last_login_time timestamp, last_logout_time timestamp, 
                logout_flag varchar, user_available_flag varchar)
$BODY$
    select am.am_usrmailid,am.am_usr_loginid,am.am_usr_name,am.am_last_login_time,am.am_last_logout_time,am.am_logout_flag,am.am_usr_available_flag 
    from auth_monitor am 
    where am_last_login_time <= as_on_date
$BODY$
LANGUAGE sql;

Тогда вы можете использовать это так:

select *
from fun_audit_trail(date '2019-10-20');
...