Refactor einer PL / pgSQL-Funktion, um die Ausgabe verschiedener SELECT-Abfragen zurückzugeben
Ich habe eine Funktion geschrieben, die ein PostgreSQL ausgibtSELECT
Abfrage in Textform wohlgeformt. Jetzt möchte ich keinen Text mehr ausgeben, sondern den generierten ausführenSELECT
Anweisung gegen die Datenbank und das Ergebnis zurückgeben - genau wie die Abfrage selbst würde.
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
Enthält die Liste der Spaltennamen für die Tabelletype
. Diese werden im Laufe der Funktion deklariert und gefüllt. Schließlich halten sie Werte wie:
sensors
: 'column1, column2, column3'
Ausser fürDatahora
(timestamp
) Alle Spalten sind vom Typdouble precision
.
type
:'myTable'
Kann der Name einer von vier Tabellen sein. Jede hat andere Spalten mit Ausnahme der gemeinsamen SpalteDatahora
.
Definition der zugrunde liegenden Tabellen.
Die Variablesensors
wird haltenalles Hier angezeigte Spalten für die entsprechende Tabelle intype
. Zum Beispiel: Wenntype
istpcdmet
dannsensors
wird sein'datahora,dirvento,precipitacao,pressaoatm,radsolacum,tempar,umidrel,velvento'
Die Variablen werden zum Erstellen einesSELECT
Anweisung, die in gespeichert istresult
. Mögen:
SELECT Datahora, column1, column2, column3
FROM myTable
WHERE id=20
ORDER BY Datahora;
Im Moment gibt meine Funktion diese Anweisung als zurücktext
. Ich kopiere, füge es ein und führe es in pgAdmin oder über psql aus. Ich möchte dies automatisieren, die Abfrage automatisch ausführen und das Ergebnis zurückgeben. Wie kann ich das machen?