回答

收藏

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

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

对PL / pgSQL来说是全新的,此函数中双美元符号的含义是什么:
8 }( ~: m( ?" r3 Z5 f1 S' Z5 ~CREATE OR REPLACE FUNCTION check_phone_number(text)
: s; g4 r! {  H1 {5 _+ g" iRETURNS boolean AS $$
& d( n7 S+ n. Y4 }9 e% [BEGIN& r, f. J& v8 v* I2 L" H
  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN
0 S8 V* }( Q( o; {* U% |    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';; }4 c5 X5 p* T+ B# T! L. b& k
  END IF;
6 i0 p7 ]! e. g4 H) H4 @  RETURN true;
6 @* Z! g$ Z6 G8 O8 n: _END;
9 V5 I6 ?" F2 S: c) j) `, G$$ LANGUAGE plpgsql STRICT IMMUTABLE;% a9 [+ v* Z& J+ N) @! m% u8 l
# [- U. D* S* ^9 T% A3 v
我猜想在RETURNS boolean AS $$中$$是一个占位符。
4 B  p  v) U7 M/ p8 a2 ^: n最后一行有点神秘: $$ LANGUAGE plpgsql STRICT IMMUTABLE;
* l# a; t& m2 q1 _- q8 {+ Z顺便说一句,最后一行是什么意思?
( F# e2 N1 h. q               
+ k( ~1 h  `" P7 o" \解决方案:) l- D' F5 Y. I
                - r' q8 `; L9 j+ \" R! V& u

/ P- F$ }1 I9 c4 D$ z  F+ H" }& H$ Z
- o2 |" Y, f8 o9 f                美元符号用于美元报价,并且绝不特定于功能定义。它几乎可以在SQL脚本中的任何地方用于替换单引号。& `8 O5 p$ k) _# l9 z
函数的主体恰好是字符串文字,必须用单引号将其引起来。美元报价是PostgreSQL特定于单引号的替代,以避免在函数体内引用问题。您也可以用单引号编写函数定义。但是,那么您就必须在体内将所有单引号转义:5 p9 d+ v" \" K. C) `
CREATE OR REPLACE FUNCTION check_phone_number(text)5 ?- e% K5 a4 S# S5 h- o  {( V1 ^& m
RETURNS boolean AS
; r3 T$ ~2 u( N4 m4 a3 c+ O'
* @" U6 `& h" UBEGIN8 E9 s8 E0 `- {+ b
  IF NOT $1 ~  e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN
' f; H2 R4 z9 l" J2 |3 v    RAISE EXCEPTION ''Malformed string "%". Expected format is +999 999'';- x9 W8 ?* g9 B) k
  END IF;
8 O0 b: ~" J- c, z# g. V- M  RETURN true;
8 R$ n2 G! b/ Q( wEND+ Z8 [. Q+ q: A5 J( K
' LANGUAGE plpgsql STRICT IMMUTABLE;1 ~7 Q! ^3 m* W
' ?5 O1 K0 H# V9 ^
这不是一个好主意。取而代之的是使用美元引号,更具体地说,还应在它们之间放置一个令牌$$以使其具有唯一性-您可能也想在函数体内使用美元引号。实际上,我经常这样做。
' p* [& X' `  b- x9 E- A7 gCREATE OR REPLACE FUNCTION check_phone_number(text)
, X/ \4 Z& ^% o& y  ]& n9 c  RETURNS boolean  & M) q- k4 N( X4 J
AS5 h/ V; r# T# A& U* J7 ?2 ?
$func$
# q% _8 @( I4 ?( a8 c0 zBEGIN9 c% e/ ]$ [; H5 S+ e
...
, M7 \1 o$ j9 M* YEND
% N- l& Z7 \+ z; H; O$func$  LANGUAGE plpgsql STRICT IMMUTABLE;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则