mysql存储过程实践

背景

偶然需要在数据库来实现部分功能学习了一下mysql的存储过程,感觉还蛮有意思的。
需求是:
获取传入字符串与数据库中对应字段的相似程度。
实现一个取表中字符串数据,循环比较传入数据与表中数据相同位的个数,取出相似的对应值,作为查询条件,返回查询结果。

知识积累

#当存储过程存在的时候删除
DROP PROCEDURE IF EXISTS imageserch;

#创建存储过程,可以是有参的,可以是无参的
#语法:CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])
#IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
#OUT:该值可在存储过程内部被改变,并可返回
#INOUT:调用时指定,并且可被改变和返回
CREATE PROCEDURE imageserch (
	IN dnacompare VARCHAR (30) #指定一个字符串的入参
)




#begin和end之间是存储过程的实现
BEGIN

#开始首先也是定义变量,用于存储查询结果,中间过程的变量等
#DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
#数据类型:int, float, date, varchar(length)
DECLARE
	dnasource VARCHAR (30);
DECLARE
	a VARCHAR (30);
DECLARE
	b VARCHAR (30);
DECLARE
	i INT;
DECLARE
	deff INT DEFAULT 0;
#这个用于处理游标到达最后一行的情况 
DECLARE
	done INT DEFAULT 0;

#声明游标cursor_name(cursor_name是个多行结果集)  
#这里使用游标来遍历表中数据
DECLARE
	cursor_pic CURSOR FOR SELECT
		dna
	FROM
		pic_work;

#设置一个终止标记(如果不要这句,会出现1329 - No data - zero rows fetched, selected, or processed错误信息)
#DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
DECLARE
	CONTINUE HANDLER FOR NOT FOUND
SET done = 1;


#打开游标  
OPEN cursor_pic;

#开始循环,判断是否游标已经到达了最后作为循环条件
#while ... do ... end while
#repeat... end repeat
#REPEAT   
WHILE done <> 1 DO
	#获取游标当前指针的记录,读取一行数据并传给变量 dnasource
	#下面两种写法都可以获取到游标当前的值
	#FETCH next From cursor_pic INTO dnasource;
	FETCH cursor_pic INTO dnasource;
	
#输出查出来的数据,可以使用SELECT进行变量的输出,方便调试
#SELECT dnasource;
SET deff = 0;
SET i = 0;

#遍历该输入数据与游标获取的数据库数据相似程度,使用循环
WHILE i < CHAR_LENGTH(dnasource) DO
SET a = SUBSTRING(dnasource, i, i + 1);
SET b = SUBSTRING(dnacompare, i, i + 1);

#使用IF判断
IF a != b THEN
SET deff = deff + 1;
END IF;

#增加循环变量
SET i = i + 1;

END WHILE;

#IF的嵌套
#if ... then ... else ... end if
IF done <> 1 THEN
	IF deff <= 5 THEN
		INSERT INTO pic_work_temp (dna)
	VALUES
		(dnasource);
	COMMIT;
	
	#SELECT deff;
	END IF;
END IF;

#UNTIL done
#END
#REPEAT
END
WHILE;

#关闭游标
CLOSE cursor_pic;

#SELECT dna FROM pic_work_temp;
SELECT
	*
FROM
	pic_work
WHERE
	dna IN (SELECT dna FROM pic_work_temp);

TRUNCATE TABLE pic_work_temp;

END
#调用存储过程
call imageserch("1210101");

执行结果
执行结果

常用字符串函数

CHARSET(str) //返回字串字符集
CONCAT (string2 [,… ]) //连接字串
INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0
LCASE (string2 ) //转换成小写
LEFT (string2 ,length ) //从string2中的左边起取length个字符
LENGTH (string ) //string长度
LOAD_FILE (file_name ) //从文件读取内容
LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定开始位置
LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为length
LTRIM (string2 ) //去除前端空格
REPEAT (string2 ,count ) //重复count次
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
RPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length
RTRIM (string2 ) //去除后端空格
STRCMP (string1 ,string2 ) //逐字符比较两字串大小,
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符
默认第一个字符下标为1,即参数position必须大于等于1

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