存储过程很方便,就像写shell脚本一样,可以帮我们把重复的命令总结成一个脚本,不用自己每次都做重复的操作
sql是不可以拼接表名的,有时候写存储过程想把表名作为参数传进来或者在sql中动态拼接表名,这时候可以在存储过程中用concat函数动态拼接我们的sql,在拼接sql的时候拼接表名。用两个demo看代码理解一下
例1:把表名作为存储过程的参数
CREATE PROCEDURE `addData`(in limitNum int,in tbNm VARCHAR(20))
begin
##利用concat拼接sql,execute中执行拼接的sql
set @sqlStr=concat('select * from ',tbNm,' limit ',limitNum);
PREPARE stmt from @sqlStr;
EXECUTE stmt;
注:
concat拼接的是正确的sql,注意from后面要有空格,拼接的时候要留意空格,有时候没留意会是连在一起的错误sql
例2:有很多分表,表名只有后缀不一样,通过存储过程自动插入批量测试数据
CREATE PROCEDURE `insertTestData`(in num int)
begin
declare i int;
declare j int;
set i=5;
while i<10 do ##循环每个表
select "进入i",i;##调试
##删除之前的表记录
set @delSqlStr=concat("delete from log_2019_0",i);
PREPARE delStmt from @delSqlStr;
EXECUTE delStmt ;
set j =1;
while j<num do
##每个表新增指定的num记录数
set @sqlStr=concat("insert INTO log_2019_0",i,"(`id`,`content`,`createTime`) values(",j,",'测试','2019-0",i,"-01 10:00:00')");
PREPARE stmt from @sqlStr;
EXECUTE stmt ;
set j=j+1;
end while;
set i=i+1;
end while;
注:
select “进入i”,是打印操作,相当于java的print,php的echo,可以用来调试存储过程,但是尽量不要输出过多这样的select,会卡死的,特别是在循环很多数据的循环体里面
一、MySQL 存储过程参数(in)
MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible)。
drop procedure if exists pr_param_in;
create procedure pr_param_in
in id int -- in 类型的 MySQL 存储过程参数
begin
if (id is no
本篇主要示例使用了输入参数的存储过程,并解决使用表名作为输入参数的问题,因为之前遇到过需要使用表名作为参数的存储过程,很难处理。问题描述:假设我们有TEST1-TEST12共12个相同结构的车辆里程表,我们想要对这12个表进行去重,那么逻辑上比较简单的办法是写12个存储过程处理或者写一个存储过程每执行一次改一次表名并重新编译,但是这样都太麻烦了。接下来很容易的就会想到是否可以使用表名作为输入参数,...
mysql> CREATE PROCEDURE set_col_value
-> (in_table VARCHAR(128),
-> in_column VARCHAR(128),
-> in_new_value VARCHAR(1000),
-> in_where VARCHAR(4000))
-> BEGIN
-> DECLARE l_sq
start TRANSACTION;
while i <= args DO
insert into A_student(id,name) VALUES (i, concat(“陈瓜皮-”, i));
set i = i+1;
end while;
COMMIT;
功能说明:
公司有多个表名相似的订单表,表名类似tb_order_history_*,和其附属的成交明细表tb_order_fill_history_*。这个订单表需要将由于历史原因之前产生比较大的id的修改成小的id,这就要将表名作为参数传给存储过程将符合条件的数据查出来每条遍历修改id和成交明细的id。
第一个问题是mysql不支持参数作为表名,只能使用prepa...
BEGINdeclare date_str varchar(8);declare table_prefix varchar(20);set table_prefix='mail_rare_visit_';set date_str = DATE_FORMAT(CURRENT_DATE(),'%Y%m%d');set @table_name = concat(table_prefix, date_st...
我正在尝试进行设置,以便将表名作为参数传递给命令文本,但是我无法使其正常工作。我四处张望,发现了这样的问题:使用C#进行MySQL的参数化查询,但是我没有任何运气。这是相关的代码(connection == MySqlConnection包含连接字符串):public static DataSet getData(string table){DataSet returnValue = new Da...
delimiter //
create procedure oneKey(in newName varchar(250),in oldName varchar(250),in idNum INT)
BEGIN
SET @sqlStmt = CONCAT('insert into ',newName,' (`name`,`age`,`sex`,`major`,`pass`,`photo`...
1.用变量做表名:
<br /><br />
简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名。在其他的sql数据库中也是如此,mssql的解决方法是将整条sql语句作为变量,其中穿插变量作为表名,然后用sp_executesql调用该语句。
<br /><br />这在mysql5.0之前是不行的,5.0之后引入了一个全新的语句,可以达到类似sp_executesql的功
CREATE DEFINER=`root`@`localhost` PROCEDURE `P_HoverTreePages`(
IN `TableName` VARCHAR(200),
IN `FieldList` VARCHAR(2000)
IN `PrimaryKey` VARCHAR(100),
IN `Where` VA...
例如我们有多个表,而多个表的区别在于表名格式为Table+X 例如Table_1,Table_2,Table_3 我们需要通过一条语句来动态查询三个表内的数据,哪么需要将整条语句拼接,然后使用Exec(语句) 如果需要得到返回值 需要用到 sp_executesql.例如我们要查询Table_x表内UserID为100的用户的 性别(Gender字段)参数 X为不定值 需要动态进行查询 代码如下
I've written a stored procedure. It's working fine except taking the table name as input parameter.Let see my proc in MySQL:DELIMITER $$USE `db_test`$$DROP PROCEDURE IF EXISTS test_proc$$CREATE DEFINE...
-- 创建动态表,获取当前日期
SET @sql_create_table = CONCAT(
'CREATE TABLE IF NOT EXISTS sx_test_a', DATE_FORMAT(CURDATE(),'%Y_%c')