最近把系统从mssql转到mysql上,原来有做统计的存储过程也要一并移过来,原来的存储过程是用行列转换,动态生成sql语句然后用exec执行的,换到mysql后改用EXECUTE执行,在mysql命令行中调用存储过程可以得到列表 
+-------+--------------+-----------------+--------------+-----------+--------+ 
| se_no | max(se_code) | head            | 娼滃湪瀹㈡埛     | 鏈€夋嫨    | 鍚 
堣   | 
+-------+--------------+-----------------+--------------+-----------+--------+ 
|     1 | NULL         | 瓒呯骇绠$悊鍛?     |            1 |         1 |      2 

|  NULL | NULL         | 瓒呯骇绠$悊鍛?     |            1 |         1 |      2 

+-------+--------------+-----------------+--------------+-----------+--------+ 
(因为数据库是utf8的,所以列表是乱码),但用jdbc调用存储过程后好像没有执行execute语句,而是直接返回了动态生成的sql语句,就和在命令行中不执行最后两句 
PREPARE stmt2 FROM @psql;  
EXECUTE stmt2;  
的效果一样,哪位对mysql比较熟悉的大哥能帮个忙啊 存储过程代码 CREATE PROCEDURE empCusState( arg_sqlAppend text )  
BEGIN  
SET @psql = 'select se_no,max(se_code),max(se_name) as head';  
SELECT @psql:=CONCAT(@psql,  
CASE WHEN typ_name IS NOT NULL  
THEN (CONCAT(',sum(case typ_name when ''',typ_name,  
''' then 1 else 0 end) as ',typ_name,' '))  
ELSE (', sum(case when typ_name is null then 1 else 0 end) as 未选择')  
END)   
FROM   
(select typ_name from cus_cor_cus   
left join type_list on cor_typ_id=typ_id   
where cor_isdelete='1' group by typ_name order by typ_name desc)   
AS a;   
SET @psql:=CONCAT(@psql,  
',count(cor_code)as 合计 from cus_cor_cus   
inner join sal_emp on cor_se_no=se_no   
left join type_list on cor_typ_id=typ_id   
where cor_isdelete=''1'' group by se_no with rollup');  
PREPARE stmt2 FROM @psql;  
EXECUTE stmt2;  
END  

解决方案 »

  1.   

     @psql内容是什么
    set names gbk;
      

  2.   

    @psql就是最后执行的sql语句啊,
    我后来把中文都换成英文的还是不行
      

  3.   

    @psql里的值是对的,用命令行call的话结果是正确的,现在是返回的结果集就是
    SELECT @psql:=CONCAT(@psql,  
    CASE WHEN typ_name IS NOT NULL...
    一堆字符串,而不是执行了EXECUTE stmt2的结果集,如果把中间的这条SELECT @psql:=CONCAT(@psql... 去掉是能返回EXECUTE stmt2的结果集的,如果加上返回的就是
    +---------------------------------------------------------------------------------------+
    @psql:=CONCAT(@psql, CASE WHEN typ_name IS NOT NULL THEN (CONCAT(',sum(case typ_name when ''',typ_name, ''' then 1 else 0 end) as ',typ_name,' ')) ELSE (', sum(case when typ_name is null then 1 else 0 end) as 未选择') END)
    +---------------------------------------------------------------------------------------+
    select se_no,max(se_code),max(se_name) as head,sum...
    select se_no,max(se_code),max(se_name) as head,sum...
      

  4.   

    原来sqlserver是不返回第一个select的值的,也就是@psql的值,是直接返回EXECUTE stmt2的结果集
      

  5.   

    SELECT @psql:=CONCAT(@psql,  
    CASE WHEN typ_name IS NOT NULL  
    THEN (CONCAT(',sum(case typ_name when ''',typ_name,  
    ''' then 1 else 0 end) as ',typ_name,' '))  
    ELSE (', sum(case when typ_name is null then 1 else 0 end) as 未选择')  
    END)   
    FROM   
    (select typ_name from cus_cor_cus   
    left join type_list on cor_typ_id=typ_id   
    where cor_isdelete='1' group by typ_name order by typ_name desc)   
    AS a;   
    这是SQLSERVER的写法,在MYSQL中
    打开select typ_name from cus_cor_cus   
    left join type_list on cor_typ_id=typ_id   
    where cor_isdelete='1' group by typ_name order by typ_name desc
    游标,循环取值,
    给@psql赋值
      

  6.   

    就是返回了两个记录集,1是上面的方法,
    在SQL语句中加入CREATE TABLE TT AS 
    直接访问TT表