回答

收藏

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

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

我查看了许多教程,手册和文档,但是仍然无法使用。! {" c% q. i8 i
我正在尝试使用phpMyAdmin创建存储过程。( t2 A1 ^6 J8 w+ d8 m+ _  ^
我似乎无法在这里找到错误,SQL错误是如此含糊…! T8 o- G8 M& h7 A" V
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 INT)
. L# v: y: r. n3 l# ~BEGIN
5 D3 q% Q: P1 HDECLARE @realmID INT;3 D: J$ w1 H# x' v( v) t. F; P
DECLARE @classID INT;
0 C3 L/ Z9 G# x8 R4 TDECLARE @toonID INT;
+ _" J( B" M+ v  y9 p& D' DSET @realmID = SELECT id FROM realms WHERE realms.name = realm;
  m! q+ U1 I2 S* }% @2 CSET @classID = SELECT id FROM classes WHERE classes.name = class_name;" @% J9 o  Q* b% A9 _& E
IF NOT @realmID IS NULL AND NOT @classID IS NULL AND @toonID IS NULL THEN* C6 F) j1 e6 [( s9 T2 a" Y
INSERT INTO ; a9 H7 ^4 {$ z9 J& S1 e
toon (`locale`, `name`, `realm_id`, `faction`, `level`, `class_id`)
: s$ X' A: ?) A3 D' R7 UVALUES
- c+ k3 Y; O) B(locale, name, @realmID, faction, toon_level, @classID);! {& k4 Y# R) F/ u/ z8 c
END IF;: R8 M0 F- Z1 v# l8 d
END;  u! L7 S; M7 f4 b* z8 k# d8 c  y
我现在得到的错误是:
& ~/ K# F% x& J- I# K
. @" G3 f" D1 C8 B' s* u5 I#1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以在@realmID INT附近使用正确的语法;宣告@classID
& ?1 M0 R1 S  f( Y) H! zINT; 声明@toonID INT; 在第3行设置@rea
  M8 @1 ?; ~. M/ T' G

( J3 p3 W) F+ Q& Q- _4 Z可能是我不得不做的更令人沮丧的事情之一…
+ O" H! O& K- o' a  d, L我在网上看到了许多教程,这些教程在变量声明中显示了使用@符号,而另一些则没有使用它,我什至还看到了一些使用VAR而不是DECLARE的教程。正确的语法是什么?…2 {, K: j5 X, ~3 f# _3 K
               
& Z: `4 ?) S1 f& j3 V+ t解决方案:" I# t) E" {: M; X
               
1 ^- ]9 O' ^5 e/ G1 `* Y4 p1 F; z
9 c; u+ l0 l' _, [
. u- E( k& N0 C                这可以解决问题:+ v4 u; M/ B' F9 `2 q' z* M
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))
! E2 H2 K0 b' S, U0 X# SBEGIN
, B) Q! W9 V& g3 @  n( D9 y+ V" VSELECT @realmID := id FROM realms WHERE realms.name = realm;$ t$ [& |0 }5 R+ h# d
SELECT @classID := id FROM classes WHERE classes.name = class_name;1 f% c7 p7 L4 h/ ~# l8 ?& V
SELECT @toonID := id FROM toon WHERE toon.name = name AND toon.realm_id = @realmID;0 J1 ?9 q0 B7 Z3 w8 P" w
IF NOT @realmID IS NULL AND NOT @classID IS NULL AND @toonID IS NULL
; ^: b0 f) k& e* kTHEN " L9 d" K; K9 ^& z  u* m2 z
INSERT INTO toon (`locale`, `name`, `class_id`, `realm_id`, `faction`, `level`)
+ g) H. }8 U( z0 a6 \4 QVALUES (locale, name, @classID, @realmID, faction, toon_level);/ F! D  p( _( H8 k- o5 N
END IF;
2 _% I/ Y9 l% h# V8 F( m9 S1 wEND;- F( y: A# A+ H4 U- ?
//
* o1 y7 }! \9 Q$ z" i/ r5 z3 v显然,不需要声明语句……谁知道呢?
- d8 b2 r" a0 @+ j* `3 c感谢Gordon Linoff向我指出了正确的方向。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则