[英]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.