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