回答

收藏

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

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

对PL / pgSQL来说是全新的,此函数中双美元符号的含义是什么:
8 \6 M' D6 a& u5 xCREATE OR REPLACE FUNCTION check_phone_number(text)2 O* s! A0 l9 B8 x  F' y
RETURNS boolean AS $$
( `6 \1 v: i' C/ R' uBEGIN
: e1 D, P% [$ t8 n8 J  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN& \! }* [9 Z6 w- M! {
    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';. `: t; v1 j  w* X2 m
  END IF;
1 H& W0 b2 e, \  h( r4 H  RETURN true;
' k4 h, S. c! |END;
) S/ g2 L" ^6 a$$ LANGUAGE plpgsql STRICT IMMUTABLE;
0 P' t* J( s. b0 M' t0 |/ j" n' t$ z) @8 C' @& i, e
我猜想在RETURNS boolean AS $$中$$是一个占位符。
* G1 U1 c) D9 {! S" K最后一行有点神秘: $$ LANGUAGE plpgsql STRICT IMMUTABLE;
) P3 a) E4 S  ]- b: n顺便说一句,最后一行是什么意思?
6 G( g0 i2 @$ y9 m               
  @+ x) \! C8 F解决方案:
/ P# _' h8 w6 T/ h+ S                5 v* N# z! d1 s, m/ V9 u4 W1 E2 P* P
4 Q/ s! H; D5 D( k/ T9 y9 A

9 u1 U1 E6 g( S' ?, V                美元符号用于美元报价,并且绝不特定于功能定义。它几乎可以在SQL脚本中的任何地方用于替换单引号。
! ?9 O- m/ }) r* q函数的主体恰好是字符串文字,必须用单引号将其引起来。美元报价是PostgreSQL特定于单引号的替代,以避免在函数体内引用问题。您也可以用单引号编写函数定义。但是,那么您就必须在体内将所有单引号转义:
- S# G4 {- g% m! G  {) Y, gCREATE OR REPLACE FUNCTION check_phone_number(text), l$ H  z2 s$ Q
RETURNS boolean AS8 T) O9 x8 R, u4 w# S, }, _
'7 R: i& o& o7 o1 ^1 F5 y, `, n
BEGIN
& x! }0 R. N# m. k0 s2 F  IF NOT $1 ~  e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN
7 y5 ?1 O. Q) _    RAISE EXCEPTION ''Malformed string "%". Expected format is +999 999'';/ P0 @% z6 i  V
  END IF;
6 `4 ?% H" F, n  RETURN true;
0 f- ^! w6 q, \: H" w$ j2 bEND
# z: w& e- |( Y# v, ?8 x& w  F' LANGUAGE plpgsql STRICT IMMUTABLE;. j5 M$ V% E  d) O" _& r& L
/ m6 W& Y2 e4 X# V
这不是一个好主意。取而代之的是使用美元引号,更具体地说,还应在它们之间放置一个令牌$$以使其具有唯一性-您可能也想在函数体内使用美元引号。实际上,我经常这样做。
9 M$ x# S& C7 [+ y9 lCREATE OR REPLACE FUNCTION check_phone_number(text)
! J; F( x8 q( x1 D! ^  RETURNS boolean  
8 K4 m; W' Y  ]0 d, R+ M& rAS
1 P. _. P& @/ B$func$
; W* j% s0 j+ MBEGIN
3 `6 j) b5 z1 ?3 c" V  @/ b ...
  F  w- [5 f+ L8 h6 lEND* A% l& j6 g* R9 O
$func$  LANGUAGE plpgsql STRICT IMMUTABLE;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则