一. 概述 

 存储过程和函数是事先经过编译并存储在数据库中的一段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 存储过程和函数(上)的更多相关文章

  1. mysql 开发基础系列18 存储过程和函数(下)

    1. 光标的使用(游标) 在存储过程和函数中可以使用光标对结果集进行循环的处理,光标使用包括光标的声明,open ,fetch,close. 下面在存储过程中使用一个光标, 这个举例中光标里的逻辑不重 ...

  2. mysql 开发基础系列12 选择合适的数据类型(上)

    一. char 与varchar比较 在上图的最后一行的值只适用在"非严格模式",关于严格模式后面讲到.在“开发基础系列4“ 中讲到CHAR 列删除了尾部的空格.由于char是固定 ...

  3. mysql 开发基础系列5 字符串函数

    字符串函数 1.  concat (s1,s2,...sn) 连接里面的参数成一个字符串(注意上面写错了函数名称) SELECT CONCAT('ddd','CCC'); 2.  insert(str ...

  4. mysql 开发基础系列7 流程函数与其它函数

    一.流程函数 -- 创建表来介绍 ,)); ,),(,), (,),(,),(,), (,NULL); SELECT * FROM salary 1. if(value,t,f)  超过2000的用h ...

  5. mysql 开发基础系列6 数值与日期函数

    一. 数值函数 1.  abs(x) 返回x的绝对值 SELECT ABS(-0.8),ABS(0.8); 2.ceil(x) 返回大于x的最大整数 SELECT CEIL(-0.8),CEIL(0. ...

  6. mysql 开发基础系列1 表查询操作

    在安装完数据库后,不管是windows 还是linux平台,  mysql的sql命令都大同小异,相关命令都是相同的,每个命令结束后 都以  ;  结尾, 注意在windows平台中表名是不区分大小写 ...

  7. mysql 开发基础系列22 SQL Model

    一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql model 定义了mysql应用支持的sql语法,数据校验等,这样更容易在不同的环境中使用mysql. sql ...

  8. mysql 开发基础系列21 事务控制和锁定语句(下)

    1.  隐含的执行unlock tables 如果在锁表期间,用start transaction命令来开始一个新事务,会造成一个隐含的unlock tables 被执行,如下所示: 会话1 会话2 ...

  9. mysql 开发基础系列20 事务控制和锁定语句(上)

    一.概述 在mysql 里不同存储引擎有不同的锁,默认情况下,表锁和行锁都是自动获得的,不需要额外的命令, 有的情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性.这样就需要使 ...

随机推荐

  1. 使用rancher2建k8s集群--个人学习记录

    视频地址这里: http://live.vhall.com/431874021 原生文档这里:https://www.cnrancher.com/docs/rancher/v2.x/cn/overvi ...

  2. JPA的初级CRUD-01

    一.JPA 1.1 什么是JPA JPA:(Java Persistence API) ORM的规范 JPA是规范,Hibernate是它的实现(不唯一,但最好) 最底层的操作还是JDBC(引入驱动包 ...

  3. vi/vim 三种模式的操作

    来源:http://www.runoob.com/linux/linux-vim.html ps:刚刚进入vi/vim 是命令模式 一.命令模式 i 切换到输入模式,以输入字符. x 删除当前光标所在 ...

  4. MySQL/Oracle索引的创建与使用

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引和组合索引. 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引 ...

  5. 1013. Battle Over Cities 用dfs计算联通分量

    使用一个标记数组,标记 节点是否已访问 int 连通度=0 dfs(node i) {标记当前节点为以访问 for(每一个节点) {if(当前几点未访问 并且 从i到当前节点有直接路径) dfs(当前 ...

  6. LCD调试1.0

    所谓调lcd timing就是去调lcd时序,一般是6个部分:HFPD(在一行扫描以前需要多少个像素时钟),HBPD(一行扫描结束到下一行扫描开始需要多少个像素时钟),VFPD(一帧开始之前需要多少个 ...

  7. PowerShell工作流学习-7-编写脚本工作流帮助

    关键点: a)工作流中不支持基于注释的帮助(标识工作流的帮助文件的 .ExternalHelp 注释除外). b)支持get-help参数的方式:使用 .ExternalHelp 注释以便 Get-H ...

  8. autium designer smart pdf一个小问题

    今天在使用ad的smart  pdf时遇到一个小问题  就是 使用的是AD17,生成PDF,PDF没有把芯片的引脚标号显示出来(还有其它的芯片也是一样的,但是奇怪的是:只有在原理图元器件右边的没有显示 ...

  9. Android学习笔记(2):build.grandle的常用设置

    1 > java开发中有两个大名鼎鼎的项目构建ANT.Maven. 2 > Google推荐使用的Android Studio是采用Gradle来构建项目的.Gradle是一个非常先进的项 ...

  10. Spring+Redis集成+关系型数据库持久化

    本篇文章主要介绍了"Spring+Redis集成+关系型数据库持久化",主要涉及到Spring+Redis集成+关系型数据库持久化方面的内容,对于Spring+Redis集成+关系 ...