MySQL儲存過程刪除包含目標字串所有相關資料

2021-10-08 01:17:35 字數 4292 閱讀 4284

需求目標:將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...