118

PL/pgSQL はまったく新しいので、この関数の二重のドル記号の意味は何ですか:

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS $$
BEGIN
  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN
    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';
  END IF;
  RETURN true; 
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;

RETURNS boolean AS $$inは$$プレースホルダーだと思います。

最後の行は少し謎です:$$ LANGUAGE plpgsql STRICT IMMUTABLE;

ところで、最後の行はどういう意味ですか?

4

2 に答える 2

175

これらのドル記号 ( $$) はドル引用符に使用されますが、これは関数定義に固有​​のものではありません。SQL スクリプト内の任意の場所で、文字列リテラル (定数) を囲む単一引用符を置き換えるために使用できます。

関数の本体はたまたまそのような文字列リテラルです。ドル引用符は、ネストされた単一引用符のエスケープを (再帰的に) 回避するための単一引用符の PostgreSQL 固有の代替手段です。関数本体を一重引用符で囲むこともできます。ただし、本文内のすべての単一引用符をエスケープする必要があります。

CREATE OR REPLACE FUNCTION check_phone_number(text)
  RETURNS boolean
  LANGUAGE plpgsql STRICT IMMUTABLE AS
'
BEGIN
  IF NOT $1 ~  e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN
    RAISE EXCEPTION ''Malformed string "%". Expected format is +999 999'';
  END IF;
  RETURN true; 
END
';

これはあまり良い考えではありません。代わりにドル引用符を使用してください。より具体的には、$$各ペアを一意にするために の間にトークンを挿入します。関数本体内でネストされたドル引用符を使用することもできます。実際、私はそれをたくさんします。

CREATE OR REPLACE FUNCTION check_phone_number(text)
  RETURNS boolean  
  LANGUAGE plpgsql STRICT IMMUTABLE AS
$func$
BEGIN
 ...
END
$func$;

見る:

2 番目の質問について:
最も優れたマニュアルCREATE FUNCTIONを読んで、例の最後の行を理解してください。

于 2012-08-29T06:54:07.020 に答える
21

$$は、関数定義の開始位置と終了位置を示すために使用する区切り文字です。次のことを考慮してください。

CREATE TABLE <name> <definition goes here> <options go here, eg: WITH OIDS>

create関数の構文は似ていますが、関数であらゆる種類のSQL(特にステートメントの終わり;文字)を使用するため、区切り文字を指定しないとパーサーが作動します。したがって、ステートメントを次のように読む必要があります。

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS <code delimited by $$> LANGUAGE plpgsql STRICT IMMUTABLE;

実際の定義の後のものは、データベースに関数に関するより多くの情報を提供するためのオプションであるため、その使用法を最適化できます。

実際、マニュアルの「4.1.2.2。ドル引用文字列定数」を見ると、ドル記号の間に文字を使用することもでき、すべて1つの区切り文字としてカウントされることがわかります。

于 2012-08-27T15:21:04.080 に答える