MySql-存储过程,字符串数组
1. 原理
是利用创建临时表来存储,然后用完之后再删除
2. 有注释
-- 1.将mysql分隔符从;设置为$$
DELIMITER $$
-- 2.如果存在存储过程my_run_sql则删除
DROP PROCEDURE IF EXISTS `my_run_sql` $$
-- 3.定义存储过程,执行sql。传入参数run_sql_str字符串类型,为执行sql的语句
CREATE PROCEDURE `my_run_sql`(IN `run_sql_str` VARCHAR(200)) BEGIN
-- 4.要先设置局部变量,下一句执行就没问题,不然会出问题,目前不知道原因
SET @sqlStr:=CONCAT(run_sql_str);
-- 5.预编释,stmt预编释变量的名称
PREPARE stmt from @sqlStr;
-- 6.执行SQL语句
EXECUTE stmt;
-- 7.释放资源
DEALLOCATE PREPARE stmt;
END $$
-- 8.如果存在存储过程str_array则删除
DROP PROCEDURE IF EXISTS `str_array` $$
-- 9.定义存储过程,字符串数组。
-- 传入参数array_table_name字符串类型,为临时表表名。传入参数array_table_field_name字符串类型,为临时表字段名。传入参数str_info字符串类型,为需要切割的字符串。出入参数split_str字符串类型,为切割符号
CREATE PROCEDURE `str_array`(IN `array_table_name` VARCHAR(200), IN `array_table_field_name` VARCHAR(200), IN `str_info` VARCHAR(20000), IN `split_str` VARCHAR(200)) BEGIN
-- 10.创建临时表sql
SET @sqlStr:=CONCAT("CREATE TABLE `", array_table_name, "` ( `", array_table_field_name, "` VARCHAR(100) )");
-- 11.执行创建临时表
CALL my_run_sql(@sqlStr);
-- 12.初始化数组下标
SET @i = 1;
-- 13.得出数组成员总数
SET @count = CHAR_LENGTH( str_info ) - CHAR_LENGTH( REPLACE ( str_info, split_str, '' ) ) + 1;
-- 14.循环
WHILE @i <= @count DO
-- 15.每次切割获取的值
SET @value_tmp = SUBSTRING_INDEX( SUBSTRING_INDEX( str_info, split_str, @i ), split_str,- 1 );
-- 16.依次插入每个成员的sql
SET @sqlStr:=CONCAT("INSERT INTO ", array_table_name, " (", array_table_field_name, ") ", " VALUES ( '", @value_tmp, "' )");
-- 17.执行上面sql
CALL my_run_sql(@sqlStr);
-- 18.数据下标加一
SET @i = @i + 1;
-- 19.循环结束
END WHILE;
END $$
DELIMITER ;
-- 20.临时表表名
SET @array_table_name='MY_ARRAY_TMP';
-- 21.临时表字段名
SET @array_table_field_name='field1';
-- 22.需要切割的字符串
SET @str_info = "www mysql com hcymysql blog 51cto com";
-- 23.切换字符串的切割符号
SET @split_str = " ";
-- 24.执行切割字符串并存储到临时表
CALL str_array(@array_table_name, @array_table_field_name, @str_info, @split_str);
-- 25.查询临时表sql
SET @sqlStr:=CONCAT("SELECT * FROM ", @array_table_name);
-- 26.执行sql
CALL my_run_sql(@sqlStr);
-- 27.删除临时表sql
SET @sqlStr:=CONCAT("drop table ", @array_table_name);
-- 28.执行sql
CALL my_run_sql(@sqlStr);
-- 29.删除2个存储过程
DROP PROCEDURE IF EXISTS `str_array`;
DROP PROCEDURE IF EXISTS `my_run_sql`;
3. 无注释
DELIMITER $$
DROP PROCEDURE IF EXISTS `my_run_sql` $$
CREATE PROCEDURE `my_run_sql`(IN `run_sql_str` VARCHAR(200)) BEGIN
SET @sqlStr:=CONCAT(run_sql_str);
PREPARE stmt from @sqlStr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DROP PROCEDURE IF EXISTS `str_array` $$
CREATE PROCEDURE `str_array`(IN `array_table_name` VARCHAR(200), IN `array_table_field_name` VARCHAR(200), IN `str_info` VARCHAR(20000), IN `split_str` VARCHAR(200)) BEGIN
SET @sqlStr:=CONCAT("CREATE TABLE `", array_table_name, "` ( `", array_table_field_name, "` VARCHAR(100) )");
CALL my_run_sql(@sqlStr);
SET @i = 1;
-- 得出数组成员总数
SET @count = CHAR_LENGTH( str_info ) - CHAR_LENGTH( REPLACE ( str_info, split_str, '' ) ) + 1;
WHILE
@i <= @count DO
-- 依次插入每个成员
SET @value_tmp = SUBSTRING_INDEX( SUBSTRING_INDEX( str_info, split_str, @i ), split_str,- 1 );
SET @sqlStr:=CONCAT("INSERT INTO ", array_table_name, " (", array_table_field_name, ") ", " VALUES ( '", @value_tmp, "' )");
CALL my_run_sql(@sqlStr);
SET @i = @i + 1;
END WHILE;
END $$
DELIMITER ;
SET @array_table_name='MY_ARRAY_TMP';
SET @array_table_field_name='field1';
SET @str_info = "www mysql com hcymysql blog 51cto com";
SET @split_str = " ";
CALL str_array(@array_table_name, @array_table_field_name, @str_info, @split_str);
SET @sqlStr:=CONCAT("SELECT * FROM ", @array_table_name);
CALL my_run_sql(@sqlStr);
SET @sqlStr:=CONCAT("drop table ", @array_table_name);
CALL my_run_sql(@sqlStr);
DROP PROCEDURE IF EXISTS `str_array`;
DROP PROCEDURE IF EXISTS `my_run_sql`;