(2.11)Mysql之SQL基础——存储过程与变量
(2.11)Mysql之SQL基础——存储过程
关键字:mysql存储过程
注意!!!: 局部变量会覆盖相同列名,如下图,可以使用 v_id 作为变量id的命名,这样就会改成 id = v_id。
或者列名使用 表名.列名,如下图,可以把where后面的列名id改成 test1.id=id.
【0】查看存储过程
【1】SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_NAME = 'proc_or_func'
【2】SHOW CREATE PROCEDURE proc_countByName;
【3】SHOW PROCEDURE STATUS LIKE 'proc_%';
【1】存储过程的基本语法(不带参数)
--(1)通用定义
create DEFINER = user@ip procedure 过程名(参数)
begin
过程体
end --(2)创建简单的存储过程例子
#因为mysql中分号是结束符,为了避免在过程体重把分号前面的所有语句当成一个sql去执行,所以要使用 delimiter 来替换结束符;
delimiter // #声明//为结束符
create DEFINER = 'root'@'%' procedure sp_test()
begin
select 1 from dual;
end //
delimiter ; #把结束符声明回来为分号';'
--(3)调用存储过程
call sp_test(); --如果存储过程定义了2个参数.. 如: create procedure sp_test(in i_num1 int,in i_num2 int);
那么调用的时候一定也要给与相等数量的参数值,可以为null,''等,但一定要给
call sp_test(0,0) --(4)查询存储过程
[1]状态:show procedure status like '%sp_test%';
[2]语句:show create procedure sp_test; --(5)删除存储过程
drop procedure sp_test; --(6)修改存储过程
mysql8.0以下暂时没有提供直接修改存储过程代码的功能;只能删除重建。 --(7)在存储过程中退出(如mssql中的return)
leave back;
【2】带参数的存储过程
--(1)参数类型
【1】in:入参 【2】out:出参 【3】inout:即是输入又是输出 --举例应用
delimiter //
create procedure sp_test(in num int,out num1 int,inout num2 int)
begin
if num is null then
select 10 into num; #存储过程中对变量的赋值操作
end if;
select 10+num into num1;
select num1+num2+100 into num2;
end //
delimiter ; --(2)调用
select 100 into @num2; -- 定义使用局部变量
call sp_test(null,@num1,@num2);
select @num1,@num2;
得出最后结果:
【3】存储过程的流程控制语句
-- (1) 关键词
【1】 IF THEN ELSE END FI; 【2】case when then else end;
【3】 repeat sql_statement until [end_condition] end repeat; -- 类似于do while,无论如何都会执行一次循环体;只是,这个需要end_condition为真才结束
【4】 while [start_condition] do sql_statement end while -- (2)演示
【1】repeat
#插入n~999的值,如果n>=1000则会执行一次循环体内的语句(即插入值n,'a'到表bm)
delimiter //
create procedure sp_test1(in n int)
begin
repeat
insert into bm values(n,'a'); set n=n+1;
until n>=1000 end repeat;
end //
delimiter ; 【2】while
#用while改写【1】
delimiter //
create procedure sp_test1(in n int)
begin
while(n<1000) do
insert into bm values(n,'a'); set n=n+1;
end while;
end //
delimiter ;
【4】变量
-- (1)基本定义
#在存储过程中,带默认值的变量
declare n int default 10;
DECLARE var1,var2,var3 INT;
-- (2)变量赋值
#在存储过程中或mysql登录状态下
select 1 into n;
set n=1; -- (3)局部变量:以@开头的为会话级别生效的局部变量(只会跟当前客户端绑定)
#在存储过程中或mysql登录状态下
set @n=1; --以@开头的为会话级别生效的局部变量(只会跟当前客户端绑定) -- (4)全局变量:定义时以如下两种形式出现
【1】set global 变量名 【2】set @@global.name --对所有客户端生效(需要super权限才可以设置全局变量)
演示:
mysql> set global sort_buffer_size = value;
mysql> set @@global.sort_buffer_size = value; --(5)会话变量:定义时如下2种形式
【1】set session 变量名 【2】set @@session.name
mysql> set session sort_buffer_size = value;
mysql> set @@session.sort_buffer_size = value;
--
【5】存储过程--动态SQL
这里介绍两种在存储过程中的动态sql:
【5.1】动态SQL的基本形式
set sql = (预处理的sql语句,可以是用concat拼接的语句)
set @sql = sql
PREPARE stmt_name FROM @sql;
EXECUTE stmt_name;
{DEALLOCATE | DROP} PREPARE stmt_name;
实例演示:
use db_name;
drop procedure if exist NewProc;
delimiter ||
CREATE DEFINER = `root`@`%` PROCEDURE `NewProc`(IN `USER_ID` varchar(36),IN `USER_NAME` varchar(36))
BEGIN declare SQL_FOR_SELECT varchar(500); -- 定义预处理sql语句
set SQL_FOR_SELECT = CONCAT("select * from user where user_id = '",USER_ID,"' and user_name = '",USER_NAME,"'"); -- 拼接查询sql语句
set @sql = SQL_FOR_SELECT;
PREPARE stmt FROM @sql; -- 预处理动态sql语句
EXECUTE stmt ; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare END ||
delimiter ;
【5.2】sql变量存了值,变量再变化,就不会改变SQL变量
上述是一个简单的查询用户表的存储过程,当我们调用此存储过程,可以根据传入不同的参数获得不同的值
但是:上述存储过程中,我们必须在拼接sql语句之前把USER_ID,USER_NAME定义好,而且在拼接sql语句之后,我们无法改变USER_ID,USER_NAME的值,如下
use db_name;
drop procedure if exist NewProc;
delimiter ||
CREATE DEFINER = `root`@`%` PROCEDURE `NewProc`(IN `USER_ID` varchar(36),IN `USER_NAME` varchar(36))
BEGIN declare SQL_FOR_SELECT varchar(500); -- 定义预处理sql语句 set SQL_FOR_SELECT = CONCAT("select * from user where user_id = '",USER_ID,"' and user_name = '",USER_NAME,"'"); -- 拼接查询sql语句
set @sql = SQL_FOR_SELECT;
PREPARE stmt FROM @sql; -- 预处理动态sql语句
EXECUTE stmt ; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare set USER_ID = '';
set USER_NAME = 'lisi';
set @sql = SQL_FOR_SELECT;
PREPARE stmt FROM @sql; -- 预处理动态sql语句
EXECUTE stmt ; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare
END ||
delimiter ;
【5.3】定义带参数的动态SQL
我们用call aa('1','zhangsan');来调用该存储过程,第一次动态执行,我们得到了‘张三’的信息。
然后我们在第14,15行将USER_ID,USER_NAME改为lisi我们希望得到李四的相关信息。
可查出来的结果依旧是张三的信息,说明我们在拼接sql语句后,不能再改变参数了。为了解决这种问题,下面介绍第二中方式
set sql = (预处理的sql语句,可以是用concat拼接的语句,参数用 ?代替)
set @sql = sql
PREPARE stmt_name FROM @sql;
set @var_name = xxx;
EXECUTE stmt_name USING [USING @var_name
[, @var_name
] ...];
{DEALLOCATE | DROP} PREPARE stmt_name;
修改案例代码为:
use db_name;
drop procedure if exist NewProc;
delimiter ||
CREATE DEFINER = `root`@`%` PROCEDURE `NewProc`(IN `USER_ID` varchar(36),IN `USER_NAME` varchar(36))
BEGIN declare SQL_FOR_SELECT varchar(500);-- 定义预处理sql语句 set SQL_FOR_SELECT = "select * from user where user_id = ? and user_name = ? "; -- 拼接查询sql语句 set @sql = SQL_FOR_SELECT;
PREPARE stmt FROM @sql; -- 预处理动态sql语句 set @parm1 = USER_ID; -- 传递sql动态参数
set @parm2 = USER_NAME; EXECUTE stmt USING @parm1 , @parm2; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare set @sql = SQL_FOR_SELECT;
PREPARE stmt FROM @sql; -- 预处理动态sql语句 set @parm1 = ''; -- 传递sql动态参数
set @parm2 = 'lisi'; EXECUTE stmt USING @parm1 , @parm2; -- 执行sql语句
deallocate prepare stmt; -- 释放prepare
END ||
delimiter ;
(2.11)Mysql之SQL基础——存储过程与变量的更多相关文章
- (2.12)Mysql之SQL基础——存储过程条件定义与错误处理
转自:博客园桦仔 5.存储过程条件定义与错误处理 -- (1)定义 [1]条件定义:declare condition_name condition for condition_value;[2]错误 ...
- (2.16)Mysql之SQL基础——函数
(2.16)Mysql之SQL基础——函数 关键词:mysql函数,mysql自定义函数,mysql聚合函数,mysql字符串函数,mysql数值函数 1.自定义函数 -- (1)一般形式 creat ...
- (2.15)Mysql之SQL基础——开发设计最佳规范
(2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...
- (2.13)Mysql之SQL基础——触发器
(2.13)Mysql之SQL基础——触发器 关键词:Mysql触发器 1.一般形式 -- 0.查看触发器[1]SHOW TRIGGERS;[2]SELECT * FROM `information_ ...
- (2.10)Mysql之SQL基础——约束及主键重复处理
(2.10)Mysql之SQL基础——约束及主键重复处理 关键词:mysql约束,批量插入数据主键冲突 [1]查看索引: show index from table_name; [2]查看有约束的列: ...
- (2.7)Mysql之SQL基础——表的操作与查看
(2.7)Mysql之SQL基础——表的操作与查看 搜索关键字:mysql表操作,comment注释操作,mysql临时表 0.临时表 create temporary table 1.创建表(在in ...
- (2.5)Mysql之SQL基础——数据类型
(2.5)Mysql之SQL基础——数据类型 关键词:mysql数据类型 目录: 一.整数型 二.小数型(以下均不能使用无符号) 三.日期时间型 四.字符串型 一.整数型 额外参数示例: int [( ...
- (2.14)Mysql之SQL基础——游标
(2.14)Mysql之SQL基础——游标 关键词:Mysql游标 -- (1)定义游标 declare cur_name cursor for select * from table_name wh ...
- (2.9)Mysql之SQL基础——索引的查看与删除
(2.9)Mysql之SQL基础——索引的查看与删除 关键词:mysql索引查看,mysql索引删除 1.索引查询(以下包括主键,唯一,普通,复合,全文,但不包括外键) (1)按库查询 select ...
随机推荐
- 数据结构 http://www.cnblogs.com/sun-haiyu/p/7704654.html
数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树.算法的性能取决于树的形状,而树的形状取决于插入键的顺序.在最好的情况下,n个结点的树是完全平衡的,如下图“最好情况”所示,此时树 ...
- opencv-从图像旋转学习Mat数据訪问
先看一个简单的样例 代码: // ConsoleApplication3_6_23.cpp : Defines the entry point for the console application. ...
- Java 基本语法----数组
数组 数组概述 数组是多个相同类型数据的组合,实现对这些数据的统一管理. 数组属引用类型,数组型数据是对象(Object),数组中的每个元素相当于该对象的成员变量. 数组中的元素可以是任何数据类型,包 ...
- POJ 1160 Post Office(区间DP)
Description There is a straight highway with villages alongside the highway. The highway is represen ...
- MySQL性能优化(一)-- 存储引擎和三范式
一.MySQL存储引擎 存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存 ...
- linux系统usb挂载
本次例程的环境是在FC6下,通过终端操作的. 注意要挂载U盘需要有管理员的权限. 切换成管理员,输入: su root 然后输入管理员密码,进行密码认证: 成功后,先在 /mnt 下建立一个名叫USB ...
- js 判断数据类型的几种方法
判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...
- HTTP/2笔记之消息交换
前言 无论是HTTP/1.*还是HTTP/2,HTTP的基本语义是不变的,比如方法语义(GET/PUST/PUT/DELETE),状态码(200/404/500等),Range Request,Cac ...
- 图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)
主要参考资料:数据结构(C语言版)严蔚敏 ,http://blog.chinaunix.net/uid-25324849-id-2182922.html 代码测试通过. package 图的建 ...
- libvirt kvm 虚拟机上网 – Bridge桥接
版权声明:本文由陈煜东原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/90 来源:腾云阁 https://www.qclou ...