一个 mysql 行 转 列 的存储过程

转一个mysql 行 转 列 的存储过程
DELIMITER$$

DROP PROCEDURE IF EXISTS `test`.`sp_row_column_wrap`$$

CREATE DEFINER = `root`@`localhost` PROCEDURE `sp_row_column_wrap`( IN $schema_name varchar ( 64 ),
IN $table_name varchar ( 64 ))
BEGIN
declare cnt int ( 11 );
declare $table_rows int ( 11 );
declare i int ( 11 );
declare j int ( 11 );
declare s int ( 11 );
declare str varchar ( 255 );
-- Getthecolumnnumberofthetable
select count ( 1 ) from information_schema.columns where table_schema = $schema_name and table_name = $table_name into cnt;
-- Gettherownumberofthetable
select table_rows from information_schema.tables where table_schema = $schema_name and table_name = $table_name into $table_rows;
-- Checkwhetherthetableexistsornot
drop table if exists test. temp ;
create table if not exists test. temp (` 1 ` varchar ( 255 ) not null );
-- loop1start
set i = 0 ;
loop1:loop
if i = $table_rows - 1 then
leaveloop1;
end if ;
set @stmt1 = concat( ' altertabletest.tempadd` ' ,i + 2 , ' `varchar(255)notnull ' );
prepare s1 from @stmt1 ;
execute s1;
deallocate prepare s1;
set i = i + 1 ;
end looploop1;
-- loop1end;
set s = 0 ;
-- loop2start
loop2:loop
-- leaveloop2
if s = cnt then
leaveloop2;
end if ;
set @stmt2 = concat( ' selectcolumn_namefrominformation_schema.columnswheretable_schema=" ' ,$schema_name,
' "andtable_name=" ' ,$table_name, ' "limit ' ,s, ' ,1into@temp; ' );
prepare s2 from @stmt2 ;
execute s2;
deallocate prepare s2;
set j = 0 ;
set str = ' select ' ;
-- Loop3start
loop3:loop
if j = $table_rows then
leaveloop3;
end if ;
set @stmt3 = concat( ' select ' , @temp , ' from ' ,$schema_name, ' . ' ,$table_name, ' limit ' ,j, ' ,1into@temp2; ' );
prepare s3 from @stmt3 ;
execute s3;
set str = concat( str , ' " ' , @temp2 , ' " ' , ' , ' );
deallocate prepare s3;
set j = j + 1 ;
end looploop3;
set str = left ( str ,length( str ) - 1 );
-- insertnewdataintotable
set @stmt4 = concat( ' insertintotest.temp ' , str , ' ; ' );
prepare s4 from @stmt4 ;
execute s4;
deallocate prepare s4;
set s = s + 1 ;
end looploop2;
END $$

DELIMITER;

以下是测试结果:
======
select * from a;
select * from b;
select * from salary;

call sp_row_column_wrap('test','a');
select * from test.temp;
call sp_row_column_wrap('test','b');
select * from test.temp;
call sp_row_column_wrap('test','salary');
select * from test.temp;

query result(2 records)

aidtitle
1111
2222

query result(3 records)

bidaidimagetime
121.gif2007-08-08
222.gif2007-08-09
323.gif2007-08-08

query result(7 records)

idcostdesAutoid
110aaaa1
115bbbb2
120cccc3
280aaaa4
2100bbbb5
260dddd6
3500dddd7

query result(2 records)

12
12
111222

query result(4 records)

123
123
222
1.gif2.gif3.gif
2007-08-082007-08-092007-08-08

query result(4 records)

1234567
1112223
1015208010060500
aaaabbbbccccaaaabbbbdddddddd
1234567

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值