我有以下程序:
CREATE PROCEDURE `Teleport` (INOUT sel VARCHAR(256), INOUT tar VARCHAR(256))
BEGIN
DECLARE self VARCHAR(100);
DECLARE target VARCHAR(100);
DECLARE tarpos VARCHAR(100);
SET self = (SELECT PlayerUID FROM player_data WHERE PlayerName = sel LIMIT 1);
SET target = (SELECT PlayerUID FROM player_data WHERE PlayerName = tar LIMIT 1);
SET tarpos = (SELECT Worldspace FROM character_data WHERE PlayerUID = target LIMIT 1);
UPDATE character_data SET Worldspace = tarpos WHERE PlayerUID = self;
END
我现在想要使用CALL Teleport('玩家A','玩家B')来调用该程序;
运行呼叫查询时, - > “OUT或INOUT参数1用于例行测试.Teleport不是BEFORE触发器中的变量或NEW伪变量”是结果。
答案 0 :(得分:0)
OUT or INOUT argument 1 for routine test.Teleport is not a variable or NEW pseudo-variable in BEFORE trigger
目前还不清楚你究竟在问什么,但你得到的实际错误的问题与此有关:
CREATE PROCEDURE `Teleport` (INOUT sel VARCHAR(256), INOUT tar VARCHAR(256))
^^^^^ ^^^^^
存储过程参数可以是IN
,OUT
或INOUT
。后两种变体允许通过过程设置变量的值(OUT
)或读取和设置(INOUT
)。你用两个字符串文字调用你的程序,'玩家A'和'玩家B'。
使用字符串文字作为参数对于INOUT
(或OUT
,出于完全不同的原因)参数无效,它仅适用于IN
。
由于您的过程(如图所示)实际上并未修改“sel”和“tar”的值,因此似乎没有理由使用INOUT
。将其更改为IN
,该过程不会返回该错误。
另一方面,如果你确实有这样的理由需要INOUT
(我怀疑,但会为了彻底性而解释),那么调用这个程序的唯一方法就是设置值为用户定义的变量并使用变量作为参数(或在触发器中使用NEW
伪行,如错误所示)。
mysql> SET @p1 = 'Player 1', @p2 = 'Player 2';
mysql> CALL Teleport(@p1,@p2);