Deixando de lado o seu problema de cotação imediata (foi abordado corretamente por Jeff), a função pode ser muito mais simples e rápida assim:
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$;
Pontos principais:
-
Sua função ainda estava quebrada. Referências amovie_makers.title
emovie_makers.ncrew
não funcionaria assim. Eu consertei isso.
-
UseRETURN QUERY
em vez do laço. Dessa forma, também não precisamos usar ou mesmo declarar nenhuma variável. Ver:
-
Opcionalmente, use o operador de correspondência de expressão regular sem distinção entre maiúsculas e minúsculas~*
. (Mais simples, não mais rápido.)
De qualquer forma, você pode querer escapar caracteres especiais. Ver:
A parte:dificilmente faz sentido filtrar em uma visão que já seleciona 'Fight Club' como sua única linha. Para uma pesquisa significativa, você não usaria essas visualizações...