mysql 存储过程
1.创建语法
delimiter $$ --$$表示改变默认的分隔符,代表以下为存储过程,不然会以SQL的方式执行
drop procedure if exists pro_name$$ --创建存储过程之前判断是否存在,存在则先删除
create procedure pro_name(
in paramIn type(length), --IN:输入参数,不写则默认为IN,并且在存储过程不能改变值
out paramOut type(length), --Out:输出参数
inout paranInOut type(length) --InOut 输入输出参数
)
begin
...SQL...
end $$
delimiter; --恢复mysql的默认分隔符
2.mysql变量类型
<1>局部变量
存储过程中用declare声明的变量。如 Declare name varchar(100) default 'dawa';
default值可以不设置,默认为对象类型的系统默认值。
<2>用户变量
以"@"符号开头,如 set @name = 'dawa'或者在存储过程中select @name := ...
用户变量只对当前当前用户使用的客户端有效。
<3>会话变量
以"@@"符号开头,如 set @@session.name = 'dawa' 或set session name = 'dawa';
会话变量仅对连接的客户端有效。
<4>全局变量
以"@@"符号开头,如 set @@global.name = 'dawa' 或者set global name = 'dawa';
对所有客户端生效,只有super权限才可以设置global变量
declare专门用于声明局部变量,set用于设置变量值。注set设置值有两种方式 set param = value 或 set param := value;
3.常用语法
<1>if...then...elseif...then...else...end if;
示例:
DELIMITER $$
DROP PROCEDURE IF EXISTS HelloWorld$$
CREATE PROCEDURE HelloWorld (
param INT,
OUT paramout INT,
INOUT paramInOut INT
)
BEGIN
IF param MOD 3 = 0 THEN
SET paramout := param DIV 3;
SET paramInOut := param MOD 3;
ELSEIF param MOD 2 = 0 THEN
SET paramout := param DIV 2;
SET paramInOut := param MOD 2;
ELSE
SET paramout := param DIV 5;
SET paramInOut := param MOD 5;
END IF; SELECT paramout,paramInOut ;
END $$
DELIMITER ;
<2>循环:
a.LOOP...END LOOP
示例:
DELIMITER $$
DROP PROCEDURE IF EXISTS HelloWorld$$
CREATE PROCEDURE HelloWorld (param INT, OUT paramout INT)
BEGIN
DECLARE counter INT (10) ;
SET counter := param ;
SET paramout = 0 ;
my_loop :
LOOP
SET paramout := paramout + counter ;
SET counter := counter - 1 ;
IF counter <= 0
THEN LEAVE my_loop ;
END IF ;
END LOOP my_loop ;
END $$
DELIMITER ;
b.WHILE...DO...END WHILE
示例:
DELIMITER $$
DROP PROCEDURE IF EXISTS HelloWorld$$
CREATE PROCEDURE HelloWorld (param INT, OUT paramout INT)
BEGIN
DECLARE counter INT (10) ;
SET counter := param ;
SET paramout = 0 ;
WHILE
counter >= 0 DO
SET paramout := paramout + counter ;
SET counter := counter - 1 ;
END WHILE ;
END $$
DELIMITER ;
c.REPEAT...UNTIL...END REPAEAT
示例:
DELIMITER $$
DROP PROCEDURE IF EXISTS HelloWorld$$
CREATE PROCEDURE HelloWorld (param INT, OUT paramout INT)
BEGIN
DECLARE counter INT (10) ;
SET counter := param ;
SET paramout = 0 ;
REPEAT
SET paramout := paramout + counter ;
SET counter := counter - 1 ;
UNTIL counter <= 0
END REPEAT ; END $$
DELIMITER ;
<3>游标Cursor:用于查询数据批处理,cursor使用方法
declare cursor_name cursor for select...from table;
open cursor_name;
my_loop:LOOP
fetch cursor into variable;
if..then
leave my_loop;
end if;
end LOOP;
close cursor_name;
示例:
DELIMITER $$ USE `cssdj_shixi` $$ DROP PROCEDURE IF EXISTS `test` $$ CREATE DEFINER = `root` @`localhost` PROCEDURE `test` (OUT paramout VARCHAR (100))
BEGIN
DECLARE counter INT DEFAULT 0 ;
DECLARE done INT DEFAULT 0;
DECLARE notice CURSOR FOR SELECT operaName FROM g_prac_notice ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := 1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
START TRANSACTION;
OPEN notice ;
notice_loop :LOOP
FETCH notice INTO paramout ;
SET counter := counter + 1 ;
IF done = 1 OR counter = 1 THEN
LEAVE notice_loop;
END IF;
END LOOP notice_loop ;
CLOSE notice ;
COMMIT;
SELECT paramout,done,counter;
END $$ DELIMITER ; 4.异常处理
<1>语法:
DECLARE
CONTINUE -- 继续
|EXIT -- 退出
|UNDO -- 撤回,暂不支持
HANDLER
FOR
mysql_error_code -- mysql对应的错误代码
|SQLSTATE[VALUE] sqlstate_value -- SQLState标准错误代码
|condition_name -- 自定义异常
|SQLWARNING -- SQLSTATE中以"01"开头的异常,默认继续执行
|NOT FOUND -- SQLSTATE中以"01"开头的异常,默认继续执行
|SQLEXCEPTION -- SQLSTATE中不是以"00","01","02"开头的其他异常
statement -- 执行语句:如 set done = 1; condition_name:mysql_error_code及sqlstate_value值阅读性比较差
示例:
#原来的
DECLARE CONTINUE HANDLER FOR 1216 statement;
#改变的
DECLARE foreign_key_error CONDITION FOR 1216 ;
DECLARE CONTINUE HANDLER FOR foreign_key_error statement; <2>示例:
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := 1;
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;

