Heim >Datenbank >MySQL-Tutorial >Wie definiere ich PostgreSQL-Funktionen, die Datensatz- oder zusammengesetzte Typen zurückgeben, richtig?
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.
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$;
Aufruf:
SELECT * FROM get_user_by_username('myuser', true);
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$;
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$;
Die „Magie“ liegt im Funktionsaufruf, wo wir (optional) Zerlegen Sie den Zeilentyp:
SELECT (users_row).*, custom_addition FROM get_user_by_username('foo', true);
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!