回答

收藏

MySQL存储过程接受带有多个参数的字符串

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

我想创建一个存储过程,该存储过程接受IN参数中的所有值作为单个字符串。
8 \% n5 Q& @1 p, EDELETE FROM object
$ o, k3 g4 a" e" b' ~WHERE Type NOT IN
  P4 K# r; @+ G& M    ('ListGrid',/ W& F+ x6 L! S* n4 B% G
     'TextField',! B; J# h* a2 @( J3 V, o, ]% e
     'SpinBox',
! J: D+ L' v9 i0 [3 Y# X% x$ ^     'MenuButton',
0 @9 V! f. S( k+ t% V4 x: c     'ListGrid',! D3 }2 P( x4 T7 a: C% D) P: Y; a
     'RadioButton',/ l/ N# I' B0 s! W
     'DropDown',& u/ W1 m/ O5 i" ?! D
     'PopUp',
9 c) G  G9 S" p) H3 [/ t     'Element',' S4 y& r% U+ U
     'Checkbox',; w. v7 T; k# }
     'TreeDropDown',
: j. Y- \* Z. i/ O- Q0 X6 Q1 o  Q: A$ z     'TblColumn',7 U  c/ D' _" {4 F3 U
     'Button',
6 q4 x' ~& y4 x- `: K     'Link',9 F/ i* n7 {2 Y+ h
     'Filter',
" ]9 U/ N; S2 d; F' R! F     'TblRow',
+ \+ l5 d% m) n4 M+ `" ]     'GridRow',
% _4 {  b7 `! [# F     'Popup')# c8 @$ P, Y* ]
这是我尝试过的一个示例,但是没有用。
& N- h0 g+ f5 oDELIMITER //+ ^$ D; c- o% i( G5 U
CREATE PROCEDURE deleteObjectTypes(IN p_type VARCHAR(255))
: X1 W( k4 ~. zBEGIN
5 b4 Q  h5 k4 ?- l4 ASET @query = CONCAT ('DELETE FROM object WHERE Type NOT IN (',p_type,')');
8 R" W7 C- q; Y6 b- FPREPARE stmt FROM @query;
/ e; A" f6 `/ Z7 D5 @4 Q: `0 GEXECUTE stmt;/ x7 S! @9 g( t* }7 T3 V7 [# a! D
DEALLOCATE PREPARE stmt;
5 g0 t. B' x6 eEND //
0 Z1 h; A, \, j, x5 a# U% u/ K9 zDELIMITER ;, z! m, s9 j$ s
我收到以下错误:
% {1 _! ?7 d$ Y+ q5 Q5 V" W#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''List)' at line 1
2 k6 g7 y0 o4 G0 I运行此查询时:: W6 Z% B# w( x
CALL deleteObjectTypes("'ListGrid1','TextField1','SpinBox1','MenuButton1','ListGrid2','TextField2','SpinBox2','MenuButton2','ListGrid3','TextField3','SpinBox3','MenuButton3','ListGrid4','TextField4','SpinBox4','MenuButton4','ListGrid5','TextField5','SpinBox5','MenuButton5','ListGrid6','TextField6','SpinBox6','MenuButton6'")
% ]& `- S1 T; u- N# v1 @               
$ _0 r  |; U9 M4 n% D) N解决方案:" B( O$ l$ ^- P7 }2 C' E* i. p
                2 v! x  v5 q! x6 d) M: n9 i- R
' y7 o$ w; @" m. d' D* f
0 ~. t% A+ @/ `7 K% e
                您需要将VARCHAR大小更改为最大值(或较低的有效值)。
2 g1 _/ _- g+ QDELIMITER //" J6 t' c: f1 ?! \6 @
CREATE PROCEDURE deleteObjectTypes(IN p_type VARCHAR(65535))+ {; W" H( {' g7 g- K0 L  k
BEGIN7 ]* h1 O, m6 j" K
    SET @query = CONCAT ('DELETE FROM object WHERE Type NOT IN (',p_type,')');
; }3 Z) c2 M# j) \2 G0 b    PREPARE stmt FROM @query;
: w4 z3 U6 V: N    EXECUTE stmt;
7 U4 A* B. n5 f) O8 E  Y5 h    DEALLOCATE PREPARE stmt;- x$ e  [% x$ p% T; P
END //+ Z$ M8 f% U: ^. y9 q
DELIMITER ;6 |  m6 @3 N' z* N* \
但是,请注意,如果使用多字节字符集,则限制会更低:
8 k4 O8 c6 C2 M3 S3 L7 iVARCHAR(21844) CHARACTER SET utf8
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则