一. 概述 

 存储过程和函数是事先经过编译并存储在数据库中的一段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. Yarn的Linking dependencies特别慢的优化方法

    通过以下方法,可以提升部分速度: 把项目文件夹添加进杀毒软件的白名单 把Yarn的缓存文件夹(yarn cache dir查看路径)添加进杀毒软件白名单 把Yarn的安装目录添加进杀毒软件白名单 把N ...

  2. sklearn svm基本使用

    SVM基本使用 SVM在解决分类问题具有良好的效果,出名的软件包有libsvm(支持多种核函数),liblinear.此外python机器学习库scikit-learn也有svm相关算法,sklear ...

  3. go基本使用方法

    一,变量 var:声明变: var 变量名  数据类型 :同时还需要指定数据的类型 var 变量名 = 值  : 声明变量,根据变量值判断变量类型 :=   :省略var,直接可以(变量名:= 值), ...

  4. Codeforces Round #532 (Div. 2) F 线性基(新坑) + 贪心 + 离线处理

    https://codeforces.com/contest/1100/problem/F 题意 一个有n个数组c[],q次询问,每次询问一个区间的子集最大异或和 题解 单问区间子集最大异或和,线性基 ...

  5. Codeforces Round #548 (Div. 2) E 二分图匹配(新坑) or 网络流 + 反向处理

    https://codeforces.com/contest/1139/problem/E 题意 有n个学生,m个社团,每个学生有一个\(p_i\)值,然后每个学生属于\(c_i\)社团, 有d天,每 ...

  6. MySQL 多表结构的创建与分析

    =====================多对一===================== create table press( id int primary key auto_increment, ...

  7. MAC帧和PPP帧区别

  8. Codeforces Round #485 (Div. 2) D. Fair

    Codeforces Round #485 (Div. 2) D. Fair 题目连接: http://codeforces.com/contest/987/problem/D Description ...

  9. Python之xml学习笔记

    XML处理模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,至今很多传统公司如金融行业的很多系统的接口还主要是xml. xml的格式如下,就是通过&l ...

  10. docker install

    1.安装必要工具集 sudo yum install -y yum-utils 2.安装Docker官方源 sudo yum-config-manager \ --add-repo \ https:/ ...