[英]MySQL procedure syntax error with create table statement
下面的代码无需使用create table语句即可完美运行。 我已经花了一个小时来查看这段简单的代码以查找错误。
DELIMITER $$
USE `operations`$$
DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$
CREATE PROCEDURE `rc_pending_data_tat_proc`()
BEGIN
(
CREATE TABLE rc_pending_tat_temp /*works fine when I remove this*/
SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer,
(CASE
WHEN DATEDIFF(criteria_date,transaction_date)<=50
THEN '<=50'
WHEN DATEDIFF(criteria_date,transaction_date) <=70
THEN '<=70'
WHEN DATEDIFF(criteria_date,transaction_date) <=80
THEN '<=80'
WHEN DATEDIFF(criteria_date,transaction_date) <=90
THEN '<=90'
ELSE
'>90'
END) AS Pending_since
, COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date`
FROM `rc_pending_data` a
LEFT JOIN `rc_store_retailer_mapping` b
ON a.retailer=b.store_name
GROUP BY 1,2
);
END$$
DELIMITER ;
它给出的错误是相当标准的,即
错误代码:1064您的SQL语法错误; 检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在“创建表rc_pending_tat_temp SELECT IF(b.retailer IS NULL,a.retailer,b.ret''在第4行附近)附近使用
请删除存储过程的GROUP BY 1,2部分之后的“( BEGIN之后的“和”)。 我尝试此操作时没有括号的开头和结尾,并且对我有用。
在我看来,SQL不喜欢您的查询试图创建一个空表的事实。
我只是四处搜寻,以找出是否可以创建没有任何列的表,而且看起来这通常不是一件容易的事。 如果您出于某些特定原因要创建一个空表,则似乎是另一回事。 但是,如果要解决此问题,请在表中至少添加一列。 像这样:
CREATE TABLE rc_pending_tat_temp(Id INT);
那应该使您的查询运行。
编辑:
听起来您想创建一个新表来存储SELECT
语句的结果。 为此,请在此处检查SELECT INTO
语句的语法。 这样您就可以根据SELECT
语句的结果创建一个表。
在这种情况下,您应该删除以下行:
CREATE TABLE rc_pending_tat_temp
然后添加:
INTO rc_pending_tat_temp
因此,您的查询最终应如下所示:
DELIMITER $$
USE `operations`$$
DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$
CREATE PROCEDURE `rc_pending_data_tat_proc`()
BEGIN
(
SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer,
(CASE
WHEN DATEDIFF(criteria_date,transaction_date)<=50
THEN '<=50'
WHEN DATEDIFF(criteria_date,transaction_date) <=70
THEN '<=70'
WHEN DATEDIFF(criteria_date,transaction_date) <=80
THEN '<=80'
WHEN DATEDIFF(criteria_date,transaction_date) <=90
THEN '<=90'
ELSE
'>90'
END) AS Pending_since
, COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date`
INTO rc_pending_tat_temp
FROM `rc_pending_data` a
LEFT JOIN `rc_store_retailer_mapping` b
ON a.retailer=b.store_name
GROUP BY 1,2
);
END$$
DELIMITER ;
嗨,我是通过很好的旧尝试方法找到了这个问题,原来那些多余的括号()引起了语法错误。 删除它们,代码就像魅力一样工作!
DELIMITER $$
USE `operations`$$
DROP PROCEDURE IF EXISTS `rc_pending_data_tat_proc`$$
CREATE PROCEDURE `rc_pending_data_tat_proc`()
BEGIN
(
CREATE TABLE rc_pending_tat_temp /*works fine when I remove this*/
SELECT IF(b.retailer IS NULL,a.retailer, b.retailer) AS Retailer,
(CASE
WHEN DATEDIFF(criteria_date,transaction_date)<=50
THEN '<=50'
WHEN DATEDIFF(criteria_date,transaction_date) <=70
THEN '<=70'
WHEN DATEDIFF(criteria_date,transaction_date) <=80
THEN '<=80'
WHEN DATEDIFF(criteria_date,transaction_date) <=90
THEN '<=90'
ELSE
'>90'
END) AS Pending_since
, COUNT(*) AS `count`, CURRENT_TIMESTAMP AS `date`
FROM `rc_pending_data` a
LEFT JOIN `rc_store_retailer_mapping` b
ON a.retailer=b.store_name
GROUP BY 1,2
);
END$$
DELIMITER ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.