回答

收藏

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

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

对PL / pgSQL来说是全新的,此函数中双美元符号的含义是什么:0 ]3 [1 q4 L8 Y5 p4 [
CREATE OR REPLACE FUNCTION check_phone_number(text)$ M( c: k$ Y8 G7 i
RETURNS boolean AS $$
& x, x6 F2 m) N" m4 v+ S; W2 U3 G3 K5 XBEGIN4 v. L: O( C4 |/ u; l
  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN' a" j5 ~; P$ @# P7 s5 a
    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';- x+ W0 U& Q  ^/ f
  END IF;
: {5 J8 p4 K  E, ], K; ]8 v# B  RETURN true; * v  [' a/ {, ^3 S. K
END;
+ W; V0 N" q: c( y$$ LANGUAGE plpgsql STRICT IMMUTABLE;
6 t% k: U& t( @+ ?- I
. [3 q" X2 Q& c# h1 {我猜想在RETURNS boolean AS $$中$$是一个占位符。
3 i- x/ P$ i# q! H" U" E; |  k# l- d最后一行有点神秘: $$ LANGUAGE plpgsql STRICT IMMUTABLE;
" |$ J3 c$ x) O+ U* V顺便说一句,最后一行是什么意思?1 t: s& I! I4 j! h' W% E+ ^
                ' Q+ v4 f7 n$ H/ U  v( `
解决方案:
2 M% b. |' J5 c( m- u; K                + T: e7 Q4 j- x, E

  z; x; @4 P0 e. e. o" G8 `3 r' q9 f9 z' V: j% ^
                美元符号用于美元报价,并且绝不特定于功能定义。它几乎可以在SQL脚本中的任何地方用于替换单引号。
. j! g( r" P5 b' K1 J* J6 v8 k函数的主体恰好是字符串文字,必须用单引号将其引起来。美元报价是PostgreSQL特定于单引号的替代,以避免在函数体内引用问题。您也可以用单引号编写函数定义。但是,那么您就必须在体内将所有单引号转义:
: y2 J9 t1 P* C% aCREATE OR REPLACE FUNCTION check_phone_number(text)
% ]0 j& j, b! {3 A3 i  u2 ^4 t( SRETURNS boolean AS
! p$ i  D* e( H: L'/ r1 p. V2 n+ H9 o3 Z2 A
BEGIN* H; S; T( h$ n. w
  IF NOT $1 ~  e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN
+ ]  q6 l- U0 z, \8 g$ N: n4 m8 S    RAISE EXCEPTION ''Malformed string "%". Expected format is +999 999'';7 J3 p  _- u9 I7 e( T4 O0 I2 ?# k( t
  END IF;
( N3 u6 }- w4 J5 A6 @! M( b  RETURN true; $ t3 t0 C: L" t/ d7 }
END  x& H' v( U2 j% z# o+ D3 V
' LANGUAGE plpgsql STRICT IMMUTABLE;4 _# m) {) H8 Z; Q7 ^2 a

) a5 \" |; y  m- }9 u这不是一个好主意。取而代之的是使用美元引号,更具体地说,还应在它们之间放置一个令牌$$以使其具有唯一性-您可能也想在函数体内使用美元引号。实际上,我经常这样做。
' ~% ]; X/ z5 X9 |' |6 {, FCREATE OR REPLACE FUNCTION check_phone_number(text)" s/ A. {: y* x; h7 G5 I
  RETURNS boolean  
5 x# Z* |. ^. u1 }( u, D/ j( K; H# iAS5 ~7 I6 \0 r' Z3 }; n9 v
$func$- T7 I4 _% ^" u& Y9 i) a
BEGIN
! |) ^* V: A. }0 }8 M ...* I4 m# O* h! f
END
! Z$ V8 ^: N" ~$func$  LANGUAGE plpgsql STRICT IMMUTABLE;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则