2016-09-20 97 views
-1

我在下面的存儲過程Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; OPEN cur1; count' at line 13錯誤1064在存儲過程中

DELIMITER $$ 

DROP PROCEDURE IF EXISTS cursor_example 
$$ 
CREATE PROCEDURE cursor_example() 
    READS SQL DATA 
BEGIN 
    DECLARE i_Name CHAR(3); 
    DECLARE i_SurfaceArea FLOAT(10,2); 

    DECLARE done  INT DEFAULT 0; 

    DECLARE cur1 CURSOR FOR 
    SELECT Name, SurfaceArea 
     FROM country 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 

    OPEN cur1; 
    country_loop:LOOP 
     FETCH cur1 INTO i_Name, i_SurfaceArea; 
     IF done=1 THEN 
      LEAVE country_loop; 
     END IF; 
    END LOOP country_loop; 
    CLOSE cur1; 

END; 
$$ 

DELIMITER ; 

得到這個錯誤,只是一般的整個過程是如何想的工作,什麼是它。 謝謝。

+0

「正確的錯誤」是什麼意思? – EJP

回答

2

您在FROM country之後丟失了一個分號。請使用以下模式:

DROP PROCEDURE IF EXISTS cursor_example; 
DELIMITER $$ 
CREATE PROCEDURE cursor_example() 
    READS SQL DATA 
BEGIN 
    DECLARE i_Name CHAR(3); 
    DECLARE i_SurfaceArea FLOAT(10,2); 

    DECLARE done  INT DEFAULT 0; 

    DECLARE cur1 CURSOR FOR 
    SELECT Name, SurfaceArea 
     FROM country; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 

    OPEN cur1; 
    country_loop:LOOP 
     FETCH cur1 INTO i_Name, i_SurfaceArea; 
     IF done=1 THEN 
      LEAVE country_loop; 
     END IF; 

     -- right here is where you do stuff with those variables 

    END LOOP country_loop; 
    CLOSE cur1; 

END; 
$$ 

DELIMITER ; 

我不與例如不解的是嘗試提取CUR1 INTO在 的例子是?

請記住,CURSOR只是一個選擇stmt。它可以非常複雜的加入,你的名字。但最終它有一個選擇列列表。在你的情況下,它有2列回來。因此,FETCH一次一行,將當前行帶入LOCAL VARIABLES(按照從遊標列表到列出的變量的相應順序)。您在DECLARE中聲明瞭這些LOCAL VARIABLES

當你不在行的時候,HANDLERdone設置爲1,你退出循環。

至於DELIMITER閱讀我的這個答案的最後一半Here

一般情況下,整個程序是如何工作的以及爲什麼是 ?

上面大部分描述。遊標用於處理返回的數據。讓你在解決問題時注入程序思維。順便說一句,他們非常緩慢,應儘可能避免。它們通常是開發SQL的開發人員的一個柺杖,無法讓他們瞭解如何使用集合和關係進行工作。也就是說,高性能RDBMS的表現非常出色。

這就是說,經驗豐富的SQL開發人員已知使用它們的棘手的情況。

+0

分號修正錯誤,但現在發出以下命令:CALL cursor_example();什麼都沒發生。我看到你在END IF和END LOOP之間寫的評論,這讓我想到更多的語句會在這個存儲過程中進一步使用CURSOR。 – Bhail

+1

你確實需要做一些事情,否則你只是設置變量。看看這個新手的小例子http://stackoverflow.com/a/39553173 – Drew

+1

你可以對'i_Name'和'i_SurfaceArea'進行單獨的迭代,並對它們做些什麼。但所有這一切都不明確,你的意圖是什麼。 – Drew