plpgsql関数には何の問題もありません もう少し複雑なもののために。パフォーマンスが低下する可能性がある唯一の状況は、plpgsql関数がネストされている場合です。これは、クエリプランナーが、外部クエリのコンテキストで含まれているコードをさらに最適化できず、速度が低下する場合と低下しない場合があるためです。
詳細については、後で説明します。回答:
- PostgreSQL関数の言語sqlと言語plpgsqlの違い
手元にある場合は、多くのCASE
よりもはるかに簡単です。 クエリの句:
CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int)
RETURNS SETOF stuff AS
$func$
BEGIN
RETURN QUERY EXECUTE '
SELECT *
FROM stuff
WHERE col = $1
ORDER BY ' || quote_ident(_orderby) || ' ASC
LIMIT $2'
USING _param, _limit;
END
$func$ LANGUAGE plpgsql;
電話:
SELECT * FROM get_stuff('hello', 'col2', 100);
メモ
RETURN QUERY EXECUTE
を使用します クエリの結果を一度に返します。
quote_ident()
を使用します SQLiから保護するための識別子。
またはformat()
もっと複雑なもののために。参照:
- PostgreSQL関数パラメータとしてのテーブル名
USING
を使用してパラメータ値を渡します キャスト、引用、SQLiをもう一度避けるための句。
パラメータと列名の間に名前の競合が発生しないように注意してください。パラメータ名の前にアンダースコア(_
)を付けました )例では。私の個人的な好みです。
parent
のみを返すため、編集後の2番目の関数は機能しません。 戻りタイプがSETOF stuff
と宣言されている間 。 任意を宣言できます 好きなタイプを返しますが、実際の戻り値は宣言と一致する必要があります。 RETURNS TABLE
を使用することをお勧めします そのために。