一、什么事存储过程

  可以将存储过程看做是一组完成某个特定功能的SQL语句的集合。

  例如有一个转账功能(A向B转账50),先将账户A中金额扣除50,然后将账户B中金额添加50.

  那么我们可以定义一个名为转账的存储过程,将这些SQL语句组合在一次。

  使用时直接调用这个存储过程就可以了,这样将操作封装起来,提高了可用性。  

  后续也便于管理。

  可以将存储过程看做编程语言中的方法,只要把方法定义好了后,以后直接调用即可。

二、创建存储过程

  

DELIMITER //
CREATE PROCEDURE 存储过程名称()
BEGIN
语句1;
语句2;
END //
DELIMITER ;

由于‘;’会被作为分隔符,存储过程中的‘;’会被解释为分隔符,而不是作为存储过程的一部分,会出现语法错误。

所以先采用 DELIMITER设置分隔符为//,这样存储过程中语句的;就不会解释为分隔符,而被完整的保留了下来。

等存储过程创建完毕,再将分隔符还原为‘;’。

删除存储过程:
DROP PROCEDURE 存储过程名; -- 不需要加() 查看存储过程:
SHOW PROCEDURE STATUS;

三、调用存储过程

  调用存储过程很简单:

  CALL 存储过程名();如果存储过程设置了参数,添加对应参数即可。

  

  结合上面的创建存储过程和调用存储过程,我们来看一个小例子。、

  

DELIMITER //  -- 设置分隔符为//
CREATE PROCEDURE selectAll() -- 创建存储过程
BEGIN
SELECT * FROM products; -- 执行查询语句
END //
DELIMITER ; -- 还原分割符号 CALL selectAll(); -- 调用存储过程

四、创建带参存储过程

  存储过程名后面的()内可以添加参数。

  参数声明格式:

  参数性质 参数名 参数类型

  

  参数性质:可以是IN,OUT,INOUT中一种,

  IN代表输入参数,传递给存储过程,存储过程中对其的修改不保留。只作为传入参数。类似函数的值传递。

  OUT:该值可以被存储过程改变,改变会被保留下来。可以返回被修改后的值,类似函数的引用传递。

  INOUT:可以作为参入参数,也可作为传出参数。

  

DELIMITER //   -- 创建带参数的存储过程
CREATE PROCEDURE productpricing(
OUT p_min DECIMAL(8,2), -- DECIMAL(P,D) P代表数字长度,D代表小数位个数。长8位有两位是小数位
OUT p_max DECIMAL(8,2), -- 指定参数
OUT P_avg DECIMAL(8,2)
)
BEGIN
SELECT MIN(prod_price) INTO p_min FROM products; -- 将表中最小的prod_price设置给p_min
SELECT MAX(prod_price) INTO p_max FROM products; -- 将查询值与参数绑定
SELECT AVG(prod_price) INTO P_avg FROM products;
END // DELIMITER ; CALL productpricing(@p_min,@p_max,@p_avg); -- 调用存储过程
SELECT@p_min,@p_max,@p_avg; -- 显示返回参数

SELECT value1.1 ,value2.1 INTO value1.2, value2.2;

可以将value1.1  value2.1的值分别赋给value1.2  value2.2

@valueName 代表声明一个用户变量,使用时直接采用@valueName即可,无需事先声明。

  使用IN、OUT参数创建并调用存储过程,计算订单合计。 

DELIMITER //
CREATE PROCEDURE calTotal(
IN id INT,
OUT total FLOAT
)
BEGIN
SELECT SUM(quantity * item_price)
FROM orderitems
WHERE order_num = id
INTO total; -- 将SUM()求和后的值赋给total
END // DELIMITER ; CALL calTotal(20005,@total); -- 调用存储过程
SELECT @total;

五、创建智能处理

  在存储过程中可以添加,选择、循环等操作,使功能更强大。

DELIMITER //
CREATE PROCEDURE ordertotal(
IN ordernumber DECIMAL(8,2),-- 订单编号
IN tax BOOLEAN , -- 该商品是否计算税金,1为true计算,0位false不计算
OUT total DECIMAL(8,2) -- 最后价格
)
BEGIN
DECLARE total_tmp DECIMAL(8,2); -- 含税价格
DECLARE tax_t INT DEFAULT 6; -- 定义默认税率,6%
SELECT SUM(quantity*item_price)
FROM orderitems
WHERE order_num = ordernumber
INTO total_tmp; -- 首先计算商品不含税总价
IF tax THEN -- 如果tax为1(true) 计算含税总价
SELECT total_tmp * (1 + (tax_t / 100)) INTO total_tmp; --
END IF;
SELECT total_tmp INTO total; -- 将最后价格赋给total
END//
DELIMITER ;
CALL ordertotal(20005,1, @total); -- 计算20005号订单价格,含税, 1为true,0为false
SELECT @total; -- 显示计算后总价

