博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql笔记(20)--使用存储过程
阅读量:3957 次
发布时间:2019-05-24

本文共 2475 字,大约阅读时间需要 8 分钟。

使用存储过程

什么是存储过程?

存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。也叫作 调用

为什么使用存储过程?

方便复用复杂的sql,提高性能。。。

如何创建存储进程?

DROP PROCEDURE IF EXISTS mysql_must_study.productpricing;DELIMITER $$$$CREATE PROCEDURE mysql_must_study.productpricing()BEGIN	SELECT avg(prod_price) AS priceaverage 	FROM mysql_must_study.products u;END$$DELIMITER ;

此存储过程名为productpricing,用CREATE PROCEDURE productpricing()语句定义。如果存储过程接受参数,它们将在()中列举出来。此存储过程没有参数,但后跟的()仍然需要。BEGIN和END语句用来限定存储过程体,过程体本身仅是一个简单的SELECT语句。

DELIMITER $$ 指定$$作为语句分隔符,为了使存储过程体内的;生效。最后通过DELIMITER ;恢复;作为结束符。

\符号外,任何字符都可以用作语句分隔符

如何删除存储过程?

在这里插入图片描述

如何使用存储过程?

MySQL称存储过程的执行调用,因此MySQL执行存储过程的语句为CALL。CALL接受存储过程的名字以及需要传递给它的任意参数

CALL productpricing();

在这里插入图片描述

如何给存储过程添加参数?

DROP PROCEDURE IF EXISTS mysql_must_study.productpricing;DELIMITER $$$$CREATE PROCEDURE mysql_must_study.productpricing(	OUT pl decimal(8,2),	OUT ph decimal(8,2),	OUT pa decimal(8,2))BEGIN	SELECT min(prod_price)	INTO pl	FROM mysql_must_study.products ;	SELECT max(prod_price)	INTO ph	FROM mysql_must_study.products ;	SELECT Avg(prod_price)	INTO pa	FROM mysql_must_study.products ;END$$DELIMITER ;

在这里插入图片描述

在这里插入图片描述

CALL productpricing(@pricelow,					@pricehigh,					@priceaverage);

这条CALL语句给出3个参数。它们是存储过程将保存结果的3个变量的名字

利用调用返回生成的3个变量。变量调用要加@

变量的查询使用select

SELECT @pricelow,@pricehigh,@priceaverage;

在这里插入图片描述

来看看 IN 在存储过程中的使用,传参功能?

DROP PROCEDURE IF EXISTS mysql_must_study.ordertotal;DELIMITER $$$$CREATE PROCEDURE mysql_must_study.ordertotal(	IN onumber int ,	OUT ototal decimal(8,2))BEGIN	SELECT sum(item_price*quantity)	FROM mysql_must_study.orderitems 	WHERE order_num = onumber	INTO ototal;END$$DELIMITER ;

新建一个 ordertotal 调用,传入一个 onumber 参数,根据参数计算后返回一个 ototal 变量。

在这里插入图片描述

CALL ordertotal(20005,@total) ;

必须给 ordertotal 传递两个参数;第一个参数为订单号,第二个参数为包含计算出来的合计的变量名。

SELECT @total;

在这里插入图片描述


更复杂和强大的功能:可以通过传入的参数进行if判断执行对应的语句。

DROP PROCEDURE IF EXISTS mysql_must_study.ordertotal;DELIMITER $$$$CREATE PROCEDURE mysql_must_study.ordertotal(	IN onumber int ,	IN taxable boolean,	OUT ototal decimal(8,2))BEGIN	DECLARE total decimal(8,2);	DECLARE taxrate int DEFAULT 6;		SELECT sum(item_price*quantity)	FROM mysql_must_study.orderitems 	WHERE order_num = onumber	INTO total;	IF taxable THEN 		SELECT total+(total/100*taxrate) INTO total;	END IF ;		SELECT total INTO ototal;END$$DELIMITER ;

在这里插入图片描述

在这里插入图片描述

查询’存储过程’的信息

SHOW CREATE PROCEDURE ordertotal;

获得包括何时、由谁创建等详细信息的存储过程列表

在这里插入图片描述

总结:

  • 存储过程,调用,可以封装sql语句,调用时可以根据参数返回变量。
  • 通过 create procedure 创建,drop删除。关键字有 in (要传入的参数的数据类型)out(要输出的变量名和其类型);
  • begin 和 end 定义要执行的sql,其中 into 表示将值赋值给要 out 的变量。
  • 查询变量时 select 需要@变量名

转载地址:http://dpozi.baihongyu.com/

你可能感兴趣的文章
linux下md5加密(使用openssl库C实现)
查看>>
openssl、MD5的linux安装方法
查看>>
DevC++ 工程没有调试信息的解决办法
查看>>
http消息长度的确定
查看>>
手机和电脑如何连接蓝牙
查看>>
HTTP协议参数
查看>>
wireshark检索命令
查看>>
五人分鱼问题(附答案)
查看>>
linux查看文件有多少行
查看>>
error:previous declartion of "XXX" is here的解决方法
查看>>
sha1的几个函数的使用
查看>>
为什么int型的数组用memset不能清零(memset的使用规范)
查看>>
<转>CRC校验、MD5、SHA1算法的概念和可靠性现状
查看>>
linux杀死进程详解
查看>>
字符串表示的IP地址与点分式表示的IP地址间的相互转化
查看>>
implicit declaration of function 这种警告问题的原因及解决方法
查看>>
utorrent如何处理占资源过大的问题
查看>>
<好文分享>妖怪和和尚过河问题
查看>>
uTP协议的前世今生(from wikipedia)
查看>>
uTP协议的前世今生(from wikipedia)
查看>>