mysql 开发基础系列17 存储过程和函数(上)
一. 概述
存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,可以简化应用开发人员的很多工作,减少数据在数据库与应用服务器之间的传输,提高数据处理效率是有好处的。存储过程和函数的区别在于函数必须有返回值,存储过程的参数可以使用in,out ,inout类型,而函数参数只能是in类型。 创建需要create routine 权限, 修改删除需要alter routine权限,执行需要execute权限。
1.1 创建存储过程,调用,删除
-- 创建
DELIMITER $$
CREATE PROCEDURE proc_city(IN city_id INT ,OUT num INT)
READS SQL DATA
BEGIN
-- 要设置初始值,不然为null 与sqlserver一样
SET num=0;
SELECT * FROM city WHERE city.city_id=city_id;
SET num=num+1;
END $$
DELIMITER ; -- 调用
CALL proc_city (2,@num); SELECT @num;


-- 删除
DROP PROCEDURE proc_city
特征值介绍:
CREATE PROCEDURE proc_name()
{ contains sql | no sql | READS SQL DATA | modifies sql data}
这个特征值只是提供给服务器,并没有根据这些特征值来约束过程实际使用数据的情况。 contains sql 表示子程序不包含读或写数据的语句。no sql表示子程序不包含sql 语句。 READS SQL DATA:表示子程序包含数据的语句,但不包含写数据。modifies sql data 表示子程序包含写数据。默认是contains sql。
1.2 创建函数,调用,删除
-- 创建
SET GLOBAL log_bin_trust_function_creators=TRUE;
DELIMITER $$
CREATE FUNCTION fn_city (city_count INT)
RETURNS INT
BEGIN
DECLARE city_count1 INT;
-- 要设置初始值,
SET city_count1=0;
SET city_count1=city_count+1;
RETURN city_count1;
END $$
DELIMITER ; -- 调用
SELECT fn_city (2);

-- 删除
DROP FUNCTION fn_city
1.3 查看信息
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME='proc_city' OR ROUTINE_NAME='fn_city'

1.4 变量的使用
DELIMITER $$
CREATE PROCEDURE proc_demo_declare()
READS SQL DATA
BEGIN
-- 定义
DECLARE i INT ;
-- 赋值
SET i=10;
SELECT i;
-- 第二种赋值
SELECT COUNT(1) INTO i FROM city;
SELECT i;
END $$
DELIMITER ; call proc_demo_declare;

1.5 定义Handler遇到问题的处理步骤
-- 语法
DECLARE
{EXIT | CONTINUE}
HANDLER FOR
{error-number | SQLSTATE error-STRING | CONDITION}
SQL statement
(1) 处理类型{EXIT | CONTINUE} continue: 当遇到执行错误时,跳过继续下面的语句。exit: 当遇到执行错误时,停止语句
(2) 触发条件 (SQLSTATE,MYSQL ERROR,CONDITION)MYSQL错误代码。ANSI-standard SQLSTATE code。命名条件。可使用系统内置的SQLEXCEPTION,SQLWARNING和NOT FOUND。
(3)错误触发的操作。
-- 以continue为例
DELIMITER $$
CREATE PROCEDURE proc_demo_handler_continue()
BEGIN
-- 定义条件 continue : 当遇到执行错误时,跳过继续下面的语句
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET @x2 = 1; -- 这条可以插入
INSERT INTO city(country_id,cityname,Citycode) VALUES(2,'中国','cn4');
SET @x=1; -- 这条不能插入,外键约束fk_city_country
INSERT INTO city(country_id,cityname,Citycode) VALUES(8,'中国','cn5');
SET @x=2; -- 这条可以插入
INSERT INTO city(country_id,cityname,Citycode) VALUES(2,'中国','cn6');
SET @x=3;
END $$
DELIMITER ;
-- 调用
CALL proc_demo_handler_continue; SELECT @x,@x2;
使用了continue: 当遇到执行错误时,跳过继续下面的语句,三条语句,只插入成功二条成功

-- 以exit为例
DELIMITER $$
CREATE PROCEDURE proc_demo_handler_exit()
BEGIN
-- 定义条件 : 当遇到执行错误时,停止语句
DECLARE EXIT HANDLER FOR SQLSTATE '' SET @x2 = 1; -- 这条可以插入
INSERT INTO city(country_id,cityname,Citycode) VALUES(2,'中国','cn4');
SET @x=1; -- 这条不能插入,外键约束fk_city_country
INSERT INTO city(country_id,cityname,Citycode) VALUES(8,'中国','cn5');
SET @x=2;
-- 这条不可以插入
INSERT INTO city(country_id,cityname,Citycode) VALUES(2,'中国','cn6');
SET @x=3;
END $$
DELIMITER ;
-- 调用
CALL proc_demo_handler_exit;SELECT @x,@x2;
使用了exit: 当遇到执行错误时,停止语句, 三条语句,只插入成功第一条

