A parte il tuo problema di quotazione immediata (è stato affrontato correttamente da Jeff), la funzione può essere molto più semplice e veloce in questo modo:
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$;
Punti principali:
-
La tua funzione era ancora interrotta. Riferimenti a
movie_makers.title
emovie_makers.ncrew
non funzionerebbe in questo modo. Ho risolto. -
Usa
RETURN QUERY
invece del ciclo. In questo modo non abbiamo nemmeno bisogno di usare o addirittura dichiarare alcuna variabile. Vedi: -
Facoltativamente, utilizzare l'operatore di corrispondenza delle espressioni regolari senza distinzione tra maiuscole e minuscole
~*
. (Più semplice, non più veloce.)In ogni caso, potresti voler sfuggire ai caratteri speciali. Vedi:
A parte:non ha senso filtrare su una vista che già seleziona 'Fight Club' come unica riga. Per una ricerca significativa, non useresti queste viste...