回答

收藏

声明和使用MySQL varchar变量

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

我正在尝试对MySQL 5.0中的变量进行一些简单的操作,但是我无法完全正常工作。我已经看到了很多(非常!)DECLARE /
0 c/ P/ y" U0 V4 \1 c: f$ D! R; uSET的不同语法,我不确定为什么……在任何情况下,我都可能会混淆它们/选择错误的语法/混合它们。' k( M, s$ w+ t. O+ T
这是一个失败的最小片段:, S2 o+ w3 {; F+ w5 {6 ?+ q- e
DECLARE FOO varchar(7);
; h! l7 K4 C6 N- f' L$ d1 WDECLARE oldFOO varchar(7);
( @- }) }, M8 P3 [0 y" oSET FOO = '138';. t5 e; v( {' _, ?0 ?, c
SET oldFOO = CONCAT('0', FOO);
) |7 o0 m0 z! q8 f, [update mypermits
  e9 z1 O' u! q8 J% s/ a   set person = FOO
; C; E0 V% f6 \4 X" P& i" T where person = oldFOO;% V7 ~3 [  V9 P
我也尝试过使用BEGIN … END包装它;并作为一个程序。在这种情况下,MySQL$ `/ q( U. N, g# S# K6 C; {  u
Workbench会帮助我:第一行显示“’)’附近的SQL语法错误”,第二行显示“’DECLARE oldFOO
6 R( H4 v1 p  ~% L- [5 \varchar(7)’附近的SQL语法错误”。否则,它将全部两行都显示为错误,并且两行都带有“ SQL语法错误在…附近”。0 R' a2 O' Q2 k: k
编辑:我忘了提到我在变量上有@s的情况下尝试了它。有的资源有,有的没有。
7 X' C7 A/ G' d/ m我犯了什么愚蠢的错误?1 @4 B0 O9 Z: y; C6 V( |
                8 {8 Q( s6 K  u- W! d5 j) A  h
解决方案:
6 D+ z9 h- {$ f3 |                1 {. J+ u: l& j/ h+ D& j+ d  D
6 k% j: R% o8 ~8 u' h

" _+ ]* Q2 ^0 }: i: _/ D                使用MySQL 5.1.35对我来说效果很好:
& A! A1 T" a2 O- `7 l' g3 T* mDELIMITER $$
% p6 _3 t8 Q# N4 h6 NDROP PROCEDURE IF EXISTS `example`.`test` $$1 g" {# b: M  k
CREATE PROCEDURE `example`.`test` ()4 U/ s- R9 w( t* \3 {
BEGIN
0 T; p8 d4 q2 R* w; j  DECLARE FOO varchar(7);
7 Y- b, k: L3 N! G. J; f  DECLARE oldFOO varchar(7);6 ^! d$ n8 D, i+ k7 O
  SET FOO = '138';' y+ O% P6 c, o- I+ F$ V: x
  SET oldFOO = CONCAT('0', FOO);
8 c/ o6 x& O& f: N* `2 P  update mypermits
( z; E$ T! z: z/ s- Q9 H1 f     set person = FOO
# K9 z8 Y1 a7 v   where person = oldFOO;' Y% ~/ M! v* F
END $$
+ h' E& ^; x9 `: RDELIMITER ;
; h, I/ D. J& h桌子:$ n! I2 _5 j1 ?' N5 p5 I
DROP TABLE IF EXISTS `example`.`mypermits`;
- i0 B' U( g. _4 VCREATE TABLE  `example`.`mypermits` (
% H. n2 t0 B+ i: H# M- E9 B4 f  `person` varchar(7) NOT NULL! P5 ~+ V$ }& }# q) @
) ENGINE=InnoDB DEFAULT CHARSET=latin1;+ {0 k$ i1 D8 L# {9 ^
INSERT INTO mypermits VALUES ('0138');
  C. [: Z6 E% s1 X# ]: d- a+ |CALL test()
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则