2015-10-28 57 views
0

我想運行一個查詢這是我第一次打出來是這樣的:同一查詢,不同的結局

DELIMITER $$ 

DROP PROCEDURE IF EXISTS development $$ 

CREATE PROCEDURE development() 

BEGIN 
DECLARE i INT DEFAULT 1; 
WHILE i <= 500 DO 
IF NOT EXISTS ((SELECT * FROM customers WHERE customerID = 500)) THEN  INSERT INTO customers (firstName) VALUES (''); END IF; 
SET i = i + 1; 
END WHILE; 
END $$ 

CALL development() $$ 

DROP PROCEDURE IF EXISTS development $$ 

DELIMITER ; 

但隨後被「壓縮」成這樣:

DELIMITER $$ DROP PROCEDURE IF EXISTS development $$ CREATE PROCEDURE development() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 500 DO IF NOT EXISTS ((SELECT * FROM customers WHERE customerID = 500)) THEN INSERT INTO customers (firstName) VALUES (''); END IF; SET i = i + 1; END WHILE; END $$ CALL development() $$ DROP PROCEDURE IF EXISTS development $$ DELIMITER ; 

在一行。問題在於第一行(多行)代碼工作,並執行它應該做的事情,而另一行(單行)版本則不行。它不會失敗或拋出錯誤,它不會像多行版本那樣插入行。爲什麼是這樣?更重要的是,我怎樣才能使單行版本工作?

提前致謝!

+0

說明以何種方式失敗? –

+0

@MichaelBerkowski它不會失敗,它只是不會做它應該做的事情;即添加500個客戶虛擬行。 – Tice

+0

我懷疑問題是在分隔符處,在行尾。但是,你不解釋問題是什麼,所以這只是一個猜測。 –

回答

0

請試試這樣說:

DELIMITER $$ 
DROP PROCEDURE IF EXISTS development $$ CREATE PROCEDURE development() BEGIN DECLARE i INT DEFAULT 1; WHILE i <= 500 DO IF NOT EXISTS ((SELECT * FROM customers WHERE customerID = 500)) THEN INSERT INTO customers (firstName) VALUES (''); END IF; SET i = i + 1; END WHILE; END $$ CALL development() $$ DROP PROCEDURE IF EXISTS development $$ 
DELIMITER ; 

最後換行符可能不neccessary。

但我相當有信心的是,內聯整個代碼時,你最終會設立一個分隔符壽命長很多比「$$」

我只是執行我的一個隨機的SQL Server上的完全內嵌例如,總是收到一個積極的結果,即使我沒有設置相關的數據庫結構。

換行大約有遺漏表的投訴(如所預期)

問候 斯特凡

+0

不幸的是,這對我來說不是一個解決方案,因爲查詢必須在同一行上。 – Tice

0

您不能運行在同一行delimiter任何SQL。 delimiter是一個內置的mysql客戶端命令,用於設置語句分隔符,而不是sql解釋器。它需要一個參數,讀到第一個空格或換行符。其他一切都被忽略。

delimiter $$ select now() $$ 

沒有輸出,因爲$$之後的所有內容都被丟棄。

或由語法錯誤

delimiter "$$" select; nothing order by from nowhere group , oh forget it $$