2011-04-26 68 views
0

對不起,模糊的標題,這是我的問題。我已經存儲DB2的過程,我嘗試爲MySQL進行轉換。我想知道是否可以將光標聲明中的SELECT語句作爲字符串變量來編寫。例如與DB2我有這樣的:MySQL存儲過程:遊標聲明

(...) 
-- Declare cursors 
DECLARE c_very_init CURSOR WITH RETURN FOR s_very_init; 
DECLARE c_date  CURSOR WITH RETURN FOR s_date; 

DECLARE CONTINUE HANDLER FOR not_found 
    SET at_end = 1; 

-- In case the_date is 0, retrieve the first date 
IF the_date = 0 THEN 
    SET sql_end_date = ' 
     SELECT DATE 
      FROM ACCOUNTS 
     WHERE REF = ''' || the_ref || ''' 
      ORDER BY ID ASC FETCH FIRST 1 ROWS ONLY'; 
    PREPARE s_date FROM sql_end_date; 
    OPEN c_date; 
    FETCH FROM c_date INTO data_ins; 
    SET the_last_date = data_ins; 
    CLOSE c_date; 
ELSE 
    SET the_last_date = the_date; 
END IF; 

-- Get the 'very' initial value 
SET sql_very_init = ' 
     SELECT in, out 
      FROM MOVEMENTS 
     WHERE REF = ''' || the_ref || ''' 
      AND DATE < ' || the_last_date; 
PREPARE s_very_init FROM sql_very_init; 
OPEN c_very_init; 
FETCH FROM c_very_init INTO dare, avere; 

-- Loop through the results 
(...) 

我宣佈一個c_very_init光標,但在SP遊標聲明的時候,我還是不知道完整的select語句,因爲我需要獲取(如果有必要)值爲the_last_date。看來我不能做到這一點:

DECLARE c_very_init CURSOR WITH RETURN FOR s_very_init; 

與MySQL,語法是直接在聲明中聲明:

DECLARE c_very_init CURSOR FOR SELECT blaablaa...; 

我錯了?

謝謝。 fabien。

回答

0

不,您不能以這種方式聲明遊標。但是,如果「the_ref」是一個變量,你可以做這樣的 -

... 
DECLARE the_ref INT DEFAULT 10; 
DECLARE cur1 CURSOR FOR SELECT column1 FROM table1 WHERE column1 = the_ref; 
... 
+0

謝謝您的回答Devart,並沒有真正幫助我與我的問題雖然。我用更完整的SP編輯了我的問題,希望能更好地解釋我的問題。再次感謝你! – fabien 2011-04-26 10:35:09