2

PostgreSQL 9.0 で関数を作成しようとしています。これは最終的に新しい集計関数で使用されますが、一度に 1 ステップずつ使用されます。これが私がこれまでに持っているものです:

create or replace function encstate(text,text) returns text as $$
DECLARE
  oldstate alias for $1;
  arg alias for $2;
BEGIN
IF length(oldstate)>0 then
  select 'Encrypted';
else if
  select '';
end if;
END; 
$$ language sql strict immutable;

(私はまだ $2 引数を使用していないことを知っています。)

結果は次のとおりです。

ERROR:  syntax error at or near "alias"
LINE 3:   oldstate alias for $1;

ブロックを削除DECLAREし、本体で引数を $1 などとして参照すると、結果は次のようになります。

ERROR:  syntax error at or near "if"
LINE 3:   if length($1)>0 then

私が知る限り、私が持っているものはウェブ上で見つかった例と一致しますが、if ステートメントを含む関数の例が見つからないことを除けば、何が間違っているのかわかりません。どんな助けでも大歓迎です。

4

3 に答える 3

2

これをSQL関数として行うことをお勧めします:

create or replace function encstate(text,text) returns text as $$

SELECT CASE WHEN length($1)>0 then 'Encrypted' ELSE '' END;

$$ language sql strict immutable;

もう一方と同じことを行うこともできますが、sql を plpgsql に変更します。ただし、SQL 関数で実行できることは、通常は SQL 関数で実行する必要があるというのが私の提案です。パフォーマンスが向上し、プランナーはより多くのことを実行できます。

于 2013-03-13T12:13:54.057 に答える
1

SQL

CREATE OR REPLACE FUNCTION encstate(oldstate text, arg text)
  RETURNS text LANGUAGE SQL IMMUTABLE AS
$func$
SELECT CASE WHEN $1 <> '' THEN 'Encrypted' ELSE '' END
$func$

PL/pgSQL

CREATE OR REPLACE FUNCTION encstate(oldstate text, arg text)
  RETURNS text LANGUAGE plpgsql IMMUTABLE AS
$func$
BEGIN
    IF oldstat <> '' THEN
      RETURN 'Encrypted';
    ELSE
      RETURN '';
    END IF;
END 
$func$;

主なポイント

  • length(x) > 0(xであるtext) は、 および のみを除外''NULLます。100% 同等の式を使用してください x <> ''。関数が宣言されているかどうかに関係なく、同じことをより簡単かつ高速に行いますSTRICT

  • 必要がない場合は、 plpgsqlALIASを使用しないでください。互換性と、事前に定義されたパラメーター名の名前を変更するためだけに存在します。マニュアルは、他の目的での使用を積極的に思いとどまらせます。私はそれを決して使用しません。名前付きパラメーターは、バージョン 8.1 以降で使用できます。よりシンプルに、より良く。
    SQL 関数では、PostgreSQL 9.2 以降、(位置パラメータ ( $1, $2, ..) の代わりに) パラメータ名を参照できます。ドキュメントのために、その前でもパラメータに名前を付けることをお勧めします。

  • この関数 (同義語: )を宣言したくないのではないかと思います。同義語が示すように、(任意の)入力で返されます。代わりに空の文字列 ( ) が必要なようです。パフォーマンスへの影響もあります:関数は STRICT 修飾子なしでより速く実行されますか?STRICTRETURNS NULL ON NULL INPUTNULLNULL''

于 2013-03-13T17:07:50.120 に答える