mysql 开发基础系列17 存储过程和函数(上)的更多相关文章
- mysql 开发基础系列18 存储过程和函数(下)
1. 光标的使用(游标) 在存储过程和函数中可以使用光标对结果集进行循环的处理,光标使用包括光标的声明,open ,fetch,close. 下面在存储过程中使用一个光标, 这个举例中光标里的逻辑不重 ...
- mysql 开发基础系列12 选择合适的数据类型(上)
一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...
- mysql 开发基础系列5 字符串函数
字符串函数 1. concat (s1,s2,...sn) 连接里面的参数成一个字符串(注意上面写错了函数名称) SELECT CONCAT('ddd','CCC'); 2. insert(str ...
- mysql 开发基础系列7 流程函数与其它函数
一.流程函数 -- 创建表来介绍 ,)); ,),(,), (,),(,),(,), (,NULL); SELECT * FROM salary 1. if(value,t,f) 超过2000的用h ...
- mysql 开发基础系列6 数值与日期函数
一. 数值函数 1. abs(x) 返回x的绝对值 SELECT ABS(-0.8),ABS(0.8); 2.ceil(x) 返回大于x的最大整数 SELECT CEIL(-0.8),CEIL(0. ...
- mysql 开发基础系列1 表查询操作
在安装完数据库后,不管是windows 还是linux平台, mysql的sql命令都大同小异,相关命令都是相同的,每个命令结束后 都以 ; 结尾, 注意在windows平台中表名是不区分大小写 ...
- mysql 开发基础系列22 SQL Model
一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql model 定义了mysql应用支持的sql语法,数据校验等,这样更容易在不同的环境中使用mysql. sql ...
- mysql 开发基础系列21 事务控制和锁定语句(下)
1. 隐含的执行unlock tables 如果在锁表期间,用start transaction命令来开始一个新事务,会造成一个隐含的unlock tables 被执行,如下所示: 会话1 会话2 ...
- mysql 开发基础系列20 事务控制和锁定语句(上)
一.概述 在mysql 里不同存储引擎有不同的锁,默认情况下,表锁和行锁都是自动获得的,不需要额外的命令, 有的情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性.这样就需要使 ...
随机推荐
- 使用rancher2建k8s集群--个人学习记录
视频地址这里: http://live.vhall.com/431874021 原生文档这里:https://www.cnrancher.com/docs/rancher/v2.x/cn/overvi ...
- JPA的初级CRUD-01
一.JPA 1.1 什么是JPA JPA:(Java Persistence API) ORM的规范 JPA是规范,Hibernate是它的实现(不唯一,但最好) 最底层的操作还是JDBC(引入驱动包 ...
- vi/vim 三种模式的操作
来源:http://www.runoob.com/linux/linux-vim.html ps:刚刚进入vi/vim 是命令模式 一.命令模式 i 切换到输入模式,以输入字符. x 删除当前光标所在 ...
- MySQL/Oracle索引的创建与使用
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引和组合索引. 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引 ...
- 1013. Battle Over Cities 用dfs计算联通分量
使用一个标记数组,标记 节点是否已访问 int 连通度=0 dfs(node i) {标记当前节点为以访问 for(每一个节点) {if(当前几点未访问 并且 从i到当前节点有直接路径) dfs(当前 ...
- LCD调试1.0
所谓调lcd timing就是去调lcd时序,一般是6个部分:HFPD(在一行扫描以前需要多少个像素时钟),HBPD(一行扫描结束到下一行扫描开始需要多少个像素时钟),VFPD(一帧开始之前需要多少个 ...
- PowerShell工作流学习-7-编写脚本工作流帮助
关键点: a)工作流中不支持基于注释的帮助(标识工作流的帮助文件的 .ExternalHelp 注释除外). b)支持get-help参数的方式:使用 .ExternalHelp 注释以便 Get-H ...
- autium designer smart pdf一个小问题
今天在使用ad的smart pdf时遇到一个小问题 就是 使用的是AD17,生成PDF,PDF没有把芯片的引脚标号显示出来(还有其它的芯片也是一样的,但是奇怪的是:只有在原理图元器件右边的没有显示 ...
- Android学习笔记(2):build.grandle的常用设置
1 > java开发中有两个大名鼎鼎的项目构建ANT.Maven. 2 > Google推荐使用的Android Studio是采用Gradle来构建项目的.Gradle是一个非常先进的项 ...
- Spring+Redis集成+关系型数据库持久化
本篇文章主要介绍了"Spring+Redis集成+关系型数据库持久化",主要涉及到Spring+Redis集成+关系型数据库持久化方面的内容,对于Spring+Redis集成+关系 ...