一、存储过程
概念:存储过程是一组为了完成某项特定功能的SQL语句集, 其实质就是一段存储在数据库中的代码。 它可以由声明式的sql语句和过程式sql语句组成。
特点:
- 可增强SQL语言的功能和灵活性
- 良好的封装性
- 高性能
- 可减少网络流量
- 可作为一种安全机制来确保数据库的安全性和数据的完整性
用户定义的结束符(DELIMITER )
- DELIMITER $$:
- 例句:将MySQL结束符修改为两个感叹号“!!” (DELIMITER !!)
使用CREATE PROCEDURE语句创建存储过程:CREATE PROCEDURE sp_name([proc_parameter[,…]]) routine_body ;
proc_paramete:指定存储过程的参数列表
routine_body:存储过程的主体部分,也称为存储过程体
[IN | OUT | INOUT] param_name type:参数 名,参数类型
例如:在mysql_test中创建一个存储过程,用于实现给定表customers中一个客户id号即可修改表customers中该客户的性别为一个指定的性别
使用DECLARE语句声明局部变量:DECLARE var_name[,…] type [DEFAULT value]
例如:声明一个整型局部变量cid: DECLARE cid INT(10);
使用DECLARE语句声明局部变量的规范
- 1)只能在存储过程体的BEGIN…END语句块中声明;
- 2)必须在存储过程的开头处声明;
- 3)作用范围仅限于声明它的BEGIN…END语句块;
- 4)不同于用户变量
局部变量与用户变量的区别:
- 1)局部变量声明时,在其前面没有@符号,并且它只能 被声明它的BEGIN…END语句块中的语句所使用;
- 2)用户变量在声明时,会在其名称前面使用@符号,同 时已声明的用户变量存在于整个会话之中。
使用SET语句为局部变量赋值:SET var_name=expr[,var_name=expr]… SET cid=910;
使用SELECT…INTO语句把选定列的值直接存储到局部变量中
流程控制语句
- 1、条件判断语句 IF…THEN …ELSE语句 CASE语句 (IF 条件 THEN 表达式1 ELSE 表达式2 END IF;)
- 2、循环语句 WHILE语句 REPEAT语句 LOOP语句
WHILE 条件 表达式 END WHILE
repeat 表达式 END repeat
loop 表达式 END loop
ITERATE语句 用于表示退出当前循环
****************************游标CURSOR*****************************************
使用DECLARE CURSOR语句创建游标
使用OPEN语句打开游标:OPEN cursor_name
使用FETCH…INTO语句读取数据:
使用CLOSE语句关闭游标 :CLOSE cursor_name
**********************存储过程的使用************************
使用CALL语句调用存储过程
调用数据库mysql_test中的存储过程sp_update_sex,将客户id号为909的客户性别修改为男性“M”
CALL sp_update_sex(909,’M’);
使用DROP PROCEDURE语句删除存储过程
DROP PROCEDURE[IF EXISTS] sp_name
二、存储函数
存储函数与存储过程一样,是由SQL语句和过程式语句组成的代码片段
使用CREATE FUNCTION语句创建存储函数
CREATE FUNCTION sp_name([func_parameter[,…]]) RETURNS type routine_body
- sp_name:指定存储函数的名称
- func_parameter:指定存储函数的参数
- RETURNS type :声明存储函数返回值的数据类型; type指定返回值的数据类型
- routine_body 指定存储函数的主体部分,也称为存储函数体
在数据库mysql_test中创建 一个存储函数,要求该函数能根据 给定的客户id号返回客户的性别, 如果数据库中没有给定的客户id号 ,则返回“没有该客户”。
Use mysql_test; DELIMITER $$ CREATE FUNCTION fn_search(cid INT) RETURNS CHAR(20) DETERMINISTIC BEGIN DECLARE SEX CHAR(20); SELECT cust_sex INTO SEX FROM customers WHERE cust_id=cid; IF SEX IS NULL THEN RETURN(SELECT’没有该客户’); ELSE IF SEX=‘F’ THEN RETURN(SELECT’女’); ELSE RETURN(SELECT ‘男’); END IF; END IF; END $$
使用关键字SELECT调用存储函数:SELECT sp_name([func_parameter[, …]])
使用DROP FUNCTION语句删除存储函数:DROP FUNCTION [IF EXISTS] sp_name