Я написал функцию, которая выводит запрос 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. Я хочу автоматизировать это, запустить запрос автоматически и вернуть результат. Как я могу это сделать?