【问题标题】:Create MySQL procedures创建 MySQL 过程
【发布时间】:2020-04-24 04:11:19
【问题描述】:

我目前正在尝试在存储在 Google Cloud Platform 上的 MySQL 上创建存储过程。

看到我可以在本地创建过程,SQL 是正确的,但我不知道为什么它不能从命令行运行:

mysql> CREATE PROCEDURE helpme
    -> (
    ->  @cid varchar(4)
    -> )
    -> AS
    -> DECLARE @res_cnt INT
    -> DECLARE @name CHAR(10)
    ->
    -> SELECT @res_cnt = COUNT(*) FROM dbo.TripGuides WHERE GuideNum = @cid
    -> SELECT @name = LastName FROM dbo.Guide WHERE GuideNum = @cid
    -> PRINT @name + ' has ' +  CAST (@res_cnt AS VARCHAR(10))+' guides.';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@cid varchar(4)
)
AS
DECLARE @res_cnt INT
DECLARE @name CHAR(10)

SELECT @res_cn' at line 3
mysql>

我尝试了一些不同的方法,谢谢我遇到了。在声明 @cid 时,我都尝试了

@cid CHAR(4)
@cid VARCHAR(4)

导致抛出相同的错误。

【问题讨论】:

  • 还有@cid是一个用户变量,它不同于过程参数和DECLARE变量。
  • UDV 不能用作参数名称。使用局部变量。
  • @danblack 不,除非您说我必须在通话中添加 DELIMITER。我还希望 @cid 成为用户定义的变量。
  • @akina 我不确定你的意思。

标签: mysql stored-procedures


【解决方案1】:

供 MySQL 使用

CREATE PROCEDURE helpme ( cid VARCHAR(4) )
SELECT CONCAT( ( SELECT LastName 
                 FROM Guide 
                 WHERE GuideNum = cid ), 
               ' has ', 
               ( SELECT COUNT(*) 
                 FROM TripGuides 
                 WHERE GuideNum = cid ), 
               ' guides.'
             ) AS message;

出于好奇,我将如何将 res_cnt 和 name 声明为我之前所做的原始 SQL 调用?

CREATE PROCEDURE helpme ( cid VARCHAR(4) )
BEGIN
    DECLARE res_cnt INT;
    DECLARE `name` CHAR(10);

    SELECT COUNT(*) INTO res_cnt FROM TripGuides WHERE GuideNum = cid;
    SELECT LastName INTO `name` FROM Guide WHERE GuideNum = cid;
    SELECT CONCAT( `name`, ' has ', res_cnt, ' guides.' ) AS output_message;
END

并且不要忘记在这种情况下重新分配 DELIMITER。

【讨论】:

  • 这样确实有效,但直到我删除了 AS。但与此同时,我也不是 100% 确定为什么。所以 CONCAT( ) 将允许我将两个 SELECT 调用一起添加。然后“AS 消息”将打印 CONCAT( ) 中的内容?
  • @dapi 确实有效,但直到我删除了 AS 是的,AS 是多余的 - 已删除。 那么“AS 消息”将打印 CONCAT( ) 中的内容? 不,添加 AS message 是为了更容易在代码中访问它(您可以使用字段名称别名 @ 987654325@ 而不是索引号参考)。别名可以是任何有效的,使用的message 名称是随机的。
  • 好的,我想我明白了。感谢您的宝贵时间。
  • 出于好奇,我将如何将 res_cnt 和 name 声明为我之前所做的原始 SQL 调用?
  • @dapi 我看不出我们可以避免使用中间变量的原因。但如果你愿意 - 你可以......在这种情况下,你必须使用 BEGIN-END 代码块。
猜你喜欢
  • 2016-11-11
  • 2017-10-14
  • 2021-07-10
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 2013-12-19
相关资源
最近更新 更多