MySQL 过程语法错误 "Missing END"

标签 mysql stored-procedures

我必须遵循尝试动态创建 View 的过程。

CREATE DEFINER=`root`@`%` PROCEDURE `uspCreateViewFromTable`(IN ViewName varchar(255), IN TableName varchar(255))
BEGIN
#View Droppen falls sie schon erstellt wurde
SET @s = CONCAT('DROP VIEW IF EXISTS ',ViewName);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


# Verwendete Spalten filtern und Statement bauen
#SET @columns = CAST('SELECT ' AS VARCHAR(10));

DECLARE column varchar(500);
DECLARE column_cursor FOR SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = Tablename;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN column_cursor

read_loop: LOOP
    FETCH column_cursor INTO column
    # do something
    SELECT column;
    IF done THEN
      LEAVE read_loop;
    END IF;
END LOOP;
CLOSE column_cursor;

END

我收到错误“Missing END”,我不知道为什么。

语法检查器在行尾的分号下划线

DEALLOCATE PREPARE stmt;

当我将 dealloc 移动到末尾时,语法检查器会突出显示前一行的分号。

EXECUTE stmt;

如果我在 dealloc 之后删除所有内容,它会起作用。

最佳答案

一些问题:

DELIMITER //

CREATE PROCEDURE `uspCreateViewFromTable`(
  IN ViewName varchar(255),
  IN TableName varchar(255)
)
BEGIN
  /*
  #View Droppen falls sie schon erstellt wurde
  SET @s = CONCAT('DROP VIEW IF EXISTS ',ViewName);
  PREPARE stmt FROM @s;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
  */

  # Verwendete Spalten filtern und Statement bauen
  #SET @columns = CAST('SELECT ' AS VARCHAR(10));

  -- DECLARE column varchar(500);
  DECLARE `column` varchar(500);
  DECLARE done BOOL DEFAULT FALSE;

  /*
  DECLARE column_cursor FOR
  SELECT column_name
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = Tablename;
  */
  DECLARE column_cursor CURSOR FOR
  SELECT column_name
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = Tablename;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  #View Droppen falls sie schon erstellt wurde
  SET @s = CONCAT('DROP VIEW IF EXISTS ',ViewName);
  PREPARE stmt FROM @s;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

  -- OPEN column_cursor
  OPEN column_cursor;

  read_loop: LOOP
      -- FETCH column_cursor INTO column
      FETCH column_cursor INTO `column`;
      # do something
      -- SELECT column;
      SELECT `column`;
      IF done THEN
        LEAVE read_loop;
      END IF;
  END LOOP;
  CLOSE column_cursor;
END//

DELIMITER ;

关于MySQL 过程语法错误 "Missing END",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33758143/

相关文章:

mysql - 如何编写程序在mysql中动态添加where子句

mysql - 我在 mysql 中的存储过程遇到问题

php - 您可以从位于单个结果集中的两个单独的表中提取数据吗? [不加入问题]

php - FullCalendar 删除带有按钮的事件

php - 如何使用codeigniter在mysql中插入带有特殊字符的文本

mysql - 自连接的 SQL 查询

php - 如何在MySQL存储过程中使用IN运算符?

mysql合并数据分配相同的ID

mysql - 子查询只能返回单列的声明

mysql - 如何在 MySQL 中使用变量