Refaktuj funkcję PL / pgSQL, aby zwrócić dane wyjściowe różnych zapytań SELECT
Napisałem funkcję, która wysyła PostgreSQLSELECT
zapytanie dobrze ukształtowane w formie tekstowej. Teraz nie chcę już wysyłać tekstu, ale faktycznie uruchomić wygenerowaneSELECT
instrukcja do bazy danych i zwraca wynik - tak jak samo zapytanie.
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
przechowuje listę nazw kolumn dla tabelitype
. Te są zadeklarowane i wypełnione w trakcie funkcji. W końcu posiadają wartości takie jak:
sensors
: 'column1, column2, column3'
Z wyjątkiemDatahora
(timestamp
) wszystkie kolumny są typudouble precision
.
type
:'myTable'
Może być nazwą jednego z czterech stołów. Każdy ma inne kolumny, z wyjątkiem wspólnej kolumnyDatahora
.
Zmiennasensors
zatrzyma sięwszystko kolumny wyświetlane tutaj dla odpowiedniej tabeli wtype
. Na przykład: Jeślitype
jestpcdmet
następniesensors
będzie'datahora,dirvento,precipitacao,pressaoatm,radsolacum,tempar,umidrel,velvento'
Zmienne są używane do budowaniaSELECT
oświadczenie, które jest przechowywane wresult
. Lubić:
SELECT Datahora, column1, column2, column3
FROM myTable
WHERE id=20
ORDER BY Datahora;
W tej chwili moja funkcja zwraca tę instrukcję jakotext
. Kopiuję i wklejam i wykonuję go w pgAdmin lub psql. Chcę to zautomatyzować, uruchomić zapytanie automatycznie i zwrócić wynik. Jak mogę to zrobić?