回答

收藏

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

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

对PL / pgSQL来说是全新的,此函数中双美元符号的含义是什么:
! l, V+ ], s7 [! h3 uCREATE OR REPLACE FUNCTION check_phone_number(text)6 t- y5 s# A0 g, Z( Y) |8 K
RETURNS boolean AS $$
/ c! k. D- w9 Y0 q0 G% C3 MBEGIN. p6 `  s' c) Q5 v4 R' l/ W  H" ~* U
  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN# x% }* ^) U  d' G4 o6 I
    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';! D. C& x4 s" o: }
  END IF;% Q1 j$ _0 I4 v4 D
  RETURN true;
5 u) k4 X- X2 X7 ^/ CEND;
& E& N5 ?* q2 X$$ LANGUAGE plpgsql STRICT IMMUTABLE;
6 [$ u2 f! s; @% a  Y* ~7 Z+ n' \/ Z
我猜想在RETURNS boolean AS $$中$$是一个占位符。1 d. S& l1 W" Y% M9 n# x; a4 U+ m% H
最后一行有点神秘: $$ LANGUAGE plpgsql STRICT IMMUTABLE;9 ?* b& I  q% ]  u' O( j
顺便说一句,最后一行是什么意思?. h+ \4 V" o' K; j8 B
                . F4 V+ X. |) h" u. r2 P2 |9 a
解决方案:) J8 N* L% v% o  k* b8 P6 G6 c
                6 u1 R* I1 j% }' s

$ G+ P+ j' X: d! y! N. r6 a4 u/ z0 \" U+ R2 I
                美元符号用于美元报价,并且绝不特定于功能定义。它几乎可以在SQL脚本中的任何地方用于替换单引号。
) q/ F% I: o2 R0 b+ i$ u函数的主体恰好是字符串文字,必须用单引号将其引起来。美元报价是PostgreSQL特定于单引号的替代,以避免在函数体内引用问题。您也可以用单引号编写函数定义。但是,那么您就必须在体内将所有单引号转义:) N, i3 @6 ?# S& Q0 u+ x4 }# U' n
CREATE OR REPLACE FUNCTION check_phone_number(text)
( g7 F8 w' y( ?. j& H! x" D) aRETURNS boolean AS
9 J5 B% C7 z0 n6 F" H& n4 B'
. d. K( x, l, KBEGIN
! g- Z1 |, d( x% p( N+ s0 K  IF NOT $1 ~  e''^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$'' THEN7 h  L+ {! ]2 q; P+ R0 y) i
    RAISE EXCEPTION ''Malformed string "%". Expected format is +999 999'';' f  f+ N0 J) g+ u
  END IF;. t* o0 @/ @8 z0 f7 F
  RETURN true; 5 j* M9 A, \9 t* b
END
( N, f8 H( w& M' LANGUAGE plpgsql STRICT IMMUTABLE;
+ @3 T- b* b6 X# ^! Z& D8 W* X( k+ {% R3 C+ R* K2 \
这不是一个好主意。取而代之的是使用美元引号,更具体地说,还应在它们之间放置一个令牌$$以使其具有唯一性-您可能也想在函数体内使用美元引号。实际上,我经常这样做。3 R+ N5 ~! k2 b# V7 U, g+ D" n
CREATE OR REPLACE FUNCTION check_phone_number(text)6 U; q- ~8 Q0 {6 n
  RETURNS boolean  
" |5 S. I& i) P  OAS, z( n9 n7 _$ `3 r* K0 q
$func$" o7 V) p/ x0 `
BEGIN/ n; d# a8 c- L  M# ]( e
...
8 T3 j  z" ?. JEND
- r7 v. O( q6 @. L5 I. j$func$  LANGUAGE plpgsql STRICT IMMUTABLE;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则