2009-12-04 58 views
2

我對MySQL有一個相當奇怪的問題。試圖創建一個過程來更新數據庫中的一些字段(代碼如下)。MySQL查詢瀏覽器程序錯誤代碼-1

問題在於當前評論的行。看起來,如果在過程中沒有執行SELECT語句,MySQL查詢瀏覽器將返回錯誤代碼「-1,執行SQL查詢時出錯」。

我在HeidiSQL中試過同樣的事情,錯誤是「無法返回結果集」。所以我想問題是我是否總是必須在程序中選擇一些東西,或者是否還有其他一些我錯過的東西。

查詢在刪除評論時正常工作。

DELIMITER/
DROP PROCEDURE IF EXISTS updateFavourites/
CREATE PROCEDURE updateFavourites(quota INT) 
BEGIN 
DECLARE done INT DEFAULT 0; 
DECLARE artist_id,releases INT; 
DECLARE c_artist Cursor FOR 
    SELECT Artist.id_number,COUNT(Artist.id_number) FROM Artist 
    JOIN CD ON CD.is_fronted_by = Artist.id_number 
GROUP BY Artist.id_number; 

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' 
    SET done=1; 

IF quota > 0 THEN 
    OPEN c_artist; 
    REPEAT 
    FETCH c_artist INTO artist_id,releases; 
     IF NOT done THEN 
     IF releases >= quota THEN 
      UPDATE CD SET CD.rating='favourite' WHERE CD.is_fronted_by = artist_id; 
     END IF; 
    END IF; 
UNTIL done END REPEAT; 
CLOSE c_artist; 
-- SELECT 'Great success'; 
ELSE 
    SELECT CONCAT('\'quota\' must be greater than 0.',' Got (',quota,')'); 
END IF; 

END/
DELIMITER ; 

下面是創建表和一些數據的SQL:

DROP TABLE IF EXISTS CD; 
DROP TABLE IF EXISTS Artist; 

CREATE TABLE Artist (
id_number INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
name VARCHAR(50), 
); 

CREATE TABLE CD (
catalog_no  INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
is_fronted_by  INT UNSIGNED, 
rating   ENUM ('favourite','top draw','good','so-so','poor','rubbish'), 
CONSTRAINT fk_CD_Artist FOREIGN KEY (is_fronted_by) REFERENCES Artist(id_number) ON UPDATE  CASCADE 
); 

INSERT INTO Artist VALUES(11,'Artist 1'); 
INSERT INTO Artist VALUES(10,'Artist 2'); 
INSERT INTO CD VALUES (7,11, 'top draw'); 
INSERT INTO CD VALUES (650,11,'good'); 
INSERT INTO CD VALUES (651,11,'good'); 
INSERT INTO CD VALUES (11,10,'favourite'); 
+0

我正在查看IF塊中的代碼,並且看到多條語句。由於有多個語句,不應將它們包裝在BEGIN/END塊中嗎? – 2009-12-04 15:34:21

+0

據我所知不,但我比較新的程序。你究竟如何做到這一點? BEGIN OPEN c_artist; ... END ELSE 給出了一個語法錯誤。包裹整個IF塊。 – 2009-12-04 15:46:28

+0

您運行的是哪個版本的MySQL,並且可以添加模式定義和可能的樣本數據? – r00fus 2009-12-08 20:30:56

回答

1

谷歌搜索各地,有幾個相同的錯誤報告,但很少有信息來解決問題。甚至還有一個登錄在mysql.com的bug,但它似乎已被放棄而未被解決。

還有另一個StackOverflow question在同一個錯誤,但它也沒有解決。

這意味着查詢中沒有結果集。查看源代碼,當查詢沒有結果集時,似乎有時會設置錯誤狀態MYX_SQL_ERROR。也許這不是一個適當的結果?

我注意到,當我使用mysql命令行客戶端時,調用不返回結果集的proc時不會產生錯誤。


