Heim > Datenbank > MySQL-Tutorial > Wie definiere ich PostgreSQL-Funktionen, die Datensatz- oder zusammengesetzte Typen zurückgeben, richtig?

Wie definiere ich PostgreSQL-Funktionen, die Datensatz- oder zusammengesetzte Typen zurückgeben, richtig?

Barbara Streisand
Freigeben: 2025-01-05 10:57:40
Original
680 Leute haben es durchsucht

How to Correctly Define PostgreSQL Functions Returning Record or Composite Types?

PostgreSQL: FEHLER: 42601: Eine Spaltendefinitionsliste ist für Funktionen erforderlich, die „Datensatz“ zurückgeben.

Der Fehler „FEHLER: 42601: Eine Spaltendefinitionsliste ist erforderlich für Funktionen, die „Datensatz“ zurückgeben, geben an, dass eine Funktion, die zur Rückgabe eines Datensatztyps deklariert ist, in ihrer Rückgabe keine Spaltendefinitionsliste angegeben hat Anweisung.

Ausgewählte Spalten zurückgeben

CREATE OR REPLACE FUNCTION get_user_by_username(_username text
                                              , _online bool DEFAULT false)
  RETURNS TABLE (
    user_id int
  , user_name varchar
  , last_activity timestamptz
  )
  LANGUAGE plpgsql AS
$func$
BEGIN
   IF _online THEN
      RETURN QUERY
      UPDATE users u 
      SET    last_activity = current_timestamp  -- ts with time zone
      WHERE  u.user_name = _username
      RETURNING u.user_id
              , u.user_name
              , u.last_activity;
   ELSE
      RETURN QUERY
      SELECT u.user_id
           , u.user_name
           , u.last_activity
      FROM   users u
      WHERE  u.user_name = _username;
   END IF;
END
$func$;
Nach dem Login kopieren

Aufruf:

SELECT * FROM get_user_by_username('myuser', true);
Nach dem Login kopieren

(Satz) ganzer Zeilen zurückgeben

Um alle zurückzugeben Spalten der vorhandenen Tabellenbenutzer gibt es einen einfacheren Weg. Postgres definiert automatisch einen zusammengesetzten Typ mit demselben Namen für jede Tabelle. Verwenden Sie einfach RETURNS SETOF-Benutzer, um die Abfrage erheblich zu vereinfachen:

CREATE OR REPLACE FUNCTION get_user_by_username(_username text
                                              , _online bool DEFAULT false)
  RETURNS SETOF users
  LANGUAGE plpgsql AS
$func$
BEGIN
   IF _online THEN
      RETURN QUERY
      UPDATE users u 
      SET    last_activity = current_timestamp
      WHERE  u.user_name = _username
      RETURNING u.*;
   ELSE
      RETURN QUERY
      SELECT *
      FROM   users u
      WHERE  u.user_name = _username;
   END IF;
END
$func$;
Nach dem Login kopieren

Ganze Zeile plus benutzerdefinierte Ergänzung zurückgeben

CREATE OR REPLACE FUNCTION get_user_by_username3(_username text
                                               , _online bool DEFAULT false)
  RETURNS TABLE (
    users_row users
  , custom_addition text
  )
  LANGUAGE plpgsql AS
$func$
BEGIN
   IF _online THEN
      RETURN QUERY
      UPDATE users u 
      SET    last_activity = current_timestamp  -- ts with time zone
      WHERE  u.user_name = _username
      RETURNING u  -- whole row
              , u.user_name || u.user_id;
   ELSE
      RETURN QUERY
      SELECT u, u.user_name || u.user_id
      FROM   users u
      WHERE  u.user_name = _username;
   END IF;
END
$func$;
Nach dem Login kopieren

Die „Magie“ liegt im Funktionsaufruf, wo wir (optional) Zerlegen Sie den Zeilentyp:

SELECT (users_row).*, custom_addition FROM get_user_by_username('foo', true);
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie definiere ich PostgreSQL-Funktionen, die Datensatz- oder zusammengesetzte Typen zurückgeben, richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage