PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment obtenir des colonnes individuelles de la table renvoyées par une fonction ?

Pour décomposer les lignes que vous récupérez de la fonction, traitez-les comme n'importe quelle autre table :

SELECT * FROM karta_pacjenta('foo45678901');

Les fonctions renvoyant un ensemble de lignes sont également appelées "fonctions de table".

En dehors de cela, ce que vous avez présenté ne fonctionnerait pas.

CREATE  FUNCTION karta_pacjenta(_pe varchar)
  RETURNS TABLE(data DATE, imie TEXT, nazwisko TEXT
              , diagnoza TEXT,przepisany lek TEXT)  AS
$func$
SELECT w.dzien, p.imie, p.nazwisko, ch.nazwa, l.nazwa
FROM   pacjenci  p
JOIN   diagnozy  d  USING (pesel) -- shorthand if columns are unambiguous
JOIN   wizyty    w  USING (pesel)
JOIN   choroby   ch ON ch.kod_choroby = d.kod_choroby
JOIN   recepty   r  ON r.nr_wizyty = w.nr_wizyty
JOIN   leki      l  ON l.kod_leku = r.kod_leku 
WHERE  p.pesel = _pe
$func$ LANGUAGE sql;
  • Les guillemets simples pour les noms de colonne sont une erreur de syntaxe. Devraient être des guillemets doubles. Cependant, mieux vaut toujours utiliser des noms non cités, légaux et en minuscules.

  • Ne citez pas le nom de la langue, c'est un identifiant.

Le reste est facultatif, mais bon conseil.

  • Une simple fonction SQL fait le travail ici.

  • Utilisez la syntaxe JOIN explicite. Même résultat, mais beaucoup plus facile à entretenir.

  • Il est probablement inutile d'utiliser varchar(11) au lieu de simplement varchar ou text comme type de paramètre. (Des exceptions de casse d'angle s'appliquent.)

  • Utilisez dollar-quoting - qui est totalement facultatif ici, mais généralement de bon style pour citer le corps de la fonction. Tôt ou tard, vous voudrez inclure des guillemets simples dans le corps.