2013-04-18 66 views
0

我有一個存儲過程,在我的本地PC語法上可以接受,我有MySQL工作臺5.2.44,我認爲我的本地版本的MySQL是5.5.29由文件夾名稱判斷。下面是代碼,我已經減少到最低限度爲了說明mysql存儲過程語法不一致

DELIMITER $$ 

CREATE PROCEDURE `usp_insert_booking_test_2`(
     IN p_dtmTimeSlot DATETIME 
    ) 

BEGIN 

    INSERT INTO tblBookings (dtmTimeSlot) 
    SELECT p_dtmTimeSlot 
    FROM tblBookings 
    WHERE NOT EXISTS (SELECT * FROM tblBookings WHERE dtmTimeSlot = p_dtmTimeSlot) LIMIT 1; 

END$$ 

正如你所看到的,我想確保我不會在同一個時間段創建兩個預訂。是的,我在表上也有一個約束來做到這一點。腰帶&牙套。當我嘗試在遠程主機(運行MySQL版本5.1.68-cll)上添加此過程時,它說

#1064 - 您的SQL語法錯誤;檢查與您的MySQL服務器版本對應的手冊,以便在第12行「'附近使用正確的語法。

第12行是WHERE NOT EXISTS行。我試圖刪除限制1,這沒有什麼區別。有沒有辦法編寫查詢,以便MySQL 5.1能接受它?

+1

的最後一行應該是'END $$'(太空任務)而行的最後一個行後丟失: 'DELIMITER;' – Kovge 2013-04-18 07:44:07

+1

的空間END'後'失蹤 同樣的問題:HTTP:/ /stackoverflow.com/questions/1102109/mysql-delimiter-syntax-errors – Kovge 2013-04-18 07:45:30

回答

0

使用此。

DELIMITER $$ 

CREATE PROCEDURE `usp_insert_booking_test_2`(
    IN p_dtmTimeSlot DATETIME 
) 

BEGIN 

INSERT INTO tblBookings (dtmTimeSlot) 
SELECT p_dtmTimeSlot 
FROM tblBookings 
WHERE NOT IN (SELECT * FROM tblBookings WHERE dtmTimeSlot = p_dtmTimeSlot LIMIT 1); 

END $$ 
DELIMITER ; 

這裏somevalue是你想要插入。

+0

這兩個建議都無效。建議的答案將一個SQL語句分解爲兩個無關的語句,這些語句完全改變了語義。建議缺少空格不能解決錯誤。 – DJDave 2013-04-18 10:31:16

+0

@ user1280840請檢查我的更新答案。 – 2013-04-18 13:08:08

0

我需要添加

DELIMITER;

到所示的代碼結束。不知道爲什麼。