Rückgabetyp für Antwort mit mehreren Zeilen

Kampfgummibaerlie

Datenbank-Guru
Beiträge
743
Bin heute draufgekommen, dass man ebenfalls den Rückgabetyp "Table" wählen muss, wenn eine Funktion mehrere Zeilen antworten soll/können soll.

Mein Beispiel sieht so aus:
Code:
create or replace function oeffnungszeit_datum(x date) returns table (oeffnungszeit timerange) as $$ select oeffnungszeit from oeffnungszeiten where tages_id = wochentag_datum(x) $$ language sql;

Dachte vorher, dass ein spezifischer Rückgabetyp nur eine Column wiedergeben kann, aber ja, man lernt ja nie aus ;)

ANHANG HIER: ich verwende hier einen Typ timerange, welcher nicht von haus aus bei den Typen von Postgresql dabei ist.

Hier eine vollständige Anleitung, wie es funktioniert:

Um hier ersteinmal den Subtype für den Typ Timerange zu definieren:
Code:
CREATE FUNCTION time_subtype_diff(x time, y time) RETURNS float8 AS 'SELECT EXTRACT(EPOCH FROM (x - y))' LANGUAGE sql STRICT IMMUTABLE;

Um hier ersteinmal den Typ Timerange zu definieren:
Code:
CREATE TYPE timerange AS RANGE (subtype = time, subtype_diff = time_subtype_diff);

Um hier eine Tabelle mit Öffnungszeiten zu erstellen:
Code:
create table Oeffnungszeiten (Oeffnungszeit timerange, wochentag integer);

Um hier 2 Öffnungszeiten am selben Wochentag einzufügen:
1.:
Code:
insert into oeffnungszeiten (oeffnungszeit, wochentag) values ('(08:00, 14:00)', '1')

2.:
Code:
insert into oeffnungszeiten (oeffnungszeit, wochentag) values ('(16:00, 20:00)', '1')

Um hier eine Function zu erstellen, welche aus einem Datum den Wochentag berechnet:
Code:
CREATE FUNCTION wochentag_datum (x date) RETURNS double precision AS 'select extract(dow from x)' LANGUAGE sql STRICT IMMUTABLE;

Um hier eine Function zu erstellen, welche die Öffnungszeiten aus einem Datum angelt:
Code:
create or replace function oeffnungszeit_datum(x date) returns table (oeffnungszeit timerange) as $$ select oeffnungszeit from oeffnungszeiten where wochentag=wochentag_datum(x) $$ language sql;

Und hier, um das Ganze auch auszuprobieren:
Code:
select oeffnungszeit_datum('2017.07.03')

Ergebnis:
08:00-14:00 und 16:00-20:00
 
Werbung:
Zurück
Oben