1. ホーム
  2. postgresql

[解決済み] PL/pgSQLで'$$'は何に使われるのか?

2022-09-15 01:02:42

質問

PL/pgSQLの全くの初心者ですが、以下の2つのドル記号の意味は何でしょうか? この関数 :

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;

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

どのように解決するのですか?

これらのドル記号( $$ ) は ドル引用 であり、これは 関数定義に特有のものではありません。 . 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 を使えば、あなたの例の最後の行を理解することができます。