通用合并表存储过程 循环变量与字符连接

本文介绍MySQL存储过程中declare与@var的区别,通过示例展示如何使用declare定义局部变量及循环结构实现字符连接,并演示了利用用户变量进行动态SQL构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

存储过程循环变量与字符连接

Java代码   收藏代码
  1. mysql> DELIMITER $$  
  2. mysql> drop PROCEDURE sp_test_switch$$  
  3. Query OK, 0 rows affected (0.01 sec)  
  4.   
  5. mysql> CREATE PROCEDURE sp_test_switch()  
  6.     -> BEGIN  
  7.     ->  declare a int;  
  8.     ->  declare b varchar(5000);  
  9.     ->  set a=1;  
  10.     ->  set b='';  
  11.     ->  while a<10 do  
  12.     ->          set b = concat(b,',',a);  
  13.     ->          set a=a+1;  
  14.     ->  end while;  
  15.     ->  select b;  
  16.     -> END  
  17.     -> $$  
  18. Query OK, 0 rows affected (0.00 sec)  
  19.   
  20. mysql> DELIMITER ;  
  21. mysql>  
  22. mysql> call sp_test_switch();  
  23. +--------------------+  
  24. | b                  |  
  25. +--------------------+  
  26. | ,1,2,3,4,5,6,7,8,9 |  
  27. +--------------------+  
  28. 1 row in set (0.00 sec)  
  29. Query OK, 0 rows affected (0.00 sec)  
  30. mysql>  

MySQL存储过程的变量定义:declare和直接set @var什么区别?

我的理解是, declare定义的是局部变量, 只能用在存储过程或函数中, 其有效区间就是存储过程或函数中声明该变量的begin end区间.而@var属于用户变量(自己声明的), 其有效区间就是该session, 你既可以在存储过程或函数中使用, 也可以在自己写的SQL语句中使用.还有@不需要声明类型,declare必须指定类型

Java代码   收藏代码
  1. CREATE PROCEDURE sp_starnight_cbj()   
  2. BEGIN  
  3. DECLARE A INT DEFAULT 1;  
  4. DECLARE B VARCHAR(5000) DEFAULT '';  
  5. WHILE A<10 DO  
  6.     SET B = CONCAT(B,',',A);  
  7.     SET A=A+1;  
  8. END WHILE;  
  9. SELECT B;  
  10. END;   

 应用:所有分表  

Java代码   收藏代码
  1. DROP PROCEDURE IF EXISTS `merage_branch_table`;  
  2. CREATE PROCEDURE `merage_branch_table`(  
  3.     IN     p_table_name   VARCHAR(200),      
  4.     IN     p_branch_size  INT,  
  5.     in     p_lpad         INT  
  6. )  
  7. BEGIN  
  8.     DECLARE m_begin_row INT DEFAULT 0;  
  9.     SET @m_merage_sql = '';  
  10.     WHILE m_begin_row<p_branch_size DO  
  11.         IF(m_begin_row=p_branch_size-1)  
  12.             THEN SET @m_merage_sql = CONCAT(@m_merage_sql'SELECT * FROM ', p_table_name, '_', LPAD(m_begin_row, p_lpad, 0));  
  13.             ELSE SET @m_merage_sql = CONCAT(@m_merage_sql'SELECT * FROM ', p_table_name, '_', LPAD(m_begin_row, p_lpad, 0),' UNION ALL ');  
  14.         END IF;  
  15.   
  16.         SET m_begin_row = m_begin_row+1;  
  17.     END WHILE;  
  18.   
  19.     PREPARE main_stmt FROM @m_merage_sql;    
  20.     EXECUTE main_stmt;               
  21. END;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值