mysql存储过程小解
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存储过程小解的更多相关文章
- Oracle存储过程小解
Oracle存储过程小解 1.创建语法 create or replace procedure pro_name( paramIn in type, paramOUt out type, paramI ...
- MySQL存储过程(转)
一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...
- MySql存储过程
MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...
- mysql存储过程和存储函数
mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...
- mysql存储过程编写-入门案例-遁地龙卷风
(-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...
- MySQL存储过程动态SQL语句的生成
用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...
- MySQL 存储过程
MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...
- mysql存储过程详解
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...
- PHP调用MYSQL存储过程实例
PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一:无参的存储过程$conn = ...
随机推荐
- 2019Python学习路线图
- HTML5 drag拖动事件
参考链接:https://segmentfault.com/a/1190000013606983 例子: <!DOCTYPE HTML> <html> <head> ...
- 构建工具Bazel入门
Bazel入门 原文:http://bazel.io/docs/getting-started.html 译者:chai2010 安装 安装过程请参考: http://bazel.io/docs/ ...
- Redis生存时间、删除策略和排序
生存时间 设置命令 expire key long:设置数据在long秒后过期. pexpire key long:设置数据在long毫秒后过期. ttl key:查询数据剩余的生存时间.如果数据已过 ...
- spring-注解配置-junit整合测试-aop
1 使用注解配置spring 1.1 步骤 导包4+2+spring-aop 1.为主配置文件引入新的命名空间(约束) 2.开启使用注解代理配置文件 3.在类中使用注解完成配置 1.2 将对象注册到容 ...
- Tensorboard在Win7下chrome无论如何无法连接的情况
后记:其实发现原因后感觉自己很蠢,是自己开了一个软件叫adsafe,会屏蔽一些东西,所以我拼命的用自己的电脑ip都连不上,换成回环地址就好了,把软件关了也可以. 在无数种尝试后,终于在stackove ...
- Leetcode551.Student Attendance Record I学生出勤记录1
给定一个字符串来代表一个学生的出勤纪录,这个纪录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个学生的出勤纪录中不超过一个' ...
- CentOS 6.5之zabbix2.2的简单部署
Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.(目前,官方长期维护的稳定版本有2.2和3.0) 其他常见的监控工具还有: (1)Cacti:Cacti是一 ...
- 使用Python的requests库作接口测试——请求对象与响应对象
任何时候调用requests.*()操作接口时,我们都在做两件事情: 1.构建一个Request对象,该对象被发送到服务器去请求或查询一些资源: 2.一旦requests得到一个从服务器返回的响应,就 ...
- Django项目:CRM(客户关系管理系统)--19--11PerfectCRM实现King_admin分页显示条数
登陆密码设置参考 http://www.cnblogs.com/ujq3/p/8553784.html list_per_page = 2 #分页条数 list_per_page = 2 #分页条数 ...