Я пытаюсь вернуть пользовательский тип из функции PostgreSQL следующим образом:
DROP TYPE IF EXISTS GaugeSummary_GetDateRangeForGauge_Type CASCADE; -- Drop our previous type
CREATE TYPE GaugeSummary_GetDateRangeForGauge_Type AS -- Recreate our type
(
Minimum timestamp without time zone,
Maximum timestamp without time zone
);
CREATE OR REPLACE FUNCTION GaugeSummary_GetDateRangeForGauge
(
GaugeID integer
)
RETURNS GaugeSummary_GetDateRangeForGauge_Type AS
$$
DECLARE
iGaugeID ALIAS FOR $1;
oResult GaugeSummary_GetDateRangeForGauge_Type%ROWTYPE;
BEGIN
SELECT INTO oResult
min(ArchivedMinimumTime) as Minimum,
max(TelemeteredMaximumTime) as Maximum
FROM GaugeSummary
WHERE GaugeID = $1;
RETURN oResult;
END;
$$ LANGUAGE plpgsql;
SELECT GaugeSummary_GetDateRangeForGauge(2291308);
У меня есть две проблемы с этим.
1) - мои результаты возвращаются в виде одного столбца как "(" 1753-01-01 12:00:00 "," 2009-11-11 03:45:00 ")", где они мне нужны вернуться в две колонки.
Решено! - Глупая ошибка ...
Это должен быть SELECT * FROM GaugeSummary_GetDateRangeForGauge (123)
2) Результатами являются максимальные и минимальные значения для всей таблицы - ограничение WHERE не используется.
Пример:
GaugeSummaryID GaugeID ArchivedMinimumTime TelemeteredMaximumTime
80 4491 "2009-03-28 12:00:00" "2009-06-27 12:00:00"
81 4491 "2009-03-28 12:00:00" "2009-06-27 12:00:00"
Но вызов функции дает мне:
"1753-01-01 12:00:00", "2009-11-11 03:45:00"
Спасибо!
Ответ за 2:
Кажется, что выполнение этого же запроса внутри "LANGUAGE 'SQL' STABLE;" Функция отлично работает:
CREATE OR REPLACE FUNCTION GaugeSummary_GetDateRangeForGauge
(
GaugeID integer
)
RETURNS GaugeSummary_GetDateRangeForGauge_Type AS
$$
SELECT min(ArchivedMinimumTime) as Minimum,
max(TelemeteredMaximumTime) as Maximum
FROM GaugeSummary WHERE GaugeID = $1;
$$ LANGUAGE 'SQL' STABLE;
Однако было бы неплохо узнать, почему функция plpgsql не работает корректно ....