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.

Was ich bisher habe:
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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage