SET @EE=''; 
SELECT @EE:=CONCAT(@EE,'sum(IF(p_name=\'',p_name,'\'',',amount,0)) AS `',p_name,'`,') FROM (SELECT DISTINCT p_name FROM history_number where pdate='2010-01-25' order by p_orderNo) A; 
SET @QQ=CONCAT('SELECT ifnull(u_name,\'total\'),',@EE,'sum(amount) AS TOTAL FROM history_number where pdate=\'2010-01-25\' GROUP BY u_name WITH ROLLUP');PREPARE stmt2 FROM @QQ;
EXECUTE stmt2;
上面代码只能写在存储过程吗,能不能用jdbc写。如果只能写在存储过程,请问怎么返回结果集???

解决方案 »

  1.   

    如果你要在数据库中,必须用SP,如果你要用语言方式,
    在语言环境中累加生成SQL语句,再将此字符串发回MYSQL执行,其实是一致的,
    你可以生成临时表 OR 在语言环境中打开记录集取结果
      

  2.   

    可以啊,只要在同一个connection 中就可以了。 只要你的connection 保持不断,这些变量即有效。你可以通过JDBC一句句执行就可以了。
      

  3.   

    DELIMITER $$;
    DROP PROCEDURE IF EXISTS `newspaper`.`getList`$$
    CREATE PROCEDURE `newspaper`.`getList` ()
    BEGIN
    SET @EE=''; 
    SELECT @EE:=CONCAT(@EE,'sum(IF(p_name=\'',p_name,'\'',',amount,0)) AS `',p_name,'`,') FROM (SELECT DISTINCT p_name FROM history_number where pdate='2010-01-25' order by p_orderNo) A; 
    SET @QQ=CONCAT('SELECT ifnull(u_name,\'total\'),',@EE,'sum(amount) AS TOTAL FROM history_number where pdate=\'2010-01-25\' GROUP BY u_name WITH ROLLUP');PREPARE stmt2 FROM @QQ;
     EXECUTE stmt2;
    END$$DELIMITER ;$$
    要怎么改。
      

  4.   


    不一定要写在存储过程中。
    如果是存储过程,你可以直接向执行 select 语句一样的方法 call getList() 得到返回结果集。
      

  5.   


    call getList()得到的只是@ee的结果,并不能得到EXECUTE stmt2的结果
      

  6.   

    conn = DB.getConn();
    sql = "SET @EE='';";
    pstmt = DB.prepareStmt(conn, sql);
    pstmt.execute();

    sql="SELECT @EE:=CONCAT(@EE,'sum(IF(p_name=\'',p_name,'\'',',amount,0)) AS `',p_name,'`,') FROM (SELECT DISTINCT p_name FROM history_number where pdate='2010-01-25' order by p_orderNo) A;";
    pstmt = DB.prepareStmt(conn, sql);
    pstmt.execute();
    sql="SET @QQ=CONCAT('SELECT ifnull(u_name,\'total\'),',@EE,'sum(amount) AS TOTAL FROM history_number where pdate=\'2010-01-25\' GROUP BY u_name WITH ROLLUP');";
    pstmt = DB.prepareStmt(conn, sql);
    pstmt.execute();
    sql="PREPARE stmt2 FROM @QQ;";
    pstmt = DB.prepareStmt(conn, sql);
    pstmt.execute();sql=" EXECUTE stmt2;";
    pstmt = DB.prepareStmt(conn, sql);
    pstmt.execute();用jdbc是这样写吗,执行时出错
      

  7.   

    哦,默认取的是第一个结果集。这个存储过程返回了至少两个结果集。如果是C或者VB中可以通过nextrecordset得到第二个结果集。jdbc中看看有没有对应的操作。
      

  8.   

    java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'total'),',@EE,'sum(amount) AS TOTAL FROM history_number where pdate='2010-01-25'' at line 1
      

  9.   

    楼上的用jdbc执行还是有错。现在用jdbc调用存储过程返回结果包,用rs.getMoreResultSet可以获得多个记录集了。但我在存储过程增加了一个输入参数,为什么不起作用??下面是代码:
    DELIMITER $$;DROP PROCEDURE IF EXISTS `newspaper`.`getList`$$CREATE PROCEDURE `getList`(pdate varchar(20))
    BEGIN
    SET @EE=''; 
    SELECT @EE:=CONCAT(@EE,'sum(IF(p_name=\'',p_name,'\'',',amount,0)) AS `',p_name,'`,') FROM (SELECT DISTINCT p_name FROM history_number where pdate=',pdate,' order by p_orderNo) A; 
    SET @QQ=CONCAT('SELECT ifnull(u_name,\'total\') as USER,',@EE,'sum(amount) AS TOTAL FROM history_number where pdate=',pdate,' GROUP BY u_name WITH ROLLUP');
    PREPARE stmt2 FROM @QQ;
     EXECUTE stmt2;
    END$$DELIMITER ;$$
      

  10.   

    history_number 表中 pdate 是什么数据类型?
      

  11.   

    哦,难道是类型错了,pdate字段是date类型的。
      

  12.   

    date类型需要加上 ''SELECT @EE:=CONCAT(@EE,'sum(IF(p_name=\'',p_name,'\'',',amount,0)) AS `',p_name,'`,') FROM (SELECT DISTINCT p_name FROM history_number where pdate=\'',pdate,'\' order by p_orderNo) A; 
      

  13.   

    CREATE PROCEDURE `getList`(pdate date)是不是要改为date类型。
      

  14.   

    DELIMITER $$; DROP PROCEDURE IF EXISTS `newspaper`.`getList`$$ CREATE PROCEDURE `getList`(in pdate varchar(20)) 
    BEGIN 
    SET @EE=''; 
    SELECT @EE:=CONCAT(@EE,'sum(IF(p_name=\'',p_name,'\'',',amount,0)) AS `',p_name,'`,') FROM (SELECT DISTINCT p_name FROM history_number where pdate=\'',pdate,'\' order by p_orderNo) A; 
    SET @QQ=CONCAT('SELECT ifnull(u_name,\'total\') as USER,',@EE,'sum(amount) AS TOTAL FROM history_number  where pdate=\'',pdate,'\'  GROUP BY u_name WITH ROLLUP'); 
    PREPARE stmt2 FROM @QQ; 
    EXECUTE stmt2; 
    END$$ DELIMITER ;$$改成\'',pdate,'\'编译无法通过(影响 0 条记录)
    (耗费 0 ms)错误代码: 1064
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' order by p_orderNo) A; 
    SET @QQ=CONCAT('SELECT ifnull(u_name,\'total\') as US' at line 4
    (耗费 0 ms)
      

  15.   

    CREATE PROCEDURE `getList`(in v_pdate varchar(20)) 
    BEGIN 
    SET @EE=''; 
    SELECT @EE:=CONCAT(@EE,'sum(IF(p_name=\'',p_name,'\'',',amount,0)) AS `',p_name,'`,') FROM (SELECT DISTINCT p_name FROM history_number where pdate=v_pdate order by p_orderNo) A; 
    SET @QQ=CONCAT('SELECT ifnull(u_name,\'total\') as USER,',@EE,'sum(amount) AS TOTAL FROM history_number  where pdate=\'',v_pdate,'\'  GROUP BY u_name WITH ROLLUP'); 
    PREPARE stmt2 FROM @QQ; 
    EXECUTE stmt2; 
    END$$