Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建MySQL过程_Mysql_Stored Procedures - Fatal编程技术网

创建MySQL过程

创建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上创建一个存储过程

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)
导致抛出相同的错误

用于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