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. leyou_05_文件上传

    1.搭建一个新的微服务Ly-upload用来上传文件 2.导入文件上传到额依赖 <dependencies> <dependency> <groupId>org.s ...

  2. 关于MySQL IN LIKE OR使用索引的问题

    以前在网上看了一些资料,有些人说话不严谨,导致一直被误导,最近在实际开发中发现一些结论有问题,因此特地整理了一下,防止下次继续犯错. 以下前提是有对这个字段建立索引(简直废话,没建的肯定不会使用索引啊 ...

  3. ACM中Java使用注意事项

    1. String 类用来存储字符串,可以用charAt方法来取出其中某一字节,计数从0开始, 而不是像C/C++那样使用 []访问是每个字符. 2. 在主类中 main 方法必须是 public s ...

  4. 网络编程-基础篇03(I/O模型)

    好文传播,在此插个眼: 一文读懂高性能网络编程中的I/O模型

  5. nodejs+express 初学(一)

    以下都是windows环境 1.下载nodejs http://www.nodejs.org/download/ 然后安装 2.确认已经安装完成 . node -v 3.安装express 注意: 是 ...

  6. python-基础-面象对象

    1 类和对象 定义类 定义一个类,格式如下: class 类名: 方法列表 demo:定义一个Car类 # 定义类 class Car: # 方法 def getCarInfo(self): prin ...

  7. JasperReports报表变量13

    报表变量是建立在报表表达式之上的特殊对象.报表变量简化以下任务: 报表,其中大量使用在整个报告模板表达式.这些表达式可以通过使用报表变量只能声明一次. 计数,求和,平均,最低,最高,方差等:报表变量可 ...

  8. TZOJ 4267 An Easy Puz(深搜)

    描述 Wddpdh find an interesting mini-game in the BBS of WHU, called “An easy PUZ”. It’s a 6 * 6 chess ...

  9. Leetcode114. Flatten Binary Tree to Linked List二叉树展开为链表

    给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 class Solution { publ ...

  10. 微信Web开发者工具报错:net::ERR_BLOCKED_BY_CLIENT

    今天在微信调试琳德的拼团,用了挺久之后,输入什么测试地址:发现页面空白,console提示身份验证网址错误,错误类型为:net::ERR_BLOCKED_BY_CLIENT, 尝试了好多次.以为是我的 ...