MySQL/MariaDB 排查存储过程语法错误
MySQL / MariaDB troubleshooting stored procedure syntax error
我正在尝试编写以下存储过程,但我一直收到语法错误,我已将其包含在 SP 中。
DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `test`(categoryID int, userID int)
BEGIN
DECLARE vbUserId INT DEFAULT ( SELECT userfield.field6 FROM userfield WHERE userfield.field6 = userID );
DECLARE m_forumId, m_numOfPosts, m_numOfThreads, m_hasChildren, m_isPrivate INT;
DECLARE m_forumName VARCHAR(100);
DECLARE lastRow INT DEFAULT 0;
CREATE TEMPORARY TABLE tmp engine=memory AS (select forumid,replace(replace(title_clean,'&','&'),'"','') as forumName,replycount as NumOfPosts, threadcount as NumOfThreads, 0 as hasChildren, showprivate as isprivate from forum where parentid=categoryID and displayorder!=0 and options&1=1 order by displayorder);
DECLARE cur_forums CURSOR FOR select * from tmp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET lastRow = 1;
OPEN cur_forums;
iterate_forums: LOOP
FETCH cur_forums INTO m_forumId, m_forumName, m_numOfPosts, m_numOfThreads, m_hasChildren, m_isPrivate;
IF lastRow = 1 THEN LEAVE iterate_forums;
IF (m_isPrivate = 1)
SELECT CONCAT('Private: ', m_isPrivate);
END IF
END LOOP iterate_forums;
CLOSE cur_forums;
DROP TEMPORARY TABLE IF EXISTS tmp;
END$$
这是我尝试将其导入数据库时收到的错误:
ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DECLARE cur_forums CURSOR FOR select * from tmp;
DECLARE CONTINUE HANDLER FOR N' at line 10
我已经阅读了文档并查看了以前的 SO 问题,还尝试注释掉某些行或 运行 它们自己,但仍然无法弄清楚我做错了什么。
更改顺序如:1 声明,然后打开
....
DECLARE vbUserId INT DEFAULT ( SELECT userfield.field6 FROM userfield WHERE userfield.field6 = userID );
DECLARE m_forumId, m_numOfPosts, m_numOfThreads, m_hasChildren, m_isPrivate INT;
DECLARE m_forumName VARCHAR(100);
DECLARE lastRow INT DEFAULT 0;
DECLARE cur_forums CURSOR FOR select * from tmp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET lastRow = 1;
OPEN cur_forums;
CREATE TEMPORARY TABLE tmp engine=memory AS (select forumid,replace(replace(title_clean,'&','&'),'"','') as .....
...
通过重写修复了它:
DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `test`(categoryID int, userID int)
BEGIN
DECLARE vbUserId INT DEFAULT (
SELECT userfield.field6 FROM userfield
WHERE userfield.field6 = userID );
DECLARE m_forumId, m_numOfPosts, m_numOfThreads,
m_hasChildren, m_isPrivate INT;
DECLARE m_forumName VARCHAR(100);
DECLARE lastRow INT DEFAULT FALSE;
DECLARE curForums CURSOR FOR select * from tmp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET lastRow = TRUE;
CREATE TEMPORARY TABLE tmp engine=memory AS (
select forumid,
replace(replace(title_clean,'&','&'),'"','')
as forumName,
replycount as NumOfPosts,
threadcount as NumOfThreads,
0 as hasChildren,
showprivate as isprivate
from forum
where parentid=categoryID
and displayorder!=0
and options&1=1
order by displayorder);
OPEN curForums;
iterateForums: LOOP
FETCH curForums INTO m_forumId, m_forumName,
m_numOfPosts, m_numOfThreads,
m_hasChildren, m_isPrivate;
IF lastRow THEN
LEAVE iterateForums;
END IF;
IF m_isPrivate = 1 THEN
SELECT (m_isPrivate);
END IF;
END LOOP;
CLOSE curForums;
DROP TEMPORARY TABLE IF EXISTS tmp;
END$$
DELIMITER ;
查克 tmp
和 cursor
。相反,只需
select "Private: 1"
FROM forum
WHERE EXISTS ( SELECT *
from forum
where parentid=categoryID
and displayorder!=0
and options&1=1
AND showprivate = 1 );
vbUserId
好像没用过;摆脱它。
我正在尝试编写以下存储过程,但我一直收到语法错误,我已将其包含在 SP 中。
DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `test`(categoryID int, userID int)
BEGIN
DECLARE vbUserId INT DEFAULT ( SELECT userfield.field6 FROM userfield WHERE userfield.field6 = userID );
DECLARE m_forumId, m_numOfPosts, m_numOfThreads, m_hasChildren, m_isPrivate INT;
DECLARE m_forumName VARCHAR(100);
DECLARE lastRow INT DEFAULT 0;
CREATE TEMPORARY TABLE tmp engine=memory AS (select forumid,replace(replace(title_clean,'&','&'),'"','') as forumName,replycount as NumOfPosts, threadcount as NumOfThreads, 0 as hasChildren, showprivate as isprivate from forum where parentid=categoryID and displayorder!=0 and options&1=1 order by displayorder);
DECLARE cur_forums CURSOR FOR select * from tmp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET lastRow = 1;
OPEN cur_forums;
iterate_forums: LOOP
FETCH cur_forums INTO m_forumId, m_forumName, m_numOfPosts, m_numOfThreads, m_hasChildren, m_isPrivate;
IF lastRow = 1 THEN LEAVE iterate_forums;
IF (m_isPrivate = 1)
SELECT CONCAT('Private: ', m_isPrivate);
END IF
END LOOP iterate_forums;
CLOSE cur_forums;
DROP TEMPORARY TABLE IF EXISTS tmp;
END$$
这是我尝试将其导入数据库时收到的错误:
ERROR 1064 (42000) at line 2: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DECLARE cur_forums CURSOR FOR select * from tmp;
DECLARE CONTINUE HANDLER FOR N' at line 10
我已经阅读了文档并查看了以前的 SO 问题,还尝试注释掉某些行或 运行 它们自己,但仍然无法弄清楚我做错了什么。
更改顺序如:1 声明,然后打开
....
DECLARE vbUserId INT DEFAULT ( SELECT userfield.field6 FROM userfield WHERE userfield.field6 = userID );
DECLARE m_forumId, m_numOfPosts, m_numOfThreads, m_hasChildren, m_isPrivate INT;
DECLARE m_forumName VARCHAR(100);
DECLARE lastRow INT DEFAULT 0;
DECLARE cur_forums CURSOR FOR select * from tmp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET lastRow = 1;
OPEN cur_forums;
CREATE TEMPORARY TABLE tmp engine=memory AS (select forumid,replace(replace(title_clean,'&','&'),'"','') as .....
...
通过重写修复了它:
DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `test`(categoryID int, userID int)
BEGIN
DECLARE vbUserId INT DEFAULT (
SELECT userfield.field6 FROM userfield
WHERE userfield.field6 = userID );
DECLARE m_forumId, m_numOfPosts, m_numOfThreads,
m_hasChildren, m_isPrivate INT;
DECLARE m_forumName VARCHAR(100);
DECLARE lastRow INT DEFAULT FALSE;
DECLARE curForums CURSOR FOR select * from tmp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET lastRow = TRUE;
CREATE TEMPORARY TABLE tmp engine=memory AS (
select forumid,
replace(replace(title_clean,'&','&'),'"','')
as forumName,
replycount as NumOfPosts,
threadcount as NumOfThreads,
0 as hasChildren,
showprivate as isprivate
from forum
where parentid=categoryID
and displayorder!=0
and options&1=1
order by displayorder);
OPEN curForums;
iterateForums: LOOP
FETCH curForums INTO m_forumId, m_forumName,
m_numOfPosts, m_numOfThreads,
m_hasChildren, m_isPrivate;
IF lastRow THEN
LEAVE iterateForums;
END IF;
IF m_isPrivate = 1 THEN
SELECT (m_isPrivate);
END IF;
END LOOP;
CLOSE curForums;
DROP TEMPORARY TABLE IF EXISTS tmp;
END$$
DELIMITER ;
查克 tmp
和 cursor
。相反,只需
select "Private: 1"
FROM forum
WHERE EXISTS ( SELECT *
from forum
where parentid=categoryID
and displayorder!=0
and options&1=1
AND showprivate = 1 );
vbUserId
好像没用过;摆脱它。