回答

收藏

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

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

我查看了许多教程,手册和文档,但是仍然无法使用。
7 f+ T& J8 Q* _2 _2 a1 _我正在尝试使用phpMyAdmin创建存储过程。
* W; F6 l6 A/ @0 B9 F: h3 a( w我似乎无法在这里找到错误,SQL错误是如此含糊…
2 J4 q9 u0 U" l0 `7 G  G' u/ a* C/ o+ zCREATE 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)6 {" T+ O$ Y/ @* P$ v2 B
BEGIN
8 i5 b1 y" Z) r+ ]2 H8 l, s8 GDECLARE @realmID INT;& e9 {% V& a* ~9 F
DECLARE @classID INT;& B, [# o6 W+ I( T, y# O
DECLARE @toonID INT;
$ x- v* {% p3 J* N, dSET @realmID = SELECT id FROM realms WHERE realms.name = realm;: J+ [  \$ I7 a
SET @classID = SELECT id FROM classes WHERE classes.name = class_name;0 [8 `. I/ {2 ~4 N
IF NOT @realmID IS NULL AND NOT @classID IS NULL AND @toonID IS NULL THEN5 a% S/ y, I- O/ J$ E
INSERT INTO 1 }5 r2 ^! l& F6 c- Q( e' Z- p
toon (`locale`, `name`, `realm_id`, `faction`, `level`, `class_id`)
8 {, b2 A7 _) x7 s! J" F  `VALUES  O8 A; t. s: ~. H/ L% h
(locale, name, @realmID, faction, toon_level, @classID);# D0 h6 s( `2 W9 l  S
END IF;
% x5 r& m5 [6 _4 G1 y2 b" yEND;: [. Q$ |4 ^! N) S
我现在得到的错误是:
/ q, N6 \: h. \1 i' E  ^2 I! p7 O& J9 k
#1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以在@realmID INT附近使用正确的语法;宣告@classID" h. Y' z$ F5 H5 |. S* {1 A9 W
INT; 声明@toonID INT; 在第3行设置@rea
/ z) }3 j7 k/ T. U

7 x0 f7 g" s: a1 u& s3 ^  @可能是我不得不做的更令人沮丧的事情之一…7 g5 [/ E1 \/ z3 G0 U/ v
我在网上看到了许多教程,这些教程在变量声明中显示了使用@符号,而另一些则没有使用它,我什至还看到了一些使用VAR而不是DECLARE的教程。正确的语法是什么?…
4 Z3 V' ^' c3 [: {" p( ?$ ]$ N               
1 j* H7 A% J: r7 w( x解决方案:
1 L1 S% k  P9 F! H, l) u               
) J1 v( T. P$ }+ T* k, x
0 U9 Q# {  r7 v* \* n. \8 Z
% |4 F' M* m3 n                这可以解决问题:
! ]8 y: d/ o0 QCREATE 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))
% ~* \/ p$ q* b3 K# {- QBEGIN
; r/ `+ n6 z# X1 e- B4 W# F7 M+ DSELECT @realmID := id FROM realms WHERE realms.name = realm;
" x) f. J8 g5 C$ f) k! W* ~SELECT @classID := id FROM classes WHERE classes.name = class_name;" Z0 e: l. O* v" \9 B) E$ |
SELECT @toonID := id FROM toon WHERE toon.name = name AND toon.realm_id = @realmID;
+ r6 Z- h4 M( I4 D$ O% V. t& H& D6 wIF NOT @realmID IS NULL AND NOT @classID IS NULL AND @toonID IS NULL( k+ f- n1 }6 W4 {9 P% O& v! X
THEN   B2 I* d& ~/ K8 h
INSERT INTO toon (`locale`, `name`, `class_id`, `realm_id`, `faction`, `level`)! C$ t9 @+ N& ?0 o# T
VALUES (locale, name, @classID, @realmID, faction, toon_level);
& ~! H8 N8 m: W) [8 u. EEND IF;! y8 {! k! d! m, k/ _1 @3 k+ T1 t) S
END;5 \. L5 b4 k) g2 \
//1 H9 f1 E+ d7 n
显然,不需要声明语句……谁知道呢?
* g' h5 `% S$ I; g感谢Gordon Linoff向我指出了正确的方向。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则