本帖最后由 jeffery_xu82 于 2014-02-19 12:59:17 编辑

解决方案 »

  1.   

    select concat(b.jys_dm,a.zq_dm) from zq a inner join jys b
    on a.zq_cxhq=b.jys_id
    where a.zq_cxhq=1结果是否正确。可以将上述结果插入到临时表中保存
      

  2.   


    select concat(b.jys_dm, a.zq_dm) from zq a inner join jys b 
    on a.zq_cxhq = b.jys_id
     where a.zq_cxhq= 1;
    +---------------------------+
    | concat(b.jys_dm, a.zq_dm) |
    +---------------------------+
    | SH110007                  |
    | SH110015                  |
    | SH110017                  |
    | SH110020                  |
    | SH113001                  |
    | SH113005                  |
    | SH131810                  |
    | SH601318                  |
    | SH601872                  |
    | SH110007                  |
    | SH110015                  |
    | SH110017                  |
    | SH110020                  |
    | SH113001                  |
    | SH113005                  |
    | SH601318                  |
    | SH601872                  |
    +---------------------------+
    17 rows in set (0.00 sec)
    结果是正常的呀。
      

  3.   

    我似乎找到问题了?难道MySQL的存储过程中,使用了游标的话,就不能用OUT返回值吗?我把存储过程中
    OUT jyszqdm VARCHAR(100)
    这一句去掉,然后在循环结束之后,加上一句:
    UPDATE table_temp SET _value = jyszq WHERE id = 1;
    把得到的字符串变量jyszq,用UPDATE的语句,传给另外一张新表。
    在新表中,就可以得到所想要的字符串。这是为什么???
    我的MySQL版本是5.532
      

  4.   

    SET jyszq='';
    赋值,否则为NULL
      

  5.   


    现在我能确认循环结束之后,变量jyszq的值,是我想要的结果,但是用OUT返回给delphi的话,就不行。
      

  6.   


    现在我能确认循环结束之后,变量jyszq的值,是我想要的结果,但是用OUT返回给delphi的话,就不行。DELPHI取得返回值的方法,我应该是没有问题的。
    因为如果我把mysql存储过程中的语句全部清空,然后改为最简单的 SET jysdm = 'abc';,再用OUT输出的话,在DELPHI中可以正常的得到值abc。
      

  7.   


    我现在只能这么做了。非常感谢。只是觉得MySQL不会这么弱吧?
      

  8.   

    用结果集方法:
    select jyszq;在DELPHI中
    query.open; while not query.eof do begin //读数据 query.next; end;
      

  9.   

    CREATE  PROCEDURE hrkip.routine_Sshq()
    BEGIN
      DECLARE done  int default 0;
      DECLARE zqdm VARCHAR(45) default '';  
      DECLARE jysdm VARCHAR(45) default '';
      DECLARE jyszq VARCHAR(100) default '';
      DECLARE jyszqdm VARCHAR(100) default '';
      DECLARE cur_zqhq  CURSOR FOR SELECT zq_dm, jys_dm  FROM zq  LEFT JOIN jys  ON jys.jys_id = zq.jys_id  WHERE zq_cxhq = 1;
      DECLARE CONTINUE handler for not found set done = 1;
      OPEN cur_zqhq;
    REPEAT
    fetch  cur_zqhq into  zqdm, jysdm;
     IF not done THEN
          SET jyszq = CONCAT(jyszq, jysdm, zqdm, ',');
     END IF;
    until done end repeat;
    close cur_zqhq;
     SET jyszqdm  = jyszq;
    END不知道楼主打算怎么使用存储过程的最终结果 ?如果只是使用存储过程的结果,为什么不创建函数,函数不是有返回值,直接接收使用即可 
    CREATE 
    FUNCTION hrkip.routine_Sshq()
      RETURNS varchar(255) CHARSET utf8
    BEGIN 
      declare result varchar(255) default ''; 
      DECLARE done  int default 0;
      DECLARE zqdm VARCHAR(45) default '';  
      DECLARE jysdm VARCHAR(45) default '';
      DECLARE jyszq VARCHAR(100) default '';
      DECLARE jyszqdm VARCHAR(100) default '';
      DECLARE cur_zqhq  CURSOR FOR SELECT zq_dm, jys_dm  FROM zq  LEFT JOIN jys  ON jys.jys_id = zq.jys_id  WHERE zq_cxhq = 1;
      DECLARE CONTINUE handler for not found set done = 1;
      OPEN cur_zqhq;
    REPEAT
    fetch  cur_zqhq into  zqdm, jysdm;
     IF not done THEN
          SET jyszq = CONCAT(jyszq, jysdm, zqdm, ',');
     END IF;
    until done end repeat;
    close cur_zqhq;
     SET jyszqdm  = jyszq;
      set result =  jyszq;
            return result; 
    END
      

  10.   

    CREATE DEFINER=`root`@`localhost` PROCEDURE `routine_Sshq`(
      OUT jyszqdm VARCHAR(100)
    )
    BEGIN
      DECLARE zqdm VARCHAR(45);  
      DECLARE jysdm VARCHAR(45);
      DECLARE jyszq VARCHAR(100);
      DECLARE done TINYINT(1) DEFAULT 0;
     
      DECLARE cur_zqhq
      CURSOR FOR SELECT zq_dm, jys_dm
        FROM zq
        LEFT JOIN jys
        ON jys.jys_id = zq.jys_id
        WHERE zq_cxhq = 1;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
     
      OPEN cur_zqhq;
      REPEAT
        FETCH cur_zqhq INTO zqdm, jysdm;
        IF done = 0 THEN
          SET jyszq = CONCAT(jyszq, jysdm, zqdm, ',');
        END IF;
    select jyszq ;
      UNTIL done = 1 END REPEAT;
      SET jyszqdm  = jyszq;
    END
    加上这种然后再观察循环是否在工作。
      

  11.   

    我已经能够确认变量jyszq的值,是我想要的结果。只是无法用OUT传给DELPHI。另外我发现,只要我在MySQL存储过程中使用了游标,然后又在存储过程中使用了IN或OUT参数,那么这个存储过程就无法正常执行。难道MySQL有这种限制?还是我的设置有问题?
      

  12.   

    我已经能够确认变量jyszq的值,是我想要的结果。只是无法用OUT传给DELPHI。另外我发现,只要我在MySQL存储过程中使用了游标,然后又在存储过程中使用了IN或OUT参数,那么这个存储过程就无法正常执行。难道MySQL有这种限制?还是我的设置有问题?如果存储过程使用out参数,需要借助其他数据库管理工具(dbforge.studio.for.mysql)才能正常执行并看到效果,在phpmyadmin ,数据库命令行,Navicat for MySQL均无法正常执行。 另外我在上边不是说过了吗?可以使用函数替换存储过程 (存储过程与函数代码 楼上有)
      

  13.   

    OUT值无法直接给其它开发程序, 只能用 select 再取一次call proc('hello', @x);
    select @x;
      

  14.   

    你的这个问题在VC中同样存在。只要存储过程中使用游标,就无法通过out参数传回数据,且还导致应用软件连接中断。如果不使用游标,则一切正常。可能是Mysql存储过程的bug。
    最近从oracle平台切换到Mysql平台,也是这个小问题,纠结我两天,看来还是用临时表方法取代游标。
    Mysql还要继续努力