Возврат пользовательского типа из функции Postgresql - PullRequest
5 голосов
/ 11 января 2010

Я пытаюсь вернуть пользовательский тип из функции 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 Ответ

8 голосов
/ 12 января 2010

Я попробовал это, и я получаю два столбца обратно при выполнении

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 () из вашего запроса. Удаление этих данных гарантирует, что результаты из этих столбцов будут возвращены в строку, соответствующую вашему идентификатору.

ОБНОВЛЕНИЕ : хорошо, я не уверен, что происходит тогда. Я просто поместил все подобные вещи в мою тестовую базу данных, и она работает так, как я ожидаю.

пользовательский тип

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...