写过sqlserver与 oracle,特别sqlserver 可以返回大数据集合。
现在写mysql的存储过程,不知道如何返回一个数据集例如
CREATE PROCEDURE itime(    p_tiem datetime)BEGIN     DECLARE v_sql datetime;      SET v_sql = CONCAT('SELECT filedir FROM ipsp_resources WHERE hashcode =\'', p_hashcode, '\' LIMIT 0, 1');      SET @sql = v_sql;        PREPARE sl FROM @sql;      EXECUTE sl;        DEALLOCATE PREPARE sl;  END LABEL_PROC // 我现在需要返回一组数据 ,如同sqlserver一样,问如何做?

解决方案 »

  1.   

    MYSQL没有办法直接返回一个游标给另外一个存储过程来使用。如果是返回数据集给你的宿主程序,比如PHP的话,你可以直接在存储过程中 select * from yourTable 这种格式返回。如果你的存储过程中有多个select * 。。这种,则一个CALL mystoreproc() 可以返回多个数据集,在你的程序中依次处理就行了。
      

  2.   

    楼上意思是和oracle存储过程是一样的哦,不能返回记录集
      

  3.   

    你所指的结果集是什么?MYSQL存储过程可以返回一个或多个结果集的,如果你像将多个结果集一起返回,则可以通过中间临时表的形式存放,最后才select出来。
    MYSQL里面没有oracle那样返回游标结果集的,在oracle里面要一次性返回大量结果,也是用中间临时表的形式。
    MSSQL里面可以返回一个或多个结果集,若要将多个结果集同时一次返回,也可以通过中间临时表的形式(这个跟MYSQL很类似)。
      

  4.   

    我记得就应该是select就可以返回了啊.
      

  5.   

    写mysql的sp真的很痛苦,一来语法要求及其严格,而且和普通编程语言区别较大,二来没有好的工具辅助.所以感觉痛苦.
    语法需要注意的是赋值语句和循环语句.按照管理写i=i+1或者i+=1,或者i++都不好使.郁闷了半天才醒悟,原来赋值语句药加select或者是set.写作:set i = i + 1;
    循环语句也很变态,各个版本支持的情况都不一样.以5.0.20为例,就不支持如下:STU_loop:loop    #遍历开始
       fetchcursor into id;
       if done=1 then leave loop;end if #完成则跳出循环;
       #根据学生id将所有学生的相关信息拷贝过来
       call copy_info_job(id);
    end loop STU_loop;这几句不能通过编译.相应的应该写为:
    repeat
        fetch student_cursor into student_id;
        #其他语句
    until student_done END REPEAT;另外,游标的使用也值得注意.MYSQL中对于游标的支持不是很好,功能也不太强大,根据书上说是,游标只能向前游动,而不能后退.而且游到末尾了也不能自己停止而是会报错.我们只能根据错误代码写一个出错处理程序才能够防止死循环.下面具体解释一个存储过程的执行过程.DELIMITER $$DROP PROCEDURE IF EXISTS `dbas`.`student` $$
    CREATE PROCEDURE `copy_info_student`(in student_grade smallint)
    BEGIN
    #以上四句属于必写语句,没有什么好说的.
    declare done int default 0;    #the flag of complete loop;
    declare id int default 0;
    #以上两句是什么变量的语句.
    declare cursor CURSOR For select id from student where grade = grade;
    #上面一句是声明游标的语句,游标的结果集友select语句确定.
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    #上面一句是游标的出错处理程序,02000是游标越界的错误代号,出错置done为1;
    open cursor;
    #这句打开游标;
    repeat
    #循环开始
        #select * from info_stu;
    #带#号的语句是注释掉的,调试时候曾用过,现已无用.
        fetch cursor into id;
    #游标向前移动一个位置,并取值存入id中;
        #select done;
    #已经注释掉了
        call copy_info_job(id);
        call copy_fellback_log(id);
        call copy_loan_bargain(id);
    #以上三句是调用其他存储过程,在此忽略
    until done END REPEAT;
    #判断条件,done为真则循环结束,否则继续.
    close cursor;
    #关闭游标;
    insert ......update.....select.....
    #其他语句;
    END $$DELIMITER ;
    #以上2句属于必写语句,没有什么好说的.