Возврат пользовательского типа из функции Postgresql
Я пытаюсь вернуть пользовательский тип из функции 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 работает неправильно....
1 ответ:
Я попробовал это, и я получаю два столбца обратно, когда делаю
SELECT * GaugeSummary_GetDateRangeForGauge(1);Результаты:
aadb=# select * from GaugeSummary_GetDateRangeForGauge(1); minimum | maximum ----------------------------+---------------------------- 2010-01-11 15:14:20.649786 | 2010-01-11 15:14:24.745783 (1 row)Я использую 8.4 и запускаю его в psql. Не могли бы вы пояснить, как вы получаете свои результаты?
Что касается #2, Если вы просто хотите получить результаты, то удалите из запроса агрегатные функции min() и max (). Удаление их гарантирует, что результаты из этих столбцов будут возвращены в строке, которая соответствует вашему идентификатору.
UPDATE : Хорошо, я не уверен, что происходит. Я просто поместил все подобные вещи в мою тестовую базу данных и ее работу, как я ожидаю.
Пользовательский тип
create type custom_type as ( minimum timestamp without time zone, maximum timestamp without time zone);Таблица (тест)
aadb=# select * from test order by id; id | a | b ----+----------------------------+---------------------------- 1 | 2010-01-11 17:09:52.329779 | 2010-01-11 17:09:52.329779 1 | 2010-01-11 17:10:04.729776 | 2010-01-11 17:10:04.729776 2 | 2010-01-11 17:09:55.049781 | 2010-01-11 17:10:21.753781 2 | 2010-01-11 17:10:30.501781 | 2010-01-11 17:10:30.501781 3 | 2010-01-11 17:09:58.289772 | 2010-01-11 17:09:58.289772 3 | 2010-01-11 17:35:38.089853 | 2010-01-11 17:35:38.089853 (6 rows)Функция
create or replace function maxmin (pid integer) returns custom_type as $$ declare oResult custom_type%rowtype; begin select into oResult min(a) as minimum, max(b) as maximum from test where id = pid; return oResult; end; $$ language plpgsql;Результаты
aadb=# select * from maxmin(2); minimum | maximum ----------------------------+---------------------------- 2010-01-11 17:09:55.049781 | 2010-01-11 17:10:30.501781 (1 row)
Comments