Как вернуть таблицу и ее общее количество в функции postgres ' - PullRequest
1 голос
/ 12 февраля 2020

Я новее postgresql и создаю функцию, как показано ниже

CREATE OR REPLACE FUNCTION GetLogs(
    _from Date, 
    _to Date,  
    _sortBy TEXT, 
    _orderby INT, 
    _page INT, 
    _row INT)
 RETURNS TABLE (
     "Id" UUID, 
     "RequestHeaders" text, 
     "RequestContent" text, 
     "ResponseHeaders" text, 
     "ResponseContent" text, 
     "ResponseCode" integer, 
     "ExecutionTimeMs" integer, 
     "Description" text,
     "RecordedOn" timestamp with time zone, 
     "Username" character varying, 
     "Exception" text) 
AS $$
BEGIN
    RETURN QUERY 
        SELECT COUNT(1)
        FROM dbo."Logs" log
        where log."RecordedOn" >= $1 and log."RecordedOn" <= $2;

    RETURN QUERY 
        SELECT log.*
        FROM dbo."Logs" log
        where log."RecordedOn" >= $1 and log."RecordedOn" <= $2
        Offset ($5-1) * $6
        Limit $6;
END;
$$ LANGUAGE plpgsql;

, и вызываю ее, используя

select * from GetLogs('2020-02-11','2020-02-12','Date',0,1,10)

Я ожидаю, что это будут данные подсчета и таблицы, но ошибка

ERROR:  structure of query does not match function result type
DETAIL:  Returned type bigint does not match expected type uuid in column 1.

кто-нибудь может ее решить?

1 Ответ

1 голос
/ 12 февраля 2020

Вы не можете вернуть результат, если структура не соответствует типу ВОЗВРАТА (в вашем случае - TABLE). Вместо этого вы можете использовать оконную функцию для добавления RowsCount к каждой возвращаемой строке.

CREATE OR REPLACE FUNCTION GetLogs(
    _from Date, 
    _to Date,  
    _sortBy TEXT, 
    _orderby INT, 
    _page INT, 
    _row INT)
 RETURNS TABLE (
     "Id" UUID, 
     "RequestHeaders" text, 
     "RequestContent" text, 
     "ResponseHeaders" text, 
     "ResponseContent" text, 
     "ResponseCode" integer, 
     "ExecutionTimeMs" integer, 
     "Description" text,
     "RecordedOn" timestamp with time zone, 
     "Username" character varying, 
     "Exception" text,
     "RowsCount" integer
)
AS $$
DECALARE
    RowsCount integer;
BEGIN

    RETURN QUERY 
        SELECT log.*, COUNT(*) OVER() AS RowsCount
        FROM dbo."Logs" log
        WHERE log."RecordedOn" >= $1 AND log."RecordedOn" <= $2
        OFFSET ($5-1) * $6
        LIMIT $6;
END;
$$ LANGUAGE plpgsql;
...