Heim >Datenbank >MySQL-Tutorial >Wie kann eine PL/pgSQL-Funktion dynamisch Ergebnisse aus verschiedenen SELECT-Abfragen zurückgeben?

Wie kann eine PL/pgSQL-Funktion dynamisch Ergebnisse aus verschiedenen SELECT-Abfragen zurückgeben?

DDD
DDDOriginal
2025-01-22 23:31:12607Durchsuche

How Can a PL/pgSQL Function Dynamically Return Results from Various SELECT Queries?

Refaktorisieren Sie PL/pgSQL-Funktionen, um die Ausgabe verschiedener SELECT-Abfragen zurückzugeben

Dynamisches SQL und Rückgabetypen

Gibt Datensätze eines undefinierten Typs zurück

Die ursprüngliche Funktion hat einen Rückgabetyp für Text deklariert, aber jetzt besteht das Ziel darin, die generierte SQL-Anweisung auszuführen und das Ergebnis als Datensatz zurückzugeben. Dazu müssen Sie dynamisches SQL verwenden und sich mit der Rückgabe von Datensätzen eines Typs befassen, der noch nicht definiert ist.

Benutzerdefinierte Typen mit numerischer und Datentypveränderbarkeit

Ein Ansatz besteht darin, einen benutzerdefinierten Rückgabetyp mit einer festen Anzahl von Spalten, aber einem variablen Datentyp zu erstellen. Allerdings erfordert dies die Definition einer Liste von Spaltendefinitionen für jeden Aufruf, was unpraktisch wird, wenn die Spaltennamen und Datentypen nicht im Voraus bekannt sind.

Polymorphe Typen verwenden

pg_typeof() Gibt den Tabellennamen als Objektidentifikatortyp (Regtype) zurück. Bei der automatischen Konvertierung in Text werden Bezeichner automatisch in doppelte Anführungszeichen gesetzt und durch Muster qualifiziert, wodurch eine SQL-Injection verhindert wird.

RETURN QUERY EXECUTE

Der bevorzugte Weg, dynamisches SQL auszuführen und Zeilen zurückzugeben, ist RETURN QUERY EXECUTE. Sie können damit SQL-Abfragen ausführen und die Ergebnisse als Rowsets mit genau definierten Zeilentypen zurückgeben.

Codebeispiel

Angenommen, Sie möchten alle Spalten einer beliebigen Tabelle basierend auf dem Tabellentypparameter zurückgeben:

<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_tbl_type anyelement, _id int)
  RETURNS SETOF anyelement
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY EXECUTE format('
      SELECT *
      FROM   %s  -- 自动用双引号括起来并进行模式限定
      WHERE  id = 
      ORDER  BY datahora'
    , pg_typeof(_tbl_type))
   USING  _id;
END
$func$;</code>

Nutzung

Rufen Sie diese Funktion mit dem Tabellentyp als erstem Parameter und der ID als zweitem Parameter auf. Diese Funktion gibt alle Spalten des Datensatzes mit der angegebenen ID in der angegebenen Tabelle zurück.

<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);
-- 将pcdmet替换为任何其他表名。</code>

Das obige ist der detaillierte Inhalt vonWie kann eine PL/pgSQL-Funktion dynamisch Ergebnisse aus verschiedenen SELECT-Abfragen zurückgeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn