[解決済み] 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
を使えば、あなたの例の最後の行を理解することができます。
関連
-
PostgresqlのデータベーステーブルのデータをExcel形式にエクスポートする方法(推奨)
-
[解決済み] PostgreSQLからのPL/pgSQL出力をCSVファイルに保存する
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み] 特殊なドル記号のシェル変数とは何ですか?
-
[解決済み] PostgreSQLデータベースにアクティブな接続がある場合、そのデータベースを削除する方法は?
-
[解決済み] postgres の主キー配列が同期しなくなったときにリセットする方法は?
-
[解決済み] YAMLです。YAML の文字列には引用符が必要ですか?
-
[解決済み] 'ユーザー "postgres" のパスワード認証に失敗しました'
-
[解決済み] リレーションシップのパーミッションが拒否されました
-
[解決済み] Postgres/SQLで2つの整数の最小値/最大値を取得する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Postgresqlのデータベース権限まとめ
-
Postgresqlの操作でSQL文の実行効率を表示する
-
oracle_fdwを介してOracleデータにアクセスするためのPostgreSQLの手順
-
PostgreSQLのデータベースでLIKE文の効率を確保する方法(推奨)
-
Postgresql+Springboot ymlの基本的な使い方
-
[解決済み] PostgreSQLのユーザーパスワードを変更する方法を教えてください。
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] 'ユーザー "postgres" のパスワード認証に失敗しました'
-
[解決済み] PostgreSQL は設定/conf ファイルをどこに保存しますか?
-
[解決済み] Postgres / PostgreSQLのテーブルとインデックスのディスクサイズはどのように見つけるのですか?