mysql 存储过程(动态sql语句、动态游标、根据查询结果更新语句)的实现

动态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值。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值