5

私はpostgresを初めて使用し、Stackoverflowで見つけられないように見えるエラーを受け取ります(?)。人が仕事の資格がある場合は true を返し、そうでない場合は false を返す関数を作成しようとしています。これにより、「エラー: 関数がセットを返さない場合、ROWS は適用できません」が発生します。スペイン語でいくつかのものを見つけました-しかし、SOには何もありません。誰かがこれを説明できますか?

CREATE OR REPLACE FUNCTION "isPersonQualifiedForJob"(pid integer, jid integer)
  RETURNS bit AS
'
        IF 
        (SELECT count(*) FROM "getSkillsForJob"("jid") "j" WHERE 
        NOT EXISTS ( 
                    SELECT 1 FROM "getSkillsForPerson"("pid") "p" WHERE "j"."SkillID"="p"."SkillID" 
                   )
        )> 0 
        THEN 
           return 0;
        ELSE
           return 1;
        END IF;
'
  LANGUAGE sql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION "isPersonQualifiedForJob"(integer)
  OWNER TO postgres; 
4

2 に答える 2

8

この行で:

ROWS 1000;

関数から約 1,000 行が返されることを期待しているとプランナーに伝えていますが、1 つの値だけを返すように宣言されています。

RETURNS bit AS
于 2013-03-27T15:03:21.343 に答える
4

メッセージは非常に明確で、ドキュメントは次のとおりです。

ROWS result_rows

プランナーが関数から返されると予想される推定行数を示す正の数。これは、関数がセットを返すように宣言されている場合にのみ許可されます。デフォルトの想定は 1000 行です。

あなたの関数は一連の行を返していませんが、単一のブール値を返しているため、その行を追加する理由がわかりませんROWS 1000(他の関数からコピーして貼り付けますか?)。それを取り除くだけで、大丈夫なはずです。

于 2013-03-27T15:03:21.717 に答える