LINUX.ORG.RU

[PostgreSQL] Значение, возращаемое функцией

 


0

1

Здравствуйте, имею функцию, пробовал возращаемое значение table и собственного типа getSensorType.
Возращает не так:
time_t | value
-------+-------
105 | 117
2054 | 676 , а так:

getsensorvalues
-----------------
(105,117)
(2054,676)

При вызове этой функции из программы результат выдает не как пары значений 105, 117, а как одну строку "(105,117)"
Подскажите где я ошибся, пожалуйста.

CREATE OR REPLACE FUNCTION getSensorValues(firstTime integer, lastTime integer, step integer, insensorid integer)
returns setof getSensorType as --table(otime_t integer, ovalue float8) as
$$
declare
firstTime integer := $1;
counter integer := 0;
localStep integer := $3/10 + 1;
getSens getSensorType;
occ record;
begin
  while firstTime < $2 + 1 
  loop
  for occ in select time_t, value from sensors
  where sensorsid = $4 and time_t = (select min(time_t) from sensors
  where sensorsid = $4 and time_t >= (firstTime - (localStep/2) + (localStep*counter))
  and time_t < (firstTime + (localStep/2) + (localStep*counter)))
  loop
  getSens.otime_t := occ.time_t;
  getSens.ovalue := occ.value;
  return next getSens;
  end loop;
  firstTime := firstTime + $3;

  if (getSens.otime_t is NULL) then
    if (getSens.ovalue is NULL) then
      if (counter < 9) then
    firstTime := firstTime - $3;
    counter := counter + 1;
      end if;
    end if;
  end if;

  end loop;
return;
end;
$$
language 'plpgsql';

------------------------------------------------

create type getSensorType as
(
otime_t integer,
ovalue float8
);

вот тута: http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions

прям как у тебя

create or replace function ExpensiveDepartments() returns setof int as
'
declare
r holder%rowtype;
begin
for r in select departmentid, sum(salary) as totalsalary
from GetEmployees() group by departmentid loop

if (r.totalsalary > 70000) then
r.totalsalary := CAST(r.totalsalary * 1.75 as int8);
else
r.totalsalary := CAST(r.totalsalary * 1.5 as int8);
end if;

if (r.totalsalary > 100000) then
return next r.departmentid;
end if;

end loop;
return;
end
'
language 'plpgsql';

только

r holder%rowtype;

думаю, стоит обратить внимание.

P.S.: сам не пробовал, увы.

aol ★★★★★
()
Ответ на: комментарий от aol

а, и это!! у тебя создается тип, а в примере по ссылке - таблица.

подозреваю, что (105,117) в твоем случае - это то, что ты попросил. значение типа getSensorType.

aol ★★★★★
()

Нигде не ошибся. Просто клинет к PG твоего ЯП не понимает что такое составной тип. Можно попробовать создать view с аналогичной структурой, или даже пустую таблицу вместо типа и использовать название view/таблицы в качестве возвращаемого типа.

mashina ★★★★★
()

Нигде не ошиблись, просто что бы получить поля к функции нужно обращаться как к таблице:

select * from getSensorValues(блабла);

Eshkin_kot ★★
()

Использовать функции, возвращающие более одного значения, плохо. Функции, в отличие от представлений, напрочь убивают планы и работу оптимизатора.

no-dashi ★★★★★
()
Ответ на: комментарий от Eshkin_kot

select * from getSensorValues(блабла);

Спасибо, это то что нужно.

YarikRock
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.