ITPub博客

首页 > 数据库 > MySQL > 十、存储过程和函数 w 夏籽

十、存储过程和函数 w 夏籽

MySQL 作者:vealxu 时间:2014-03-10 17:16:03 0 删除 编辑

1、存储过程、函数:事先经过编译并存储在数据库中的一段SQL语句的集合。

a) 存储过程参数类型:IN、OUT、INOUT;函数参数类型:IN

b) 创建、修改:

CREATE PROCEDURE sp_name ([proc_parameter[,....]]) 

[characteristic。。] routine_body  

 

CREATE FUNCTION sp_name ([func_parameter[,....]]) 

RETURNS type  

[characteristic ...] routine_body 

 

proc_parametr:  [IN|OUT|INOUT] param_name type

func_parameter:   param_name type

 

type:  any valid MYSQL data type

 

Characteristic: 

LANGUGE SQL              

//下面的body是使用sql语言编写,系统默认

|[NOT] DETERMINISTIC      

//deterministic 确定的,即每次输入一样输出也一样的程序,默认非确定

|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}

//提供子程序使用数据的内在信息;contains sql:子程序不包含读或写数据的语句;no sql:子程序不包含sql语句;reads sql data:子程序包含读数据的语句;modifies sql data:子程序包含写数据的语句。

|SQL SECURITY {DEFINER | INVOKER}    

//指定子程序是由创建者的许可执行还是调用者的许可来执行,默认definer,使用前授权。

|CONMMENT ‘string’                     

//注释信息

 

Routine_body:

Valid sql procedure statement or statements

 

ALTER {PROCEDURE | FUNCTION} sp_name[characteristic ...]

Characteristic:

{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}

|SQL SECURITY {DEFINER|INVOKER}

|COMMENT ‘string’

 

EG:

DELINITER $$           //修改程序结束符

CREATE PROCEDURE film_in_stock(IN p_film_id INT,IN p_store_id INT,OUT p_film_count INT)

READS SQL DATA

BRGIN

SELECT inventory_id

FROM inventory

WHERE film_id = p_film_id

AND store_id = p_store_id

AND inventory_in_stock(inventory_di);

 

SELECT FOUND_ROWS() INTO p_film_count; 

END $$

 DELINITER ;

调用:

CALL film_in_stock(2,2,@a);     //count结果返回到@a中

Select @a;

c) 删除、查看

DROP {PROCEDURE | FUNCTION}[IF EXISTS] sp_name;

SHOW {PROCEDURE | FUNCTION} STATUS [LIKE ‘pattern’]; 

SHOW CREATE {PROCEDURE | FUNCTION} sp_name;

select * form routines where ROUTINE_NAME = ‘film_in_stock’G;

2、变量的使用

a) 定义:DECLARE var_name[,...] type [DEFAULT value];(局部或全局变量)

b) 赋值:SET var_name = expr [,.....]...

3、定义条件和处理(与java中异常处理相似)

a) 定义:DECLARE condition_name CONDITION FOR condition_value

conditon_value:

SQLSTATE [VALUE] 

sqlstate_vlaue | mysql_error_code

b) 处理:DECLARE handler_type HANDLER FOR condition_value[,....] sp_statement 

handler_type:

CONTINUE | EXIT | UNDO

condition_value:

SQLSTATE [VALUE] 

sqlstate_value | condition_name |SQLWARNINT | NOT FOUND |SQLEXCEPTION | mysql_error_code

4、光标使用

a) 声明:DECLARE cursor_name CURSOR FOR select_statement

b) OPEN:OPENcursor_name

c) FETCH(提取):FETCH cursor_name INTO var_name [,...]

d) CLOSE:CLOSE cursor_name

EG:

Delimiter $$

CREATE PROCEDURE payment_stat ()

BEGIN

DECLARE i_staff_id int;

DECLARE d_amount decimal(5,2);

DECLARE cur_payment CURSOR FOR select staff_di,amount from payment;

DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cut_payment;

Set @x1=0;

Set @x2=0;

OPEN cut_payment;

REPEAT

FETCH cut_payment INTO i_staff_id,d_amount;

if i_staff_id = 2 then

Set @x1 = @x1 + d_mount;

else 

Set @x2 = @xa + d_mount;

end if;

INTIL 0 END REPEAT;

CLOSE cur_payment;

END;

$$

Delimiter ;

5、流程控制

a) IF :     if ... then ... ;[elseif ...then...;] [else ....;]  end if;

b) CASE :  case when ... then ...; else ...; end case; 或 case var_name when var_value then ...; else ...; end case;

c) LOOP :  [begin_label:] LOOP statement_list  END LOOP [end_label]

d) LEAVE : 从标注的流程构造中退出,通常和BEGIN。。。END或循环一起使用(leava [label(循环的标识)])。

e) ITERATE :必须用在循环中,跳过当前循环的剩下语句,直接进入下一循环(iterate [label(循环标识)])。

f) REPEAT :有条件循环语句,满足条件时推出循环。

[begin_label:]REPEAT .....UNTIL ...... END REPEAT [end_label]

g) WHILE : 满足条件则执行循环。

[begin_label:] WHILE .... DO ..... END WHILE [end_label] 

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22281808/viewspace-1114559/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-08-06