【问题标题】:How to prompt for input in stored procedure如何在存储过程中提示输入
【发布时间】:2013-11-28 06:25:06
【问题描述】:

我的程序如下:

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('Player A', 'Player B');

调用查询运行时,->“OUT or INOUT argument 1 for routine test.Teleport is not a variable or NEW pseudo-variable in BEFORE trigger”是结果。

【问题讨论】:

  • 这真的不清楚你在问什么。你是在问如何调用存储过程吗?或者如何创建一个?
  • LIMIT 1 应该在括号内。
  • 如何创建,我想创建“东西”,用户将运行过程/函数/查询,并提示用户输入。然后将其存储到两个变量中。
  • 我不认为 MySQL 可以提示用户输入。用户在调用过程时应提供参数。
  • CALL Teleport('input1', 'input2');

标签: mysql stored-procedures


【解决方案1】:
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))
                             ^^^^^                   ^^^^^

存储过程参数可以是INOUTINOUT。后两种变体允许通过过程设置变量的值 (OUT) 或读取和设置 (INOUT)。您正在使用两个字符串文字“Player A”和“Player B”调用您的过程。

使用字符串文字作为参数对INOUT(或OUT,出于完全不同的原因)参数无效,它仅适用于IN

由于您的过程如图所示,实际上并没有修改“sel”和“tar”的值,因此似乎没有理由使用INOUT。将其更改为IN,该过程将不会返回该错误。

另一方面,如果您确实有理由将其设为 INOUT(我对此表示怀疑,但为了彻底起见将解释),那么调用此过程的唯一方法是将值设置为用户定义变量并将变量用作参数(或在触发器中使用NEW 伪行,如错误所示)。

mysql> SET @p1 = 'Player 1', @p2 = 'Player 2';
mysql> CALL Teleport(@p1,@p2);

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 2013-01-12
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多