占位符的使用:

drop PROCEDURE if EXISTS test12;
-- 使用drop 来删除存储过程或者表

create PROCEDURE test12()
-- 创建存储过程 命名为test12 

BEGIN

  set @tableNames = CONCAT('background');
  -- '@' 先在用户变量中保存值然后在以后引用它

  set @beanId = 6;

  set @sqlStr = CONCAT('select * from ' ,@tableNames ,
   ' where background_id = ?' );
   -- 拼接查询总记录的SQL语句 

  prepare stmt from @sqlStr;
   -- 预定义一个语句,并将它赋给 stmt

  execute stmt using @beanId;
   -- 执行语句

  deallocate prepare stmt;
  -- 要释放一个预定义语句的资源
END;

call test12(); -- 存储过程的执行测试 

注意点:

1、MySQL 存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也需要“()”。
2、sql注入的只是,字符串得拼接进去,不然报错,这是找到的一个解决方式。

一次执行多行sql

一种方式:普通的sql语句 使用 union 及 union all来拼接执行。
但是!!!

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALLUNIONUNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。

1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。

2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。

3、从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL

一种方式:

delimiter 
select bg_title from background where background_id = 6;
select bg_title from background where background_id =7;

这种方式就相当于oracle 的 \ ,一起执行语句,没有列数量、类型相同的要求,结果分别显示~~

这里写图片描述
这里写图片描述

另一种方式:(存储过程的调用 )

create PROCEDURE tests2222(tableName varchar(20)) -- 字符串要拼接
BEGIN
  set @tableNames = CONCAT(tableName);
    set @sqlStr = CONCAT('select * from ', @tableNames);
    prepare stmt from @sqlStr;
    execute stmt ;
    deallocate prepare stmt;

    set @sqlStr1 = CONCAT('select * from tuser');
    prepare stmt2 from @sqlStr1;
    EXECUTE stmt2;
END;

call tests2222('background');

这种方式也相当于oracle 的 \ ,一起执行语句,没有列数量、类型相同的要求,结果分别显示~~

如果不懂存储过程的,可以看我的其他两篇mysql的文章,上面有详细的注释说明。

每日一句:
No man or woman is worth your tears, and the one who is,
won’t make you cry.

没有人值得你流泪,值得让你这么做的人不会让你哭泣。

以上是博主开发中遇到的一些个人总结,希望能帮助到大家,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

Logo

更多推荐