标签:
1,存储过程和函数的介绍:
*存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合.
*存储过程和函数的区别:
&函数必须有返回值,而存储过程没有.
&存储过程的参数可以是IN,OUT,INOUT类型,函数的参数只能是IN.
*使用存储过程和函数的优点:
&存储过程只在创建时进行编译,SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库的执行速度.
&简化复杂操作,结合事物一起封装.
&具有复用性
&安全性高,可指定存储过程的使用权.
2,创建和调用存储过程:
*创建语法:
CREATE PROCEDURE sp_name(参数列表);
[特性...] 过程体
*创建语法说明:
&存储过程的参数形式:[IN|OUT|INOUT] 参数名 类型
IN 输入参数
OUT 输出参数
INOUT 输入输出参数
&特性:
LANGUAGE SQL:说明过程体部分是由SQL语言组成的,这也是数据库系统默认的语言.
[NOT] DETERMINISTIC:指明存储过程的执行结果是否确定.DETERMINISTIC表示结果是确定的.每次执行存储过程时,相同的输入会得到
相同的输出.NOT DETERMINISTIC表示结果是非确定的,相同的输入可能得到不同的输出.默认情况下,结果是非确定的.
{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFY SQL DATA}:指明子程序使用SQL语句的限制.CONTAINS SQL表示子程序包含SQL语句,
但不包含读或写数据的语句;NO SQL表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句;MODIFY SQL DATA表
示子程序包含数据的写语句.默认情况下,系统会指定为CONTAINS SQL.
SQL SECURITY {DEFINER|INVOKER}:指明谁有权限来执行.DEFINER表示只有定义者自己才能够执行;INVOKER表示调用者可以执行.默认情况
下,系统指定的权限是DEFINER.
COMMENT ‘string‘:注释信息.
*修改定界符:
&用MySQL命令客户端DELIMITER命令来改变定界符,这样就允许在程序体中使用;
&DELIMITER语法:
DELIMITER//
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
有效SQL语句
END//
DELIMITER;
*调用存储过程:
&语法:
CALL存储过程名(实际参数列表);
3,创建和调用函数
*创建语法:
CREATE FUNCTION 函数名(参数列表) RETURNS 返回值类型
[特性...] 函数体
*函数的参数形式: 参数名 类型
*调用:
SELECT 函数名(实际参数列表);
4,查看存储过程和函数
*查看存储过程或函数的定义:
SHOW CREATE {PROCEDURE|FUNCTION} sp_name;
*查看存储过程或函数的状态:
SHOW {PROCEDURE|FUNCTION} STATUS [LIKE ‘pattern‘];
5,删除存储过程和函数
*一次只能删除一个存储过程或者函数:
DROP {PROCEDURE|FUNCTION} [IF EXISTS] sp_name;
6,变量的使用
*变量的定义:
&DECLARE 变量名 [,...] 变量类型 [DEFAULT值]
&定义一个局部变量,该变量的作用范围只能在BEGIN...END之中,也可以用在嵌套的块中.
&变量的定义必须写在复合语句的开头,并且在任何其它语句的前面.
*变量的赋值:
&直接赋值: SET 变量名 = 表达式值或常量[,...];
&将查询结果覆给变量(查询返回的结果只能有一行):
SELECT 列名[,...] INTO 变量名 [,...] FROM 表名 WHERE 条件...;
*用户变量(弱类型):
&定义:是由客户端定义的变量
&声明形式:@变量名
&赋值:
SET @变量名=表达式 ;
SELECT 值 INTO @变量名;
&注意:一个客户端定义的变量(用户变量)不能被其它客户端看到或使用,当客户端退出时,该客户端连接的
所有变量将自动释放.
7,流程控制
*IF语句:
&语法:
IF 条件表达式 THEN
SQL语句块
[ELSEIF 条件表达式 2 THEN SQL 语句块2]...
[ELSE SQL语句块3]
END IF;
*CASE语句:
&语法:
CASE 表达式值
WHERE 值1 THEN SQL语句块1;
[WHERE 值2 THEN SQL语句块2]...
[ELSE SQL语句块3]
END CASE;
*LOOP语句及跳转
&语法:
[开始标注:] LOOP
语句块
END LOOP[结束标注]
&注意:LOOP语句用来实现简单的循环;除非"开始标注"存在,否则"结束标注"不能被给出,并且如果两者都出现,它们必须是
同样的.
*LEAVE label:
用于从标签的流程控制构造中退出,它和BEGIN...END或循环一起被使用.
*ITERATE label:
用于跳过当前循环的剩下的语句,直接进入下一轮循环;ITERATE只可以出现在LOOP,REPEAT,和WHILE语句内.
*REPEAT语句:
&语法:
[开始标注:]REPEAT
语句块
UNTIL 条件表达式
END REPEAT[结束标注]
*WHILE语句:
&语法:
[开始标注:]WHILE 条件表达式 DO
语句块
END WHILE[结束标注]
8,定义条件和处理程序
*定义条件:指提前定义程序在执行过程中可能遇到的问题.
&语法:
DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value | mysql_error_code
*定义处里程序:指定义解决定义条件所发生的问题
&语法:
DECLARE handler_type HANDLER FOR condition_value[,....] sp_statement
handler_type:
CONTINUE|EXIT|UNDO
condition_value:
SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING
|NOT FOUND| SQLEXCEPTION | mysql_error_code
9,光标的使用
*定义及作用:查询语句可能查询出多条记录,在存储过程和函数中使用光标来逐条读取查询结果集中的记录
*声明光标:
DECLARE cursor_name CURSOR FOR select_statement;
*打开光标:
OPEN cursor_name;
*使用光标:
FETCH cursor_name INTO var_name[,var_name....];
*关闭光标:
CLOSE cursor_name;
示例:
1,在food表上创建名为food_price_count的存储过程,该存储过程有三个参数:输入参数为price_info1和price_info2;
输出参数为count.存储过程的作用是查询food表中食品单价高于price_info1并且低于price_info2的食品种数,然后由
count参数来输出,并且计算满足条件的单价总和.
food表:
标签:
原文地址:http://www.cnblogs.com/navy-runner/p/5617678.html