Mis à part votre problème de citation immédiat (a été correctement traité par Jeff), la fonction peut être beaucoup plus simple et plus rapide comme ceci :
CREATE or REPLACE FUNCTION q11(partial_title text)
RETURNS SETOF text
LANGUAGE plpgsql AS
$func$
BEGIN
RETURN QUERY
SELECT m.title || ' has ' || m.ncrew || ' cast and crew'
FROM movie_makers m
WHERE m.title ~* $1;
IF NOT FOUND THEN
RETURN NEXT 'No matching titles';
END IF;
END
$func$;
Principaux points :
-
Votre fonction était toujours cassée. Références à
movie_makers.title
etmovie_makers.ncrew
ne fonctionnerait pas de cette façon. Je l'ai corrigé. -
Utilisez
RETURN QUERY
au lieu de la boucle. De cette façon, nous n'avons pas non plus besoin d'utiliser ni même de déclarer de variables du tout. Voir : -
Utilisez éventuellement l'opérateur de correspondance d'expression régulière insensible à la casse
~*
. (Plus simple, pas plus rapide.)Dans tous les cas, vous souhaiterez peut-être éviter les caractères spéciaux. Voir :
À part :cela n'a guère de sens de filtrer sur une vue qui sélectionne déjà "Fight Club" comme seule ligne. Pour une recherche significative, vous n'utiliseriez pas ces vues...