即時の見積もりの問題は別として(Jeffによって適切に対処されています)、関数は次のようにはるかに単純で高速になります。
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$;
主なポイント:
-
あなたの機能はまだ壊れていました。
movie_makers.title
への参照 およびmovie_makers.ncrew
そのようには機能しません。修正しました。 -
RETURN QUERY
を使用します ループの代わりに。このようにして、変数を使用したり、宣言したりする必要もまったくありません。参照: -
オプションで、大文字と小文字を区別しない正規表現一致演算子
~*
を使用します 。 (より単純で、より速くはありません。)いずれにせよ、特殊文字をエスケープすることをお勧めします。参照:
余談ですが、「ファイトクラブ」を唯一の行としてすでに選択しているビューでフィルタリングすることはほとんど意味がありません。意味のある検索には、これらのビューは使用しません...