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存储过程札记的更多相关文章

  1. MySQL存储过程(转)

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

  2. MySql存储过程

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

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

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

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

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

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

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

  6. MySQL 存储过程

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

  7. mysql存储过程详解

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

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

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

  9. mysql存储过程语法及实例

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...

  10. java, mybatis, 调用mysql存储过程

    Map<String, Object> bindinfo = new HashMap<String, Object>();            bindinfo.put(&q ...

随机推荐

  1. 记一次在MyBatis-Plus中 @TableField 自动填充中遇见的坑

    先放一张表生成策略对应的结果 值 描述 DEFAULT 默认不处理 INSERT 插入时填充字段 UPDATE 更新时填充字段 INSERT_UPDATE 插入和更新时填充字段 此处需要注意一下,如果 ...

  2. vue中v-if与v-show区别

    vue中显隐方法常用两种,v-show和v-if,但这两种是有区别的. v-if v-if 控制元素显示或隐藏是把dom元素整个的渲染或者删除,如果删除,也就是页面中不存在这个dom元素,以此达到隐藏 ...

  3. js 比较两个数组对象,取不同的值

    let array1 = [ {'Num': 'A ', 'Name': 't1 '}, {'Num': 'B', 'Name': 't2'}, {'Num': 'C ', 'Name': 't3 ' ...

  4. http hook

    class XMLHttp { request = function(param) {} ; response = function(param) {} ; } let httpCopy = new ...

  5. 面向对象1(Java)

    什么是面向对象 面向对象编程(oop) 面向对象编程的本质是:以类的方式组织代码,以对象的组织(封装)数据 抽象 三大特征:封装.继承.多态 从认识论角度考虑是先有对象后有类.对象是具体的事物.类是抽 ...

  6. PTA1002 写出这个数 (20 分)

    1002 写出这个数 (20 分) 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 1 ...

  7. AntD为Form的List设置默认值 (antd form.list 设置默认值 )

    import React from "react"; function demo() { const FormConfig = { labelCol: { span: 8 }, w ...

  8. oracle导入dmp

    通过impdp导入 1.sqlplus       (连接oracle数据库) 2.输入用户名密码3.create user abc identified by 123456;   (创建用户名为ab ...

  9. Linux 格式化 挂载 Gdisk

    对磁盘进行格式化mkfs 创建文件系统 xfs ext4/2/3 mkfs -b 设定数据区块(block)占用空间大小,目前支持1024.2048.4096 bytes每个块.默认4K mkfs - ...

  10. gitbash 本地文件提交为一个新的项目 到 gitlab

    此篇操作的环境: 已经配置好一个本地仓库,且可成功的将本地项目提交到gitlab上的对应的远程仓库. 这意味着此时你的电脑已经安装好git,有一个本地仓库存放你的项目,成功配置好一个对应的远程仓库,且 ...