项目七-3存储过程和函数
任务目标
任务一创建存储过程和函数
任务二查看存储过程和函数
任务三 编程语法与流程控制
任务四 修改存储过程和函数
任务六删除存储过程和函数
创建存储过程和函数
主要内容:
创建存储过程
创建存储函数
重点难点:
设计和应用;
存储过程和函数应用
引入:
db_shop系统中要完成一个购买商品的订单的处理,一般需要考虑以下几步:
(1)在生成订单之前,首先需要查看商品库存中是否有相应商品;
(2)如果商品库存中不存在相应商品,需要向供应商订货;
(3)如果商品库存中存在相应商品,需要预定商品,并修改库存数量。
针对表的一个完整事务操作往往不是单条SQL语句就能实现的,而是需要一组SQL语句来实现。
可将一个完整事务操作中所包含的多条SQL语句创建为存储过程或函数,以方便应用。
存储过程和函数作用
存储过程和函数
可以简单地理解为一组经过编译并保存在数据库中的SQL语句的集合,可以随时被调用。
作用
模块化使用。将复杂的工作程序写成存储过程和函数,以后可通过带入不同的参数或不带参重复调用,大大方便了用户的使用。
执行效率高。存储过程和函数,执行多次时速度快。
降低网络流量。存储过程是存在服务器端、并在服务器端执行,调用执行时用一个EXECUTE指令来代替存储过程内所包含的大量SQL语句的传输,大大降低了网络流量。
安全性。当数据表需要保密时,可以利用存储过程来作为数据存取的管道,来控制用户对数据库信息访问的权限。
存储过程创建
查阅语法:
官网文档:/doc/refman/8.0/en/create-procedure.html
CREATE
[DEFINER=user]
PROCEDUREsp_name([proc_parameter[,...]])
[characteristic...]routine_body
characteristic:
COMMENTstring
|LANGUAGESQL
|[NOT]DETERMINISTIC
|{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}
|SQLSECURITY{DEFINER|INVOKER}
routine_body:
ValidSQLroutinestatement
存储过程创建
创建基本语法:
CREATEPROCEDUREproc_name([IN|OUT|INOUT]param_nametype[,…])
BEGIN
语句体(包括变量声明、控制语句、SQL语句)
END
说明:
IN|OUT|INOUT表示:输入参数、输出参数、输入输出参数。
语句体以BEGIN......END括住,每一个语句都要用分号“;”结尾。
由于存储过程内部语句要以分号结束,需要在定义存储过程前,用delimiter关键字定义其他字符作为结束标志。
存储过程调用
调用基本语法:
CALLsp_name([parameter[,...]])
CALLsp_name[()]
存储过程应用
使用不带参数的存储过程
mysqldelimiter$$--改变MySQLdelimiter为:“//”改变命令提交执行的标志符号,默认情况下,delimiter是分号;
mysqlCREATEPROCEDUREp_search()
BEGIN
SELECT*FROMgoods;
END$$
mysqldelimiter;--改回默认的MySQLdelimiter:“;”
mysqlCALLp_Search();
存储过程应用
使用带输入(IN)参数的存储过程
mysqldelimiter//--改变MySQLdelimiter为:“//”
mysqlCREATEPROCEDUREp_staferSearch(INsidCHAR(5))
BEGIN
SELECT*FROMstafferWHEREstaff_id=sid;
END//
mysqldelimiter;--改回默认的MySQLdelimiter:“;”
mysqlCALLp_staferSearch(10503);
存储过程应用
使用带输入(IN)参数和输出(OUT)参数的存储过程
mysqlDELIMITER//--改变MySQLdelimiter为:“//”
mysqlCREATEPROCEDUREp_c