回答

收藏

MYSQL存储过程:变量声明和条件语句

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

我查看了许多教程,手册和文档,但是仍然无法使用。( ]$ _: n  B; n* T: [
我正在尝试使用phpMyAdmin创建存储过程。8 g  L+ y8 T# s* H9 n. J
我似乎无法在这里找到错误,SQL错误是如此含糊…
. j! v/ K+ }; S) x% R8 Y& l9 s# iCREATE PROCEDURE insertToonOneShot(IN locale CHAR(2), IN name VARCHAR(16), IN realm VARCHAR(24), IN faction CHAR(1), IN toon_level INT, IN class_name INT)4 m4 h" g  C: x  o$ @
BEGIN* ^5 Z2 r! ~3 i- m: c
DECLARE @realmID INT;) F9 J7 U" t. F! V
DECLARE @classID INT;0 r" H0 f' q1 [) V2 y' }
DECLARE @toonID INT;/ v# z# B% x( {1 @8 a
SET @realmID = SELECT id FROM realms WHERE realms.name = realm;
; N0 p$ X+ i& w, w! b" ^SET @classID = SELECT id FROM classes WHERE classes.name = class_name;
* ]) ~4 u) e# aIF NOT @realmID IS NULL AND NOT @classID IS NULL AND @toonID IS NULL THEN
7 Z1 D0 M: D: H; VINSERT INTO
+ ?9 s. J# Z/ Ltoon (`locale`, `name`, `realm_id`, `faction`, `level`, `class_id`)  `- R8 B( G' [" }! L4 f& t- p
VALUES5 }% t6 u. k' n% w9 |6 G
(locale, name, @realmID, faction, toon_level, @classID);5 B4 f6 n& j% W$ [, m
END IF;
5 k. b2 g4 O8 x: a5 YEND;9 T) m4 B' f7 Q7 ^# w( `
我现在得到的错误是:* @! b1 ]1 _7 z4 S
( }8 M  m6 z( L; M: ]5 i
#1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以在@realmID INT附近使用正确的语法;宣告@classID
! X# k' n- {* Y3 |5 ~+ EINT; 声明@toonID INT; 在第3行设置@rea( i" g. Z0 G  d# d

: i4 J4 L! G) ]# y可能是我不得不做的更令人沮丧的事情之一…" x. y3 y9 R) Y! S8 B; A
我在网上看到了许多教程,这些教程在变量声明中显示了使用@符号,而另一些则没有使用它,我什至还看到了一些使用VAR而不是DECLARE的教程。正确的语法是什么?…7 \& \2 b/ {0 d8 x% w2 n- @) d
               
: G6 q+ ^, ?. ~( F2 X解决方案:7 d% o2 W1 E/ ], q, @  Y
                ( ~8 I% w' C/ H. e2 G! c
( J8 Y% M0 t0 x3 ]0 }( t1 \
/ ]: B0 E6 _4 Q2 D5 J
                这可以解决问题:' J1 t7 A' M. H1 }
CREATE PROCEDURE insertToonOneShot(IN locale CHAR(2), IN name VARCHAR(16), IN realm VARCHAR(24), IN faction CHAR(1), IN toon_level INT, IN class_name VARCHAR(12))
! x* k. L, t$ P: aBEGIN7 g+ b6 T2 B, y+ U( a8 _! B( T: ]% S
SELECT @realmID := id FROM realms WHERE realms.name = realm;) g$ Z: \! H2 N* R$ s
SELECT @classID := id FROM classes WHERE classes.name = class_name;
' d. z% ^$ x) ^$ L( SSELECT @toonID := id FROM toon WHERE toon.name = name AND toon.realm_id = @realmID;6 s7 E% _& G, S- K
IF NOT @realmID IS NULL AND NOT @classID IS NULL AND @toonID IS NULL
- u0 Z2 ^# I+ s8 L5 I1 D! Z9 F1 L; ZTHEN " b& L' E0 E: F  a" v) w
INSERT INTO toon (`locale`, `name`, `class_id`, `realm_id`, `faction`, `level`)+ @5 L* y5 ?* M5 \6 _. h# L5 p
VALUES (locale, name, @classID, @realmID, faction, toon_level);! C4 z4 z8 l1 j5 p
END IF;" W# ~" X, Y6 |4 ?8 M# O1 O9 x% B
END;3 `$ z) @# {/ o" C/ Q
//( r0 I" }( n3 ^. y. U3 f0 M/ @
显然,不需要声明语句……谁知道呢?; A3 q3 X( \  B+ q: M
感谢Gordon Linoff向我指出了正确的方向。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则