DECLARE用于在BEGING/END中定义局部变量,只在当前BEGIN/END块中有效。

参考资料:

《MySQL必知必会》

MySQL中变量的定义和变量的赋值使用

  

1.6(SQL学习笔记)存储过程的更多相关文章

  1. sql学习笔记--存储过程

    存储过程(stored procedure)有时也称sproc,它是真正的脚本,更准确地说,它是批处理(batch),但都不是很确切,它存储与数据库而不是单独的文件中. 存储过程中有输入参数,输出参数 ...

  2. ORALCE PL/SQL学习笔记

    ORALCE  PL/SQL学习笔记 详情见自己电脑的备份数据资料

  3. SQL学习笔记七之MySQL视图、触发器、事务、存储过程、函数

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...

  4. Oracle之PL/SQL学习笔记

    自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...

  5. SQL学习笔记

    SQL(Structured Query Language)学习笔记 [TOC] Terminal登录数据库 1.登录mysql -u root -p ; 2.显示所有数据库show database ...

  6. SQL学习笔记五之MySQL索引原理与慢查询优化

    阅读目录 一 介绍 二 索引的原理 三 索引的数据结构 四 聚集索引与辅助索引 五 MySQL索引管理 六 测试索引 七 正确使用索引 八 联合索引与覆盖索引 九 查询优化神器-explain 十 慢 ...

  7. PL/SQL学习笔记之存储过程

    一:PL/SQL的两种子程序 子程序:子程序是执行一个特定功能.任务的程序模块.PL/SQL中有两种子程序:函数  和  过程. 函数:主要用于计算并返回一个值. 过程:没有直接返回值,主要用于执行操 ...

  8. PL/SQL学习笔记_03_存储函数与存储过程

    ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数. 存储函数:有返回值,创建完成后,通过select function() from dua ...

  9. [SQL] SQL学习笔记之基础操作

    1 SQL介绍 SQL 是用于访问和处理数据库的标准的计算机语言.关于SQL的具体介绍,我们通过回答如下三个问题来进行. SQL 是什么? SQL,指结构化查询语言,全称是 Structured Qu ...

随机推荐

  1. NYOJ 328 完全覆盖 (找规律)

    题目链接 描述 有一天小董子在玩一种游戏----用21或12的骨牌把mn的棋盘完全覆盖.但他感觉游戏过于简单,于是就随机生成了两个方块的位置(可能相同),标记一下,标记后的方块不用覆盖.还要注意小董子 ...

  2. HDU 1256 画8 (找规律)

    题目链接 Problem Description 谁画8画的好,画的快,今后就发的快,学业发达,事业发达,祝大家发,发,发.   Input 输入的第一行为一个整数N,表示后面有N组数据. 每组数据中 ...

  3. linux 查看内存和cpu占用比较多的进程

    1.可以使用一下命令查使用内存最多的10个进程        ps -aux | sort -k4nr | head -n 102. 可以使用一下命令查使用CPU最多的10个进程        ps ...

  4. Apache+jboss群集部署

    Jboss default方式上的Cluster配置[二] - 操作系统http://www.myexception.cn/operating-system/862858.html Jboss def ...

  5. django入门--django-blog-zinnia搭建个人博客

    1.安装python 选择合适python2.7及以上版本安装https://www.python.org/downloads/ 2.建立虚拟环境 这不是必须的,但是建议使用,为每个项目单独引入依赖, ...

  6. Retrofit:类型安全的REST客户端for 安卓&Java

    Retrofit:类型安全的REST客户端for 安卓&Java 2014年5月5日 星期一 21:11 官网:  http://square.github.io/retrofit/ GitH ...

  7. python中__dict__与dir()的区别

    在python中__dict__与dir()都可以返回一个对象的属性,区别在于: __dict__是对象的一个属性,而dir()是一个built-in的方法: __dict__返回一个对象的属性名和值 ...

  8. 一个简单的AboutMe页面

    Web2.0程序设计的小练习. Firefox下的效果 Chrome下的效果,套上了Helvetica,不知道为什么FF没有 (其实好像应该再优先加个Helvetica Neue的……呃……) 代码和 ...

  9. fastdfs5.11+centos7.2 按照部署(一)【转载】

    1.绪论 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家分享一下.FastDFS的作者淘宝资深架 ...

  10. linux的文件隐藏属性 chattr lsattr

    <鸟哥的Linux私房菜 基础学习篇(第三版)> 7.4.2 读书笔记 显然,这里要说的并不是rwx那9个权限,而是要聊chattr和lsattr这两个命令.这两个命令在只能在Ext2/E ...