12.mysql 字段名表名传入过程,动态语句(tcy)

1. 存储过程变量   2019/2/10

#实例:统计表的行数,验证参数的传入和结果的获取

/*最方便的方法是直接在MySQL Workbench sql语句执行窗口编写*/

drop table if exists tb_1; 

create table tb_1 (name varchar(10), age int); 

insert into tb_1 values('Tom', 10),('Bob', 20),('May', 30); 

drop procedure IF EXISTS count_sub; 

 

delimiter //

#此种过程不能作为变量传入表名,字段名。但可以传递数值。

create procedure count_sub(in in_name varchar(10),in in_age int,in delayTime int ) 

begin 

    declare c1 int default 0;-- 声明局部变量

    declare c2 int default 0; 

    set delayTime=2;         -- 延时2秒显示

--  方式 1    

    select count(*) into c1 from tb_1; 

--  select sleep(delayTime);

--  方式 2 

    set c2=(select count(*) as t from tb_1); #等效set c2=t;

--  方式 3 

    set @c3=(select count(*) from tb_1);   #回话变量 

--  方式 4加条件 

    select count(*) into @c4 from tb_1 where name=in_name and age=in_age;

--  多个列的情况只能用 into 方式 

    select max(age), avg(age) into @max_age, @avg_age  from tb_1;# @avg_age as t错误用法 

   

--  显示   

    select c1,c2,@c3,@c4, @max_age,@avg_age  ; 

end 

//

delimiter ;

-- 过程调用

call count_sub('Tom',10,2);

-- 结果显示

/*

c1   c2   @c3  @c4 @max_age  @avg_age

3    3    3    1   30        20.000000000

*/

#===========================================================

2.动态sql, 即动态参数:

   在存储过程中,想要直接用表名变量做参数,动态执行sql,不能直接写

create procedure ( $tableName char(20) )

BEGIN

select * from tableName;

END

说明:

   1)mysql 不支持表名作为变量,解决方法: 通过构造sql字符串去用方法执行

   2)参数命名:where后面变量名不能和字段名相同,update和insert into可以

   3)where后面条件字段动态获取不一定能动态生成正确的语句导致执行结果错误

例子:动态sql,select查询: “select * into @var”,后边就可以直接运用该变量

 

set @in_tb_name='tb_1';#数据表名

set @col_age='age';      #字段名

set @people='Tom';       #字段name中的值

set @sql = concat('select count(@col_age), max(',@col_age,') into @n_age,@max_age from ', @in_tb_name,

                           ' where name=@people');# @ col_age 就保存了查询结果

                                                                   # max(',@col_age,')传入变量推荐用法,若去掉引号结果为’age’

prepare stmt1 from @sql;

execute stmt1;

deallocate prepare stmt1;

select @n_age,@max_age;

 

输出结果

/*

@n_age   @max_age

  1.               0              */

猜你喜欢

转载自blog.csdn.net/tcy23456/article/details/86943527