MySQL存储过程中处理数组 UDF代码分享

在存储过程中,传入的参数经常可能会有数组,而mysql没有自带处理数组的方法或函数。

需求是这样的:
传入数组形如:【aaa|bbb|ccc】
返回值形如:【aaa】、【bbb】、【ccc】


自己写了一个自定义函数来完成上述需求:

使用例子:
  1. mysql> select FUN_GET_ELEMENT('第一个|第二个|第三个', '|', -1);
  2. +------------------------------------------------------------------------------+
  3. | FUN_GET_ELEMENT('第一个|第二个|第三个', '|', -1)                               |
  4. +------------------------------------------------------------------------------+
  5. | 上越界                                                                        |
  6. +------------------------------------------------------------------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> select FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 0);
  9. +------------------------------------------------------------------------------+
  10. | FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 0)                               |
  11. +------------------------------------------------------------------------------+
  12. | 第一个                                                                       |
  13. +------------------------------------------------------------------------------+
  14. 1 row in set (0.00 sec)
  15. mysql> select FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 1);
  16. +-----------------------------------------------------------------------------+
  17. | FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 1)                               |
  18. +-----------------------------------------------------------------------------+
  19. | 第二个                                                                       |
  20. +-----------------------------------------------------------------------------+
  21. 1 row in set (0.01 sec)
  22. mysql> select FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 2);
  23. +-----------------------------------------------------------------------------+
  24. | FUN_GET_ELEMENT('第一个|第二个|第三个', '|', 2)                               |
  25. +-----------------------------------------------------------------------------+
  26. | 第三个                                                                       |
  27. +-----------------------------------------------------------------------------+
  28. 1 row in set (0.00 sec)
  29. mysql> select FUN_GET_ELEMENT('第一个/第二个/第三个', '/', 5);
  30. +-----------------------------------------------------------------------------+
  31. | FUN_GET_ELEMENT('第一个/第二个/第三个', '/', 5)                               |
  32. +-----------------------------------------------------------------------------+
  33. | 下越界                                                                       |
  34. +-----------------------------------------------------------------------------+
  35. 1 row in set (0.00 sec)

其中传入的值有三个:
第一个是要处理的数组,
第二个是数组内元素与元素的分隔符,比如 | /
第三个是要取出的元素索引,比如,0为第一个元素,1为第二个元素,以此类推,若输入的索引 没有值,则返回上越界或下越界

FUN_GET_ELEMENT函数定义:

  1. DROP FUNCTION IF EXISTS FUN_GET_ELEMENT;

  2. delimiter ;;

  3. CREATE FUNCTION `FUN_GET_ELEMENT`(
  4.     `mainstring` varchar(1024) CHARSET utf8,
  5.     `mark` varchar(4) CHARSET utf8,
  6.     `count` int
  7.     )
  8.     RETURNS varchar(65) CHARSET utf8

  9. BEGIN

  10.     DECLARE v_string varchar(1024) CHARSET utf8 DEFAULT mainstring;
  11.     DECLARE v_element varchar(64) CHARSET utf8;
  12.     DECLARE i int DEFAULT 0;

  13.     IF(count > 0 and count <= FUN_GET_COUNT(mainstring, mark)) THEN
  14.         
  15.         WHILE(i < count) DO
  16.             
  17.             SET v_string = SUBSTRING(v_string, INSTR(v_string, mark) + 1, CHAR_LENGTH(v_string)) 
  18.             SET i = i + 1;
  19.         
  20.         END WHILE;
  21.     
  22.     END IF;
  23.     
  24.     IF(count < 0) THEN

  25.         SET v_element = '上越界';

  26.     ELSEIF (count < FUN_GET_COUNT(mainstring, mark)) THEN

  27.         SET v_element = SUBSTRING(v_string, 1, INSTR(v_string, mark) - 1);

  28.     ELSEIF (count = FUN_GET_COUNT(mainstring, mark)) THEN

  29.         SET v_element = v_string;

  30.     ELSE

  31.          SET v_element = '下越界';

  32.     END IF;

  33. RETURN(v_element);

  34. END;;

  35. delimiter ;

上述UDF调用了 另外 一个函 FUN_GET_COUNT() 这一个 同样也是自定义的。
用于获取传入的字符串数组的最大索引(元素数目-1)

该函数使用例子:
  1. mysql> select FUN_GET_COUNT('a|b|c','|');
  2. +----------------------------+
  3. | FUN_GET_COUNT('a|b|c','|') |
  4. +----------------------------+
  5. | 2                          |
  6. +----------------------------+
  7. 1 row in set (0.00 sec)


FUN_GET_COUNT 定义:
  1. DROP FUNCTION IF EXISTS FUN_GET_COUNT;

  2. delimiter ;;

  3. CREATE FUNCTION `FUN_GET_COUNT`(
  4.     `mainstring` varchar(1024) CHARSET utf8,
  5.     `mark` varchar(200) CHARSET utf8
  6.     ) RETURNS int

  7. BEGIN
  8.     
  9.     DECLARE i int;
  10.     
  11.     SET i = (CHAR_LENGTH(mainstring) - CHAR_LENGTH(REPLACE(mainstring, mark, ''))) / CHAR_LENGTH(mark);
  12.     
  13.     RETURN i;

  14. END;;

  15. delimiter ;

(当然也可以将两个UDF 合并 在一起。)


在存储过程中使用起来也是十分方便:

  1. DROP PROCEDURE IF EXISTS PROC_TEST;

  2. delimiter ;;

  3. CREATE PROCEDURE `PROC_TEST`(
  4.     `text` varchar(64) CHARSET utf8
  5.     )

  6. BEGIN
  7.     
  8.     DECLARE v_text varchar(64) CHARSET utf8 DEFAULT text;
  9.     DECLARE v_element varchar(16) CHARSET utf8;
  10.     DECLARE v_element_count int DEFAULT 0;
  11.     DECLARE i int DEFAULT 0;

  12.     IF LENGTH(text) > 0 THEN

  13.         SET v_element_count = FUN_GET_COUNT(v_text, '|');
  14.         
  15.         WHILE (i <= v_element_count) DO

  16.             SET v_element = FUN_GET_ELEMENT(v_text, '|', i);
  17.             SELECT v_element;
  18.             SET i = i + 1;    

  19.         END WHILE;

  20.     END IF;

  21. END;;

  22. delimiter ;


数组默认为字符串数组,若为数值数组,则可在最后返回值通过系统函 数CONVERT()转换。
  1. mysql> SELECT CONVERT('1', SIGNED);
  2. +----------------------+
  3. | CONVERT('1', SIGNED) |
  4. +----------------------+
  5. | 1                    |
  6. +----------------------+
  7. 1 row in set (0.00 sec)


测试上述procedure:
  1. mysql> CALL PROC_TEST('test1|test2');
  2. +-----------+
  3. | v_element |
  4. +-----------+
  5. | test1     |
  6. +-----------+
  7. 1 row in set (0.00 sec)

  8. +-----------+
  9. | v_element |
  10. +-----------+
  11. | test2     |
  12. +-----------+
  13. 1 row in set (0.00 sec)

  14. Query OK, 0 rows affected (0.00 sec)


作者公众号(持续更新)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29773961/viewspace-1850718/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29773961/viewspace-1850718/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值