【问题标题】:MySQL Stored Procedures : cursor declarationMySQL存储过程:游标声明
【发布时间】:2011-04-26 09:43:12
【问题描述】:

抱歉标题含糊,这是我的问题。我已经为 DB2 存储了我尝试为 MySQL 转换的过程。我想知道是否可以将游标声明中的 SELECT 语句写为字符串变量。例如,对于 DB2,我有这个:

(...)
-- 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...;

我错了吗?

谢谢。 费比恩。

【问题讨论】:

    标签: mysql sql stored-procedures cursor


    【解决方案1】:

    不,您不能以这种方式声明游标。但是如果 'the_ref' 是一个变量,你可以这样做 -

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

    【讨论】:

    • 感谢您的回答 Devart,但这并不能真正帮助我解决我的问题。我用更完整的 SP 编辑了我的问题,希望能更好地解释我的问题。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多