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 = ...
随机推荐
- Django项目:CMDB(服务器硬件资产自动采集系统)--06--06CMDB测试Linux系统采集硬件数据的命令01
#base.py # ————————01CMDB获取服务器基本信息———————— from config import settings #配置文件 class BasePlugin(object ...
- 关于mysql8授权的问题,mysql萌新小白采坑记录
记录本人第一次使用mysql时踩的坑,因为我从官网下载最新的版本8.0.15msi版本的,直接下一步下一步安装完成之后,本地访问正常,然后服务器安装访问也正常.然后本地连接服务器上的mysql时报错. ...
- idea如何清晰地查看java类的继承结构及该类的所有方法?
转载自:https://blog.csdn.net/luo609630199/article/details/82192938 我们在世用idea是平时除了编码外,有时我们需要查看源码或者别人写的代码 ...
- Python实例4- 列表到字典的函数,针对好玩游戏物品清单
假设征服一条龙的战利品表示为这样的字符串列表: dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] 写一个名为 ...
- Python学习之--数字转人民币读法(解决问题的方法很重要)
效果图: 实现代码: money = float(input("Please input the money:"))cop = int(money)Num = ['零','壹',' ...
- KMP模板题 Number Sequence HDU1711
模板...嗯 #include <iostream> #include <cstdio> #include <string.h> #pragma warning ( ...
- Leetcode142. Linked List Cycle II环形链表2
给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶: 你是否可以不用额外空间解决此题? 方法一:使用map 方法二: 分两个步骤,首先通 ...
- 03Redis入门指南笔记(事务、生存时间、排序、消息通知、管道)
一:事务 1:概述 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行. 事务的原理是是先将属于一个事务 ...
- PHP学习1.5-预定义超全局数组变量
1.PHP 预定义的超全局变量数组 特性: a.特殊的数组,操作方式没有区别 b.不用声明,php脚本中默认存在,因为在php中不用定义,所以在自定义变量是应避免和预定的全局变量同名 c.在全局范围内 ...
- 【python之路43】tornado的用法(一)
一.tonado的代码 1.返回字符串 #!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornad ...