创建MySQL过程
我目前正试图在谷歌云平台上存储的MySQL上创建一个存储过程 SQL是正确的,因为我可以在本地创建该过程,但我不明白为什么它不能从命令行工作:创建MySQL过程,mysql,stored-procedures,Mysql,Stored Procedures,我目前正试图在谷歌云平台上存储的MySQL上创建一个存储过程 SQL是正确的,因为我可以在本地创建该过程,但我不明白为什么它不能从命令行工作: mysql> CREATE PROCEDURE helpme -> ( -> @cid varchar(4) -> ) -> AS -> DECLARE @res_cnt INT -> DECLARE @name CHAR(10) -> -&
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)
导致抛出相同的错误 用于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调用
在这种情况下,不要忘记重新分配分隔符。这是否回答了您的问题?另外,
@cid
是一个用户变量,它不同于过程参数和声明
变量。UDV不能用作参数名称。使用局部变量。@danblack否,除非您说我必须在调用中添加分隔符。我还希望@cid是一个用户定义的变量。@akina我不确定你的意思。所以这确实有效,但直到我删除了AS。但同时我也不完全确定为什么。因此CONCAT()将允许我同时添加两个SELECT调用。然后,“AS message”将打印CONCAT()?@dapi中的任何内容,该内容确实有效,但直到我删除AS Yes,AS
被过度删除。然后“AS message”将打印CONCAT()中的内容?否,AS message
已添加,以便于在代码中访问它(您可以使用字段名别名message
而不是索引编号引用)。别名可以是任何有效的,使用的消息
名称是随机的。好的,我想我知道了。谢谢您的时间。只是出于好奇,我该如何声明res_cnt和name作为我之前执行的原始SQL调用?@dapi我不认为有理由使用中间变量,因为我们可能会避免这种情况。但是如果你愿意,你可以。。。在这种情况下,必须使用BEGIN-END代码块。
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