In Ihrem Szenario ändert sich der Rückgabetyp aufgrund unterschiedlicher Spaltennamen und -typen. Um dies zu bewältigen, können Sie die Fähigkeit von PostgreSQL nutzen, anonyme Datensatztypen zurückzugeben:
<code class="language-sql">CREATE FUNCTION data_of(integer) RETURNS SETOF record AS ...</code>
Dieser Ansatz erfordert jedoch die manuelle Angabe von Spaltendefinitionen in jedem Funktionsaufruf:
<code class="language-sql">SELECT * FROM data_of(17) AS foo (colum_name1 integer , colum_name2 text , colum_name3 real);</code>
Um diesen langwierigen Ansatz zu vermeiden, können Sie Dokumentdatentypen wie JSON oder XML verwenden, um unstrukturierte Daten zu speichern:
<code class="language-sql">CREATE FUNCTION data_of(integer) RETURNS JSONB AS ...</code>
Dieser Ansatz geht jedoch auf Kosten der Vorteile strukturierter PostgreSQL-Datentypen.
Wenn Ihre Datenstruktur konsistent ist (mit Ausnahme der Spaltennamen), können Sie eine feste Anzahl korrekt benannter und typisierter Spalten zurückgeben:
<code class="language-sql">CREATE FUNCTION data_of(_id integer) RETURNS TABLE (datahora timestamp, col2 text, col3 text) AS $func$ ...</code>
Der Einfachheit halber wird jede Spalte explizit in den Typ TEXT konvertiert.
Wenn Sie eine variable Anzahl von Spalten desselben Typs haben, können Sie ein Array zum Speichern der Werte verwenden:
<code class="language-sql">CREATE FUNCTION data_of(_id integer) RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS $func$ ...</code>
Außerdem können Sie die Spaltennamen als Array zurückgeben:
<code class="language-sql">CREATE FUNCTION data_of(_id integer) RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS $func$ ...</code>
Um alle Spalten einer Tabelle unabhängig von ihrer Struktur zurückzugeben, können Sie den Pseudodatentyp anyelement
verwenden:
<code class="language-sql">CREATE FUNCTION data_of(_tbl_type anyelement, _id int) RETURNS SETOF anyelement AS $func$ BEGIN RETURN QUERY EXECUTE format(' SELECT * FROM %s -- pg_typeof returns regtype, quoted automatically WHERE id = ORDER BY datahora' , pg_typeof(_tbl_type)) USING _id; END $func$;</code>
Rufen Sie diese Funktion mit NULL des gewünschten Tabellentyps auf, um den Rückgabetyp dynamisch zu bestimmen:
<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);</code>
Das obige ist der detaillierte Inhalt vonWie kann ich dynamische SQL-Rückgabetypen in PostgreSQL mit unterschiedlichen Spaltennamen und -typen verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!