更新:我試圖恢復,MySQL的bug報告,併爲他們提供了一個很好的測試案例。他們從「無反饋」,以「驗證」改變錯誤 - 至少在他們承認它在查詢瀏覽器中的錯誤:

[11 Dec 9:18] Sveta Smirnova

Bill,

thank you for the feedback. Verified as described.

Although most likely this only be fixed when MySQL Query Browser functionality is part of MySQL workbench.

我猜的解決方法是忽略-1錯誤,或者測試存儲過程在命令行mysql客戶端,其中不會發生錯誤。

該評論假設問題將隨着查詢瀏覽器功能成爲MySQL Workbench的一部分而消失。這是supposed to happenMySQL Workbench 5.2。我會下載這個測試版,並試一試。

MySQL Workbench 5.2在測試版中,但我會假設MySQL工程無法預測測試版何時會成爲GA。這些預測在標準條件下已經足夠困難,但由於未能解決Oracle的收購問題,MySQL的命運有很多額外的不確定性。


更新:好吧,我已經嘗試MySQL工作臺5.2.10測試版。我執行這樣的存儲過程:

CREATE PROCEDURE FooProc(doquery SMALLINT) 
BEGIN 
    IF doquery THEN 
    SELECT * FROM Foo; 
    END IF; 
END 

當我CALL FooProc(0)的反應是沒有結果集,狀態簡直是「OK」。

當我CALL FooProc(1)的響應將是SELECT * FROM Foo結果如預期。

但是,還有另一個與調用過程相關的錯誤。過程可能有多個結果集,因此在執行CALL查詢時很難知道何時關閉語句。其結果是,MySQL工作臺5.2 關閉語句,如果你嘗試做另一個查詢(無論是CALLSELECT),它給你一個錯誤:

Commands out of sync; you can't run this command now.

MySQL不支持多個併發打開查詢。所以最後一個必須關閉,然後才能開始一個新的。但它不會關閉CALL查詢。此bug也記錄在MySQL網站上。


有關命令不同步的問題已解決。他們說它已經在MySQL Workbench 5.2.11中修復了。

+0

嗨,是的,我在mysql.com上找到了同樣的錯誤報告,還有一些未解決的線程分散在這裏和那裏。那麼你會說這是查詢瀏覽器客戶端的問題嗎? – 2009-12-13 12:38:23

+0

是的;看到我上面的更新。 – 2009-12-13 18:32:06

+0

reg。 「不同步的命令」:beta是beta – noonex 2009-12-15 11:45:50

0

嘗試把BEGIN和周圍的IF塊中的多條語句這樣END塊:

IF quota > 0 THEN 
    BEGIN 
     OPEN c_artist; 
     REPEAT 
     FETCH c_artist INTO artist_id,releases; 
     IF NOT done THEN 
      IF releases >= quota THEN 
       UPDATE CD SET CD.rating='favourite' WHERE CD.is_fronted_by = artist_id; 
      END IF; 
     END IF; 
     UNTIL done END REPEAT; 
     CLOSE c_artist; 
    END; 
ELSE 
    SELECT CONCAT('\'quota\' must be greater than 0.',' Got (',quota,')'); 
END IF; 
+0

編譯但仍然出現相同的錯誤-1。 – 2009-12-04 16:13:10

2

查詢瀏覽器不適用於運行腳本,只是單個查詢。 我通過將光標移動到每個查詢(DELIMITER除外)並按Ctrl + Enter來嘗試了您的代碼。 它創建該存儲過程沒有問題。 (只需刷新左側的模式)。

如果您希望創建過程,請使用菜單「腳本」 - >「創建存儲過程/功能」。

不過還好忘掉QueryBrowser它不是在所有的支持(和actunally沒有用處)。 如果你有體面的硬件和豐富的資源,請嘗試使用Workbench 5.2否則使用SQLyog

+0

好吧,嘗試工作臺5.2測試版。這似乎很好,那麼問題是MySQL查詢瀏覽器和jHeidi。 感謝您的支持。 – 2009-12-13 12:59:01