回答

收藏

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

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

对PL / pgSQL来说是全新的,此函数中双美元符号的含义是什么:* D7 r7 r/ V# \( r
CREATE OR REPLACE FUNCTION check_phone_number(text): a+ W* }  u; p9 |6 R0 v- }; u
RETURNS boolean AS $$
- V$ _* {$ X  `% G' b1 SBEGIN$ M6 Y% o3 A6 K. z4 j( I
  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN
+ G/ T' _& r5 e1 ]1 J    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';; T, X$ B) |2 T$ A  V
  END IF;. i$ R) {- U  S% b
  RETURN true; / y- s" ^* I5 K. l/ u6 l
END;* [" ]) e& ]" G$ }# b+ ?
$$ LANGUAGE plpgsql STRICT IMMUTABLE;
  d' R2 c+ p: f: `3 [( U- @1 F- G8 B8 Y/ o
我猜想在RETURNS boolean AS $$中$$是一个占位符。: c% s; d$ p9 s9 x, L$ z
最后一行有点神秘: $$ LANGUAGE plpgsql STRICT IMMUTABLE;6 P' ~8 O# @% u% ^: T
顺便说一句,最后一行是什么意思?; V2 s& h% Y, {! r, |% L% V4 f3 b
                ( T( M* ?; X6 P
解决方案:, k) j0 }5 e% M: l
                : F4 O7 o% q( w

! Q4 b: D* _/ ~2 O' Z6 `1 q2 p
7 s, w7 y! y" n  ?7 i; Q* C; `' E/ x2 }                美元符号用于美元报价,并且绝不特定于功能定义。它几乎可以在SQL脚本中的任何地方用于替换单引号。* L2 e2 a/ S: l$ l4 w# v1 M) S
函数的主体恰好是字符串文字,必须用单引号将其引起来。美元报价是PostgreSQL特定于单引号的替代,以避免在函数体内引用问题。您也可以用单引号编写函数定义。但是,那么您就必须在体内将所有单引号转义:3 E) _2 {% g( }. d
CREATE OR REPLACE FUNCTION check_phone_number(text)8 n, a1 h; b# L4 G  f2 E$ n
RETURNS boolean AS
/ n2 [' I, {8 U1 o7 D6 \; c: `'
& B9 V- t+ U: T$ D; JBEGIN9 R" E0 z; H9 O
  IF NOT $1 ~  e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN
8 x6 C3 ~. H& L+ ]; i' r" V    RAISE EXCEPTION ''Malformed string "%". Expected format is +999 999'';
& ~% r( L1 r, H9 H$ B  END IF;
6 h! ^* V/ {9 s& N' v  RETURN true;
/ u) T& L. e! _) IEND
, {  m1 f# w# J3 j' LANGUAGE plpgsql STRICT IMMUTABLE;8 j! f) Y. S' e5 X! S1 K
% S+ i! c2 R" C0 D6 h" x0 N0 Q; ]
这不是一个好主意。取而代之的是使用美元引号,更具体地说,还应在它们之间放置一个令牌$$以使其具有唯一性-您可能也想在函数体内使用美元引号。实际上,我经常这样做。
: q7 u! Z: e6 t4 P, v. JCREATE OR REPLACE FUNCTION check_phone_number(text)
* J! `: K1 V/ j* K0 l0 H% O0 M+ ]  RETURNS boolean  
6 q: A# O1 y' r7 LAS( [' _$ ]% T7 K1 a
$func$
/ L8 w  i" l9 V$ iBEGIN- D: p6 g. |3 R! a! \# V
...8 t  |) ?  U5 x+ g
END
: C  ^0 M9 \: E4 n7 Z$func$  LANGUAGE plpgsql STRICT IMMUTABLE;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则