存儲過程之新增或者修改字段

1、判斷字段不存在則增加該字段

Talk is cheap, show me your code!

-- [新增]判斷字段不存在則增加該字段
drop procedure if exists proc_add_column_unless_exist;
delimiter $$
create procedure proc_add_column_unless_exist(in var_table_name varchar(64),in var_column_name varchar(64),in var_sqlstr varchar(1024))
top:begin
	-- 表不存在則直接返回
	set @p_tablenum='';
	set @sqlstr1=concat('select count(table_name)into @p_tablenum from information_schema.tables where table_schema=database() and table_name=\'',var_table_name,'\' limit 1;');	
	prepare stmt1 from @sqlstr1;
	execute stmt1;
	deallocate prepare stmt1;
	if(@p_tablenum<1)then
		leave top;
	end if;

	-- 字段已存在則直接返回
	set @p_columnnum='';
	set @sqlstr=concat('select count(column_name) into @p_columnnum from information_schema.columns where table_schema=database() and table_name=\'',var_table_name,'\'and column_name =\'',var_column_name,'\';');
	prepare stmt2 from @sqlstr;
	execute stmt2;
	deallocate prepare stmt2;
	if(@p_columnnum>0)then
		leave top;
	end if;
	
	-- 表存在且字段不存在則創建新字段
	set @sqlcmd=var_sqlstr;
	prepare stmt3 from @sqlcmd;
	execute stmt3;
	deallocate prepare stmt3;
end $$
delimiter;

2、修改表字段的函數,有則修改,無則不修改

-- [新增]修改表字段的函數
drop procedure if exists proc_modify_column_unless_exist;
delimiter $$
 
create procedure proc_modify_column_unless_exist(in var_table_name varchar(64),in var_column_name varchar(64),in var_sqlstr varchar(1000))
top:begin
	-- 表不存在則直接返回
	set @p_tablenum='';
	set @sqlstr1=concat('select count(table_name)into @p_tablenum from information_schema.tables where table_schema=database) and table name=\'',var_table_name, '\'limit 1;');
	prepare stmt1 from @sqlstr1;
	execute stmt1;
	deallocate prepare stmt1;
	if(@p_tablenum<1)then
		leave top;
	end if;
 
	-- 字段不存在則直接返回
	set @p_columnnum='';
	set @sqlstr=concat('select count(column_name)into @p_columnnum from information_schema.columns where table_schema=database() and table_name=\'',var_table_name, '\'and column_name=\'',var_column_name,'\';');
	prepare stmt2 from @sqlst;
	execute stmt2;
	deallocate prepare stmt2;
	if(@p_columnnum <=0)then
		leave top;
	end if;
 
 
	-- 表存在且字段存在則修改字段
	set @sqlcmd=var_sqlstr;
	prepare stmt3 from @sqlcmd;
	execute stmt3;
	deallocate prepare stmt3;
	end $$
delimiter;

知識點補充:

1、declare和set定義變量的區別?

declare(稱爲存儲過程變量)定義的類似是局部變量,declare僅在方法中生效,即只在存儲過程中的begin和end之間生效;,set(稱爲會話變量)定義的類似全局變量,,即這個變量可以在被調用的存儲過程或者代碼之間共享數據,變量面前必須加@符號(@是用戶自定義變量,@@是系統定義變量)。

2、查出該表有哪些索引,索引名-->集合

SHOW INDEX FROM t_emp
元數據:meta DATA  描述數據的數據

SELECT index_name  FROM information_schema.STATISTICS WHERE table_name='t_emp' AND table_schema='mydb'
 AND index_name <>'PRIMARY' AND seq_in_index = 1

3、 如何循環集合

 CURSOR 遊標
 FETCH xxx INTO xxx

4、如何讓mysql執行一個字符串


PREPARE 預編譯 XXX

EXECUTE

5、執行存儲過程 

CALL proc_drop_index ('mydb','t_emp');

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章