2015-12-28 28 views
1

我想知道,我們可以在ELSE IF塊中聲明遊標嗎? 當我這樣做,我發現「聲明」。我的代碼之前的錯誤 缺失款或其他元素在ELSE中的遊標聲明如果在MySQL中阻塞?

if State is NOT NULL 
    then 
    declare t cursor for select *from student;//this line has error 
    declare continue handler for NOT FOUND set str=1; 
    else 
    declare t cursor for select *from student; 
    end if; 

爲什麼?

回答

1

DECLARE只允許一個內BEGIN ... END複合 聲明,並且必須是在它的開始,任何其他語句之前。

聲明必須遵循特定的順序。遊標聲明必須出現在處理程序聲明之前。變量和條件聲明必須出現在遊標或處理程序聲明之前。前處理程序聲明後的變量和條件聲明

DECLARE

0

遊標聲明必須出現。

如果您想在某些條件下使用該遊標,則必須在IF條件下使用FETCH CURSOR語法。

4

答案是NO。該manual明確表示:前處理程序聲明後 變量和條件聲明

遊標聲明必須出現。

類似[bug: 15809]最終沒有)報道,但它與下面的答案關閉:

感謝您的問題報告。對不起,但我不認爲這是一個錯誤。 問題是應該聲明遊標,並且所有聲明 都處於SP或塊的起始位置。

請閱讀(http://dev.mysql.com/doc/refman/5.0/en/cursors.html):

「光標必須在聲明處理程序和變量之前聲明和 條件必須聲明或者光標或 處理程序之前被聲明」

而且,更清楚地 (http://dev.mysql.com/doc/refman/5.0/en/declare.html):

「Declare語句用於定義各種項目當地的 例行:局部變量(見第17.2.9,‘變量在存儲過程 ’ ),條件和處理程序(見第17.2.10, 「條件和處理程序」)和遊標(見第17.2.11, 「光標」)。SIGNAL RESIGNAL和報表目前不支持 。

DECLARE可能只能在BEGIN中使用...END複合語句和 必須在它的啓動,任何其他語句之前。」

因此,它是不是一個錯誤,但記錄的行爲。

+0

如果我們在BEGIN之間聲明cursur .... .END block.then我們可以在BEGIN .... END塊之外打開並獲取該遊標嗎? –

+0

@Arunnagar: - 不,那是不可能的。您還想要實現什麼? –

+0

先生,我的代碼是:* * set str_commmand ='聲明Sdetails cursur select * from student'**;先生請告訴我可以在mysql中聲明cursur,**和**如果是,那麼如何執行這條語句 –