Ошибка PostgreSQL: RETURN должен указывать переменную записи или строки в функции, возвращающей строку - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь запустить следующие строки:

create type _stats_agg_result_type AS (
    count bigint,
    min double precision,
    max double precision,
    mean double precision,
    variance double precision,
    skewness double precision,
    kurtosis double precision
);

create or replace function _stats_agg_finalizer(_stats_agg_accum_type)
returns _stats_agg_result_type AS '
BEGIN
    RETURN row(
        $1.n, 
        $1.min,
        $1.max,
        $1.m1,
        $1.m2 / nullif(($1.n - 1.0), 0), 
        case when $1.m2 = 0 then null else sqrt($1.n) * $1.m3 / nullif(($1.m2 ^ 1.5), 0) end, 
        case when $1.m2 = 0 then null else $1.n * $1.m4 / nullif(($1.m2 * $1.m2) - 3.0, 0) end
    );
END;
'
language plpgsql;

К сожалению, я получаю следующую ошибку (в отношении функции _stats_agg_finalizer):

RETURN must specify a record or row variable in function returning row

Версия, которую я использую:

PostgreSQL 9.2.24 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit

Я новичок в PostgreSQL и не смог исправить эту ошибку. Спасибо за любую помощь, спасибо!

1 Ответ

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

Это было включено в 9.3. Я предполагаю, что это соответствует этой заметке о выпуске :

Разрешить PL / pg SQL использовать RETURN с выражением составного типа (Асиф Рехман)

Ранее в функции, возвращающей составной тип, RETURN мог ссылаться только на переменную этого типа.

Таким образом, вы должны иметь возможность переписать ее следующим образом:

create or replace function _stats_agg_finalizer(_stats_agg_result_type)
returns _stats_agg_result_type AS '
declare f _stats_agg_result_type ;
BEGIN
    f:=row(
        $1.n, 
        $1.min,
        $1.max,
        $1.m1,
        $1.m2 / nullif(($1.n - 1.0), 0), 
        case when $1.m2 = 0 then null else sqrt($1.n) * $1.m3 / nullif(($1.m2 ^ 1.5), 0) end, 
        case when $1.m2 = 0 then null else $1.n * $1.m4 / nullif(($1.m2 * $1.m2) - 3.0, 0) end
    ); 
    return f;
END;
'
language plpgsql;

Примечание что я изменил тип ввода, так как вы не показали использование определения исходного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...