Возврат пользовательского типа из функции 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 работает неправильно....
655   1  

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

    Ничего не найдено.