Dejando a un lado su problema inmediato de cotización (Jeff lo ha abordado correctamente), la función puede ser mucho más simple y rápida de esta manera:
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$;
Puntos principales:
-
Su función todavía estaba rota. Referencias a
movie_makers.title
ymovie_makers.ncrew
no funcionaría de esa manera. Lo arreglé. -
Utilice
RETURN QUERY
en lugar del bucle. De esta manera, tampoco necesitamos usar o incluso declarar ninguna variable. Ver: -
Opcionalmente, use el operador de coincidencia de expresión regular que no distingue entre mayúsculas y minúsculas
~*
. (Más simple, no más rápido.)De cualquier manera, es posible que desee escapar de los caracteres especiales. Ver:
Aparte:apenas tiene sentido filtrar en una vista que ya selecciona 'Fight Club' como su única fila. Para una búsqueda significativa, no usaría estas vistas...