mysql存储过程小解的更多相关文章

  1. Oracle存储过程小解

    Oracle存储过程小解 1.创建语法 create or replace procedure pro_name( paramIn in type, paramOUt out type, paramI ...

  2. MySQL存储过程(转)

    一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...

  3. MySql存储过程

    MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...

  4. mysql存储过程和存储函数

    mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...

  5. mysql存储过程编写-入门案例-遁地龙卷风

    (-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...

  6. MySQL存储过程动态SQL语句的生成

    用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...

  7. MySQL 存储过程

    MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...

  8. mysql存储过程详解

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  9. PHP调用MYSQL存储过程实例

    PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一:无参的存储过程$conn = ...

随机推荐

  1. LUOGU P1970 花匠 (Noip 2013)

    传送门 解题思路 好多大佬用的dp啊,貌似贪心可以做,每次所选的一定是每个连续递增或递减序列的最后,直接模拟就行了,注意判断一下头和尾相等的情况. #include<iostream> # ...

  2. html特殊字符 编码css3 content:"特殊符号"一览

    工作中经常会用到用纯css3美化复选框 <div class="cross"></div> css代码.cross{ width: 20px; height ...

  3. Python学习笔记之常用函数及说明

    Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...

  4. vector容量器的应用

    vector容器的应用,感觉最近做的题目还用的挺多 vector与常用数组大部分是相同的,可以进行插入,删除之类的,但是,有些题目,用普通的数组就很容易爆掉,而vector可以动态的根据你所需要的来调 ...

  5. Leetcode561.Array Partition I数组拆分1

    给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...

  6. 宝塔https

    登录宝塔论坛,然后申请免费的https,然后在域名控制面板添加解析并验证,最后宝塔强制https跳转

  7. vue 图片上传功能

    这次做了vue页面的图片上传功能,不带裁剪功能的! 首先是html代码,在input框上添加change事件,如下:   <ul class="clearfix">   ...

  8. spring源码学习之AOP(一)

    继续源码学习,看了spring中基础的容器和AOP感觉自己也没有什么长进,哈哈,我也不知道到底有用没有,这可能是培养自己的一种精神吧,不管那么多,继续学习!AOP中 AOP中几个重要的概念:(1)Ad ...

  9. input 输入框type='search'去掉×

    input输入时,为了让ios键盘的前进会变为搜索,设置input的type='search'但是安卓输入框后面会出现个小叉,实际不需要这个× 解决办法: input[type=search]::-w ...

  10. JavaScript中[]+[] 、[]+{}、{}+[]、{}+{}的结果分析

    看到这样一个问题:{} + [] 的结果是多少? 一脸懵逼.. 于是在chrome控制台运行 {} + [] 和用 console.log({} + []) 输出,发现结果不一样.. 于是,把各种可能 ...