Pomijając Twój bezpośredni problem z cytowaniem (został odpowiednio rozwiązany przez Jeffa), funkcja może być znacznie prostsza i szybsza w następujący sposób:
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$;
Główne punkty:
-
Twoja funkcja nadal była zepsuta. Odniesienia do
movie_makers.title
imovie_makers.ncrew
nie działałoby w ten sposób. Naprawiłem to. -
Użyj
RETURN QUERY
zamiast pętli. W ten sposób również nie musimy w ogóle używać ani nawet deklarować żadnych zmiennych. Zobacz: -
Opcjonalnie użyj operatora dopasowania wyrażenia regularnego bez uwzględniania wielkości liter
~*
. (Prościej, nie szybciej.)Tak czy inaczej, możesz chcieć uciec od znaków specjalnych. Zobacz:
Pomijając:nie ma sensu filtrować widoku, w którym jako jedyny wiersz jest już wybrany „Fight Club”. Dla sensownego wyszukiwania nie używałbyś tych widoków ...