Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql-如何在存储过程中拆分文本变量_Mysql_Stored Procedures - Fatal编程技术网

Mysql-如何在存储过程中拆分文本变量

Mysql-如何在存储过程中拆分文本变量,mysql,stored-procedures,Mysql,Stored Procedures,我有一个MySQL变量,如下所示 DECLARE str TEXT DEFAULT '2014-01-02 13:00:00|2014-02-04 12:59:59@0@2014-02-04 13:00:00|2014-03-04 12:59:59@0@2014-03-04 13:00:00|2014-04-02 13:59:59@0@2014-04-02 14:00:00|2014-05-02 14:59:59@0@2014-05-02 15:00:00|2014-06-03 14:59:59

我有一个
MySQL
变量,如下所示

DECLARE str TEXT DEFAULT '2014-01-02 13:00:00|2014-02-04 12:59:59@0@2014-02-04 13:00:00|2014-03-04 12:59:59@0@2014-03-04 13:00:00|2014-04-02 13:59:59@0@2014-04-02 14:00:00|2014-05-02 14:59:59@0@2014-05-02 15:00:00|2014-06-03 14:59:59';  
我想首先使用分隔符
@0@
来断开整个字符串,然后从结果中使用分隔符
|
来断开字符串

我已经尝试了MySQL
split\u str
功能,但我无法做到这一点。
它给我的错误
split\u str不存在


请建议其他方法。

最后,我使用以下步骤解决了问题

我能够使用临时表和程序解决它。我不再为此使用mysql变量。我们可以按如下方式调用该过程

 CALL SplitString('2014-01-02 13:00:00|2014-02-04 12:59:59@0@2014-02-04 13:00:00|2014-03-04 12:59:59@0@2014-03-04 13:00:00|2014-04-02 13:59:59@0@2014-04-02 14:00:00|2014-05-02 14:59:59@0@2014-05-02 15:00:00|2014-06-03 14:59:59', '@0@', 'tblindex');
 DELIMITER $$

 DROP PROCEDURE IF EXISTS `SplitString`$$

 CREATE PROCEDURE `SplitString`( IN input TEXT,IN delm VARCHAR(10),tblnm varchar(50))
 BEGIN
     DECLARE cur_position INT DEFAULT 1 ;
     DECLARE remainder TEXT;
     DECLARE cur_string VARCHAR(1000);
     DECLARE delm_length TINYINT UNSIGNED;
     set @sql_drop = concat("DROP TABLE IF EXISTS ",tblnm); 
     prepare st_drop from @sql_drop;
     execute st_drop; 
     set @sql_create = concat("CREATE TEMPORARY TABLE ",tblnm," (value VARCHAR(2000) NOT NULL ) ENGINE=MEMORY;");
     prepare st_create from @sql_create;
     execute st_create; 
     SET remainder = input;
     SET delm_length = CHAR_LENGTH(delm);
     WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 
     DO
         SET cur_position = INSTR(remainder, delm);
         IF cur_position = 0 THEN
             SET cur_string = remainder;
         ELSE
             SET cur_string = LEFT(remainder, cur_position - 1);
         END IF;
         -- select cur_string;
         IF TRIM(cur_string) != '' THEN
             set @sql_insert = concat("INSERT INTO ",tblnm," VALUES ('",cur_string,"');");
             prepare st_insert from @sql_insert;
             execute st_insert; 
         END IF;
         SET remainder = SUBSTRING(remainder, cur_position + delm_length);
     END WHILE;

 END$$

 DELIMITER ;
这里tblindex是我使用过的临时表

我的程序如下

 CALL SplitString('2014-01-02 13:00:00|2014-02-04 12:59:59@0@2014-02-04 13:00:00|2014-03-04 12:59:59@0@2014-03-04 13:00:00|2014-04-02 13:59:59@0@2014-04-02 14:00:00|2014-05-02 14:59:59@0@2014-05-02 15:00:00|2014-06-03 14:59:59', '@0@', 'tblindex');
 DELIMITER $$

 DROP PROCEDURE IF EXISTS `SplitString`$$

 CREATE PROCEDURE `SplitString`( IN input TEXT,IN delm VARCHAR(10),tblnm varchar(50))
 BEGIN
     DECLARE cur_position INT DEFAULT 1 ;
     DECLARE remainder TEXT;
     DECLARE cur_string VARCHAR(1000);
     DECLARE delm_length TINYINT UNSIGNED;
     set @sql_drop = concat("DROP TABLE IF EXISTS ",tblnm); 
     prepare st_drop from @sql_drop;
     execute st_drop; 
     set @sql_create = concat("CREATE TEMPORARY TABLE ",tblnm," (value VARCHAR(2000) NOT NULL ) ENGINE=MEMORY;");
     prepare st_create from @sql_create;
     execute st_create; 
     SET remainder = input;
     SET delm_length = CHAR_LENGTH(delm);
     WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 
     DO
         SET cur_position = INSTR(remainder, delm);
         IF cur_position = 0 THEN
             SET cur_string = remainder;
         ELSE
             SET cur_string = LEFT(remainder, cur_position - 1);
         END IF;
         -- select cur_string;
         IF TRIM(cur_string) != '' THEN
             set @sql_insert = concat("INSERT INTO ",tblnm," VALUES ('",cur_string,"');");
             prepare st_insert from @sql_insert;
             execute st_insert; 
         END IF;
         SET remainder = SUBSTRING(remainder, cur_position + delm_length);
     END WHILE;

 END$$

 DELIMITER ;

你看到了吗?我不知道常见的模式…让我先检查一下。