需求目標:將t_class 表numbers 欄位中含有 tom, tony, jack 的行記錄都刪除掉
切割字串部分引自mysql 通過儲存過程分割字串為陣列
create table t_class(
t_id int(10) not null auto_increment primary key ,
t_name varchar(50),
t_number text
);insert into t_class(t_name, t_number) values('english class', '');
insert into t_class(t_name, t_number) values('english class', '');
insert into t_class(t_name, t_number) values('maths class', '');
insert into t_class(t_name, t_number) values('maths class', '');
insert into t_class(t_name, t_number) values('history class', '');
insert into t_class(t_name, t_number) values('history class', '');
insert into t_class(t_name, t_number) values('english class', '');
insert into t_class(t_name, t_number) values('english class', '');
insert into t_class(t_name, t_number) values('english class', '');
insert into t_class(t_name, t_number) values('english class', '');
select * from t_class;
處理思路:①寫乙個儲存過程用來處理單個的行記錄,比如 把含有tom 的行找出來刪掉。
②下一步就是一步一步的遍歷,直到含有jack的行也被刪除,結束。 (這一塊也寫乙個儲存過程)
③遍歷的話,就涉及到分割字串了(substring_index,reverse這一套)
**如下:
-- 因為開啟了bin_log,為了能夠隨意的建立函式,可以閱讀
set global log_bin_trust_function_creators = 1;
-- 獲得所有以「某個符號「分割的字串的個數
delimiter //
drop function if exists func_get_split_string_total //
create function func_get_split_string_total(f_string text, f_delimiter varchar(5)) returns int(11)
begin
-- get the total number of given string.
-- 被替換掉了幾個字元,那麼陣列的長度就是 (替換掉的字元數 + 1)
return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
end //
delimiter ;
-- 按分割取出字串
delimiter //
drop function if exists func_get_split_string //
create function func_get_split_string(f_string text,f_delimiter varchar(5),f_order int) returns varchar(255) charset utf8
begin
-- get the separated number of given string.
declare result varchar(255) default '';
set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));
return result;
end //
delimiter ;
/* 關於reverse和substring_index(str,delim,count)
reverse: 反轉字串
substring_index: 如果count是正數從左邊數,得到第 count 個分隔符左邊那一部分, count是負數的話就是從右邊數,得到第count個分隔符右邊的部分。
正向截一次,反向截一次,正好得到第 count個字串
*/-- 刪除乙個的行記錄
delimiter //
create procedure dropsomestatus(in candidateid varchar(20))
begin
declare done boolean default 0;
declare tmp_id int default 0;
-- 注意:這裡完全可以 直接刪除,我只是想用下游標(^-^)
declare t_index cursor for select t.t_id from t_class t where t.t_number like concat("%", candidateid, "%");
declare continue handler for sqlstate '02000' set done = 1;
open t_index;
repeat
fetch t_index into tmp_id;
if done!=1 then
delte from t_class where t_id = tmp_id;
end if;
until done end repeat;
close t_index;
end //
delimiter ;
/* declare continue handler for sqlstate '02000' set done = 1;
02000 狀態碼意義,發生下述異常之一:
①select into 語句或 insert 語句的子查詢的結果為空表。
②在搜尋的 update 或 delete 語句內標識的行數為零。
③在 fetch 語句中引用的游標位置處於結果表最後一行之後。
可以閱讀
這裡我覺得用exit也行。
fetch 游標名稱 into 變數列表; 其中的變數列表數目要和上面select 的到結果集中列的數目一樣。
*/-- 輸入需要分割的字串和分隔符,迴圈呼叫dropsomestatus,實現需求目標
delimiter //
create procedure sp_print_result(in f_string text,in f_delimiter varchar(5))
begin
-- get the separated string.
declare cnt int default 0;
declare i int default 0;
set cnt = func_get_split_string_total(f_string,f_delimiter);
while i < cnt
doset i = i + 1;
-- 開始逐個篩選,刪除
call dropsomestatus(func_get_split_string(f_string,f_delimiter,i));
end while;
end //
delimiter ;
call sp_print_result("tom,tony,jack", ",");
-- 最終結果如下圖所示, tom,tony,jack相關資料都沒有了。
-- 怎麼開的怎麼關回去
mysql儲存過程建立 刪除 執行
mysql儲存過程 建立儲存過程 建立例子一 delimiter create procedure query user currcid int begin declare currkeywordid int declare currtitle varchar 255 declare currkey...
MySQL 儲存過程刪除大表
1 許可權問題 alter routine 編輯或刪除儲存過程 create routine 建立儲存過程 execute 建立儲存過程 2 儲存過程相關的一些命令 show procedure status g 檢視資料庫中有哪些儲存過程 show procedure status where d...
刪除儲存過程
declare procname varchar 500 declare cur cursor for select name from sys.objects where type p open cur fetch next from cur into procname while fetch s...