0

使用せずにPostgreSQL関数内で選択できますEXECUTEか? を使用して動的 SQL を作成しようとしquote_ident()ていますが、うまくいきません。

CREATE OR REPLACE FUNCTION select_server(p_id text)
RETURNS integer AS $$ 
DECLARE 
   serialnum_value INTEGER; 
   STATEMENT TEXT;
BEGIN
  STATEMENT := 'tbl' || substr($1, 1, 4);  
  SELECT serialnum INTO serialnum_value FROM quote_ident(STATEMENT ) WHERE id = $1;
  RETURN serialnum;
END;

を使用せずにPostgreSQL関数の動的テーブルから選択する方法を知っている人はいますEXECUTEか?

4

2 に答える 2

1

PL/pgSQLEXECUTEなしでは動的 SQL を実行できません。それがそもそも動的にする理由です

ただし、関数をかなり合理化できます。

CREATE OR REPLACE FUNCTION select_server(p_id text, OUT serial_value integer) AS
$func$ 
BEGIN
   EXECUTE 'SELECT serialnum FROM tbl' || left($1::text, 4)) || ' WHERE id = $1'
   USING $1
   INTO  serial_value;
END
$func$ LANGUAGE plpgsql STRICT;
  • 通常、識別子をサニタイズする必要があります。
    ただし、この特別なケースでは必要ありません quote_ident()。唯一の動的コンポーネントはinteger. この方法では、SQL インジェクションも不正な識別子もあり得ません。

  • 句を使用して値として値を渡します。p_idUSING

  • 割り当ての数を減らします。これらはplpgsqlでは比較的高価です。すべてを実行するために必要な SQL ステートメントは 1 つだけです。

  • パラメータは、構文を短縮するのOUTに役立ちます。

  • 関数STRICT( ) もas inputRETURNS NULL ON NULL INPUTでは意味がないので作りました。NULL

  • left()よりもわずかに高速ですsubstr()

于 2013-10-02T13:01:06.180 に答える