【问题标题】:Stored Procedure with syntax error有语法错误的存储过程
【发布时间】:2015-09-02 04:42:02
【问题描述】:

下面的代码让我很头疼,我需要为数据库创建这个存储过程,但是,由于“AS”的语法错误,我无法保存或实现它。我需要知道我做错了什么?

Create PROCEDURE `insert_delete_update` (OUT
 id int,
 level varchar(225),
 action varchar(20)
 )

AS    
BEGIN

SET NOCOUNT ON;

IF @Action = 'Insert'
BEGIN
insert into levels (id, level) values(@id, @level)   
END

IF @Action = 'Select'
BEGIN
select * from levels
END 

IF @Action = 'Update'
BEGIN
UPDATE levels SET
            level =  @level
      WHERE id = @id
END

else IF @Action = 'Delete'
BEGIN
DELETE FROM levels WHERE id = @id
END
END

【问题讨论】:

  • PS:我在 MySQL Workbench 中直接使用了这段代码,所以这就是“分隔符 //”缺失的原因。
  • 创建存储过程的示例以引用此链接mysqltutorial.org/mysql-if-statement
  • 我试过了,不好,如果我删除“AS”,我会得到更多的语法错误。老实说,我真的不明白。
  • Thaks Kalgude 先生,我会看看那个,但是我想知道这个作为存储过程本身有什么问题。

标签: mysql sql stored-procedures mysql-workbench


【解决方案1】:

好吧,我终于得到了答案。

这是最终代码:

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_delete_update`()
BEGIN
Declare  id int;
Declare level varchar(225);
Declare action varchar(20);

Set @Action = 'Insert';
BEGIN
insert into levels (id, level) values(@id, @level);
END;

SET @Action = 'Select';
BEGIN
select * from levels
END ;

SET @Action = 'Update';
BEGIN
UPDATE levels SET
            level =  @level
      WHERE id = @id;
END;

SET @Action = 'Delete';
BEGIN
DELETE FROM levels WHERE id = @id;
END;
END;
END

感谢您的帮助!

【讨论】:

  • 语法上有效,但仍然错误。像action 这样的参数变量前面不应该有@,因为它引用的是用户定义的变量,而不是程序变量(有两个不同的作用域和命名空间)。您的程序变量不能使用与列名相同的名称,因为这会在整个表中产生歧义WHERE id = id ...再见数据。
【解决方案2】:

我已经为你编写了存储过程。你可以使用它,我希望它能解决你的问题。我只从工作台创建。

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_delete_update`(OUT
     id int,
     level varchar(225),
     action varchar(20))
BEGIN
        if @action = 'Insert' THEN
            insert into levels (id, level) values(@id, @level) ;   
        elseif @action = 'Select' THEN
            select * from levels ;
        elseif @action = 'Update' THEN
            UPDATE levels SET
                        level =  @level
                  WHERE id = @id;
        elseif @action = 'Delete' THEN
            DELETE FROM levels WHERE id = @id;
        end if;
    END$$
DELIMITER ;

【讨论】:

  • 您使用了用户定义的变量而不是程序变量。此代码可能在语法上有效,但在逻辑上无效。
  • @Michael-sqlbot,请给出正确答案,我也会从你的经验中学习
  • 如果时间允许,我会这样做的。
猜你喜欢
  • 2018-05-12
  • 2011-04-18
  • 2012-04-12
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多