web-dev-qa-db-ja.com

PL / pgSQLで使用される「$$」とは

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 $$$$はプレースホルダーです。

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

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

80
vector

ドル記号は dollar quoting に使用され、は機能固有ではありません定義。 SQLスクリプト内のどこでも、実際に単一引用符を置き換えるために使用できます。

関数の本体は、文字列リテラルであり、単一引用符で囲む必要があります。ドル引用符は、関数本体内の引用符の問題を回避するための単一引用符のPostgreSQL固有の代替です。関数定義を単一引用符で書くこともできます。しかし、その後、本文内のすべての単一引用符をエスケープする必要があります。

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 ''Malformed string "%". Expected format is +999 999'';
  END IF;
  RETURN true; 
END
' LANGUAGE plpgsql STRICT IMMUTABLE;

これはあまり良い考えではありません。代わりにドル引用符を使用します。具体的には、$$を一意にするために-関数本体内でも$ -quotesを使用することができます。私は実際にそれをたくさんします。

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

詳細:

2番目の質問について:
最も優れたものを読む マニュアルCREATE FUNCTION サンプルの最後の行を理解します。

111

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

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

関数の作成構文は似ていますが、関数内であらゆる種類のSQL(特にステートメントの終わり、文字)を使用するため、区切り文字を付けないとパーサーがトリップします。だから、あなたの声明を次のように読むべきです:

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

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

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

19
Captain Coder