Рефакторинг функции PL/pgSQL для возврата результатов различных запросов SELECT

Я написал функцию, которая выводит правильно сформированный запрос PostgreSQL SELECTв текстовой форме. Теперь я больше не хочу выводить текст, а фактически запускаю сгенерированный оператор SELECTдля базы данных и возвращаю результат -, как и сам запрос.

Что у меня есть на данный момент:

CREATE OR REPLACE FUNCTION data_of(integer)
  RETURNS text AS
$BODY$
DECLARE
   sensors varchar(100);   -- holds list of column names
   type    varchar(100);   -- holds name of table
   result  text;           -- holds SQL query
       -- declare more variables

BEGIN
      -- do some crazy stuff

      result := 'SELECT\r\nDatahora,' || sensors ||
      '\r\n\r\nFROM\r\n' || type ||
      '\r\n\r\nWHERE\r\id=' || $1 ||'\r\n\r\nORDER BY Datahora;';

      RETURN result;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION data_of(integer) OWNER TO postgres;

sensorsсодержит список имен столбцов для таблицы type. Они объявляются и заполняются в ходе функции. В конце концов, они содержат такие значения, как:

  • sensors:'column1, column2, column3'
    КромеDatahora(timestamp)все столбцы имеют тип double precision.

  • type:'myTable'
    Может быть именем одной из четырех таблиц. Каждый из них имеет разные столбцы, за исключением общего столбца Datahora.

Определение базовых таблиц .

Переменная sensorsбудет содержать все отображаемые здесь столбцы для соответствующей таблицы в type. Например :Если typeравно pcdmet, то sensorsбудет'datahora,dirvento,precipitacao,pressaoatm,radsolacum,tempar,umidrel,velvento'

Переменные используются для создания оператора SELECT, который хранится в result. Нравится:

SELECT Datahora, column1, column2, column3
FROM   myTable
WHERE  id=20
ORDER  BY Datahora;

Прямо сейчас моя функция возвращает этот оператор как text. Я копирую -вставку и запускаю ее в pgAdmin или через psql. Я хочу автоматизировать это, автоматически запускать запрос и возвращать результат. Как я могу это сделать?

32
задан Erwin Brandstetter 14 January 2017 в 03:12
поделиться