回答

收藏

PL / pgSQL中的“ $$”是什么

技术问答 技术问答 284 人阅读 | 0 人回复 | 2023-09-14

对PL / pgSQL来说是全新的,此函数中双美元符号的含义是什么:, L* s/ r6 y- `; ]% ^; t
CREATE OR REPLACE FUNCTION check_phone_number(text)0 a7 y. Y! a3 h8 @
RETURNS boolean AS $$
4 K' X8 E0 \0 j+ |6 U" z* ~BEGIN
% e3 S2 V# L. \% D  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN
' `5 @+ Z( X) Z  k: j3 y; v    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';
% t  ?; O5 j3 O8 e6 q% ^# m  END IF;" z' P$ W, K: m3 p$ V+ c, d9 G  A0 E
  RETURN true;
; w& T9 E5 n! M' uEND;0 \9 ]0 F) Q3 C2 ~5 m+ o
$$ LANGUAGE plpgsql STRICT IMMUTABLE;
# N) Z  I3 u0 U' T  ?3 ~+ X+ ]6 [  H% e/ n7 ~5 a" X
我猜想在RETURNS boolean AS $$中$$是一个占位符。
- d6 S& c' r3 {5 j# J. {( n最后一行有点神秘: $$ LANGUAGE plpgsql STRICT IMMUTABLE;
  L/ m8 I! T8 a, Q0 P  ]顺便说一句,最后一行是什么意思?
, {: w* |! L& }$ ^# x- K2 u- j+ o               
" Y4 ^5 v/ z* L$ i3 ~0 U7 P8 Q解决方案:, x$ A5 p+ _5 `+ m
                : F3 N: ~# F. v' Y0 w

( p1 B, n/ O8 ?0 f9 `* Y/ G% Z' t4 I. S. l
                美元符号用于美元报价,并且绝不特定于功能定义。它几乎可以在SQL脚本中的任何地方用于替换单引号。
$ `2 `& N- K. S: u5 E+ a函数的主体恰好是字符串文字,必须用单引号将其引起来。美元报价是PostgreSQL特定于单引号的替代,以避免在函数体内引用问题。您也可以用单引号编写函数定义。但是,那么您就必须在体内将所有单引号转义:7 g" G$ m$ [; w" z
CREATE OR REPLACE FUNCTION check_phone_number(text)
) u' y& z  Y- w: C' t1 uRETURNS boolean AS
% f  H+ |; `7 D4 o$ g& C- p% v'
* ~% B$ j. W0 a3 a* {BEGIN' o% ^% V; o% R9 J  F( B
  IF NOT $1 ~  e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN
3 ~7 i& ]- g6 O% w, |    RAISE EXCEPTION ''Malformed string "%". Expected format is +999 999'';% ]' @9 @5 x- T* h+ A
  END IF;
* q9 F7 N1 B# P( w2 y  RETURN true;   T5 H/ s) X- i  Q6 b
END0 e6 R; t; _  e. T
' LANGUAGE plpgsql STRICT IMMUTABLE;
% _* d+ x5 i7 w) D/ T" `3 J0 K3 Y2 @1 d/ U; h, f5 J
这不是一个好主意。取而代之的是使用美元引号,更具体地说,还应在它们之间放置一个令牌$$以使其具有唯一性-您可能也想在函数体内使用美元引号。实际上,我经常这样做。9 E1 ?5 H- Q# M2 j2 z6 @
CREATE OR REPLACE FUNCTION check_phone_number(text)
' x" ]: L( m2 F( b* O2 c& o4 G. q6 N  RETURNS boolean  * J7 X- h) c# G9 i  S
AS8 e" T$ z1 l5 s$ U0 m) i$ t0 c
$func$
/ @+ i  ?* o8 |' x% cBEGIN
0 G, e4 ?7 T) M* `5 I% P& w) r ...
" [6 C% j$ o$ P! b1 B& fEND
6 k$ F8 }" Z, W( }( x0 A$func$  LANGUAGE plpgsql STRICT IMMUTABLE;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则