首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

收藏此问题 发表新评论

【急】mysql的cursor

定义cursor时,select,where都可以用case
例如
WHERE
CASE
WHEN        i_hkbn = '0'        THEN        td1.hkbn = i_hkbn
WHEN        i_hkbn = '1'        THEN        td1.hkbn = i_hkbn
ELSE        1 = 1
END)

group by 和order by该如何动态生成?

我自己的测试结果
GROUP BY
(
CASE
WHEN i_syukesel = '0' THEN syocd,hkbn
ELSE tenpocd,syocd,hkbn
END)
编译不通过

GROUP BY
(
CASE
WHEN i_syukesel = '0' THEN 'syocd,hkbn'
ELSE 'tenpocd,syocd,hkbn'
END)
编译通过,结果不对,不管多少条记录,都集计成一条。

[ 本帖最后由 devotedsky 于 2008-7-4 15:13 编辑 ]
昵称: devotedsky  时间: 2008-07-02 18:13:00
难道要我写8个select和where部分都一样的cursor?
昵称: devotedsky  时间: 2008-07-02 19:30:00
自己解决了。
方法如下:
动态生成sql,往临时表插入数据,可以解决group by问题。
查数据时,往某字段插入希望以此为序的字段。cursor以该字段作为order,解决order by问题。

代码大致如下:
DECLARE td1get0 cursor for
select *
from w_h101
where sessionid = i_sessionid
order by orderby,suryo desc;

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

SET @SqlCmd = "insert into w_h101 select ?
                                                                                ,field1
                                                                                ,field2
                                                                                ,CASE
                                                                                        WHEN ?='0' THEN field3
                                                                                        WHEN ?='1' THEN field4
                                                                                        WHEN ?='2' THEN field5
                                                                                        ELSE 0
                                                                                 END AS orderby
                                                                FROM table1
                                                                        LEFT JOIN table2 ON ......";
SET @temp_sessionid = i_sessionid;

SET @SqlCmd = CONCAT(@SqlCmd , ' WHERE fielda BETWEEN ? AND ?');

IF i_hkbn = '0' or i_hkbn = '1' THEN
        SET @SqlCmd = CONCAT(@SqlCmd , ' AND (fieldb = ?)');
        SET @temp_hkbn = i_hkbn;
ELSE
        SET @SqlCmd = CONCAT(@SqlCmd , ' AND (999999 = ?)');
        SET @temp_hkbn = 999999;
END IF;

/*GROUP BY*/
IF i_syukesel = '1' THEN
        SET @SqlCmd = CONCAT(@SqlCmd , " group by fieldc,fieldd having sum(suryo) >= ?");
ELSE
        SET @SqlCmd = CONCAT(@SqlCmd , " group by fielde having sum(suryo) >= ?");
END IF;

SET @temp_suryo = i_suryo;

PREPARE strSQL FROM @SqlCmd ;

execute strSQL using         @temp_sessionid
                                                ,@temp_orderby
                                                ,@temp_orderby
                                                ,@temp_orderby.........
                                                ;

select count(*) into o_cnt from w_h101 where sessionid = i_sessionid;

IF !(o_cnt = 0) THEN

        SET select_state = 0;
       
        OPEN td1get0;

        LABLE_RQURL:        LOOP
                                FETCH td1get0 INTO         w_sessionid.......
                                                                        ;
                                IF select_state THEN LEAVE LABLE_RQURL;
                                END IF;
        END LOOP LABLE_RQURL;
        close td1get0;
        SET select_state = 0;
END IF;

以上。
昵称: devotedsky  时间: 2008-07-04 15:12:00
mysql的存储过程常常会发生莫名其妙的问题,不是很稳定。
大概是用的人少了,遇到问题还是得靠自己。
昵称: devotedsky  时间: 2008-07-04 15:15:00