MySQL存储过程札记
DELIMITER //
CREATE PROCEDURE GetAllProducts()
BEGIN
SELECT * FROM products;
END //
DELIMITER ;
第一个命令是DELIMITER //,它与存储过程语法无关。 DELIMITER语句将标准分隔符 - 分号(;)更改为://。
在这种情况下,分隔符从分号(;)更改为双斜杠//。为什么我们必须更改分隔符? 因为我们想将存储过程作为整体传递给服务器,而不是让mysql工具一次解释每个语句。
在END关键字之后,使用分隔符//来指示存储过程的结束。 最后一个命令(DELIMITER;)将分隔符更改回分号(;)。
使用CREATE PROCEDURE语句创建一个新的存储过程。在CREATE PROCEDURE语句之后指定存储过程的名称。在这个示例中,存储过程的名称为:GetAllProducts,并把括号放在存储过程的名字之后。
BEGIN和END之间的部分称为存储过程的主体。将声明性SQL语句放在主体中以处理业务逻辑。 在这个存储过程中,我们使用一个简单的SELECT语句来查询products表中的数据。
---------------------------------------------------------------------------------------------------------------
更为常见的示例:
USE `db_name`;
DROP PROCEDURE IF EXISTS `GetAllProducts`;
DELIMITER $$
USE `db_name` $$
CREATE PROCEDURE `db_name`.`GetAllProducts`()
BEGIN
SELECT * FROM `db_name`.`table_name`;
END $$
DELIMITER ;
调用存储过程
CALL GetAllProducts();
---------------------------------------------------------------------------------------------------------------
在存储过程中声明一个变量
DECLARE variable_name datatype(size) DEFAULT default_value;
其中datatype可以是任何MySQL数据类型,不分配默认值的话,它就是NULL。
可以一次声明多个定义相同的变量:
DECLARE x, y INT DEFAULT 0;
定义的变量赋值:
DECLARE total_count INT DEFAULT 0;
SET total_count = 10;
除了SET语句之外,还可以使用SELECT INTO语句将查询的结果分配给一个变量。
DECLARE total_products INT DEFAULT 0;
SELECT COUNT(*) INTO total_products FROM products;
---------------------------------------------------------------------------------------------------------------
参数类型:IN OUT INOUT
IN 只输入不查看,即便存储过程修改了IN参数,SP结束后还是会保留原始值
OUT 过程中可以修改,便于存储过程外部查看。在存储过程启动时无法访问OUT值
INOUT 调用者可以传参,SP也可以修改该值
## IN
...
CREATE PROCEDURE GetOfficeByCountry(IN countryName VARCHAR(255))
## OUT
...
CREATE PROCEDURE CountOrderByStatus(IN orderStatus VARCHAR(25), OUT total INT)
...
CALL CountOrderByStatus('Shipped',@total);
SELECT @total;
## INOUT
DELIMITER $$
CREATE PROCEDURE set_counter(INOUT count INT(4),IN inc INT(4))
BEGIN
SET count = count + inc;
END$$
DELIMITER ;
SET @counter = 1;
CALL set_counter(@counter,1); -- 2
CALL set_counter(@counter,1); -- 3
CALL set_counter(@counter,5); -- 8
SELECT @counter; -- 8
---------------------------------------------------------------------------------------------------------------
IF condition THEN
...;
ELSEIF (condition2) THEN
...;
END IF;
实例:
USE yiibaidb;
DELIMITER $$
CREATE PROCEDURE GetCustomerLevel(
in p_customerNumber int(11),
out p_customerLevel varchar(10))
BEGIN
DECLARE creditlim double;
SELECT creditlimit INTO creditlim
FROM customers
WHERE customerNumber = p_customerNumber;
IF creditlim > 50000 THEN
SET p_customerLevel = 'PLATINUM';
ELSEIF (creditlim <= 50000 AND creditlim >= 10000) THEN
SET p_customerLevel = 'GOLD';
ELSEIF creditlim < 10000 THEN
SET p_customerLevel = 'SILVER';
END IF;
END$$
---------------------------------------------------------------------------------------------------------------
MySQL存储过程札记的更多相关文章
- 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 = ...
- mysql存储过程语法及实例
存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...
- java, mybatis, 调用mysql存储过程
Map<String, Object> bindinfo = new HashMap<String, Object>(); bindinfo.put(&q ...
随机推荐
- PAT-basic-1026 程序运行时间 java
一.题目 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间.这个时间单位是 c ...
- 源码安装pg9.6
源码安装pg9.6 添加用户 useradd pg96 下载源码包 wget https://ftp.postgresql.org/pub/source/v9.6.24/postgresql-9.6. ...
- Coursera Programming Languages, Part C 华盛顿大学 Week 3
整个系列课程的最后一小结! 介绍了之前在 interface 中所提到的 subtype 系统以及其与 ML 中 generics 的不同 introduction to subtyping 在之前的 ...
- Typora的下载和MarkDown的相关操作
MarkDown 作为程序员就要会写blog(网络日记),那么怎么让你的笔记写的排版舒适清晰?我们可以通过MarkDown来写笔记 首先我们要下载Typora,因为现在官网的Typora要付费,所以可 ...
- Android---mediaplayer 创建和调用顺序
Android mediaframework创建mediaplayer // java层 ///frameworks/base/media/java/android/media/MediaPlayer ...
- resttemplate 由于框架原因自带了转xml方式,不改变框架底层情况下,修复为返回json格式
RestTemplate httpClientTemplate = new RestTemplate(); List<HttpMessageConverter<?>> conv ...
- Servlet执行步骤
<!-- 1. 用户发请求,action=add 2. 项目中,web.xml中找到url-pattern = /add -> 第12行 3. 找第11行的servlet-name = A ...
- spring中.xml配置文件头部
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 最短路算法之 Dijkstra
部分内容参考了李煜东的<算法竞赛进阶指南>,在此声明. 单源最短路径 单源最短路径问题,是说,给定一张有向图(无向图)\(G=(V,E)\) ,\(V\) 是点集,\(E\) 是边集,\( ...
- netty库包冲突问题
参考 http://www.yayihouse.com/yayishuwu/chapter/1603 报错信息:Caused by: java.lang.NoSuchFieldError: netty ...