这里写自定义目录标题
动态sql语句
CREATE DEFINER=`root`@`%` PROCEDURE `NewTest`(
IN `IN_ID` varchar(200)
)
BEGIN
declare r_sql varchar(2000);
#############根据输入的ID,将该条记录的name改为陈#############
set r_sql='update test111 set name=''陈'' where id=''';
set r_sql=concat(r_sql,IN_ID,'''');##字符串拼接
set @sql=r_sql;#将拼接好的动态sql赋值给@sql
PREPARE stmt FROM @sql;##进行sql预处理
EXECUTE stmt;#执行sql语句
DEALLOCATE PREPARE stmt; ##释放
END
1.拼接好的sql语句必须赋值给@变量,而不能采用存储过程中自己定义的变量。
2.字符串拼接中出现’’’‘这四个点,最外面的两个点‘’代表是拼接字符类型。中间的两个‘’中的第一个是转义符号,第二个是真正的‘。’’’’ 类比于‘A’,解释拼接了一个’,只是A不需要转义,而’需要转义。
更加复杂一点的,https://www.cnblogs.com/fenxiangheiye/archive/2013/02/18/Mysql.html
需要拿到into的
https://www.cnblogs.com/superfeeling/p/13068641.html
动态游标
在orcal中有动态游标的存在,但是mysql中好像并不存在动态游标,查找了网上的诸多资料,基本上采用的是动态sql+视图+游标进行构建。
CREATE DEFINER=`root`@`%` PROCEDURE `NewTest`(
IN `IN_ID` varchar(200)
)
BEGIN
declare r_sql varchar(2000);
declare r_name varchar(40);
declare cur_a cursor for select name from v_test;##游标的定义
set r_sql='select name from test111 where id=''';
set r_sql=concat(r_sql,IN_ID,'''');##字符串拼接
#动态游标
set @sql =concat(' create view v_test as ', r_sql);
DROP VIEW IF EXISTS v_test ; ##如果该视图存在,则删除并重新建立
PREPARE stmt1 FROM @sql; ##sql预处理
EXECUTE stmt1;#执行
DEALLOCATE PREPARE stmt1; ##释放
open cur_a;##打开游标
loop ##开启循环
fetch cur_a into r_name; #获取值
##之后可以用这个值进行各种操作
end loop;
END
1.视图的名字是自己定义的,但是无法采用变量来定义,因为DROP VIEW IF EXISTS 中后面必须跟一个定值。
2.如果fetch要获取多个数据的时候,必须按照游标定义的时候获取的顺序进行。
3.这个示例的循环是一个死循环,因为没有写离开循环的语句。
更新语句的值来自查询结果
update test111 a
inner join (select id,name from test ) c on a.id=c.id
set a.name=c.name
采用 update inner join 的语句来进行,该例子实现了根据test表中的name来更新test111表中的相同的ID的那条记录的name值。