MySQL存储过程

基本语法:

CREATE PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
 
CREATE FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body
    
    proc_parameter:
    [ IN | OUT | INOUT ] param_name type
    
    func_parameter:
    param_name type
 
type:
    Any valid MySQL data type
 
characteristic:
    LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
  | COMMENT 'string'
 
routine_body:
    Valid SQL procedure statement or statements

如果要使用MySQL命令创建存储过程,则需要在存储过程前后加入delimiter,即

delimiter $$
drop procedure if exists testA $$
create PROCEDURE testA
BEGIN
 sql
end $$
delimiter ;

 在 存储过程(程序)被定义的时候,用mysql客户端delimiter命令来把语句定界符从 ;变为//。这就允许用在 程序体中的;定界符被传递到服务器而不是被mysql自己来解释。

 

 存储过程给变量赋值时需要使用 set ,即

set a = 'a';
DECLARE a varchar(20); -- a是局部变量
set @b = 'b'; -- b是用户自定义变量;当调用存储过程后,可以使用select @b获取b的值

Mysql存储过程暂时没有发现有可以调试的工具,可以使用 select xxx变量获取某个变量的值,或者新建一张表,将数据插入表中,然后通过表获取程序运行情况;

 

mysql存储过程异常声明

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

这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。 对一个CONTINUE处理程序,当前子程序的执行在执行处理程序语句之后继续。对于EXIT处理程序,当前BEGIN...END复合语句的执行被终止。UNDO 处理程序类型语句还不被支持。

·   SQLWARNING是对所有以01开头的SQLSTATE代码的速记。

·    NOT FOUND是对所有以02开头的SQLSTATE代码的速记。

·    SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。

 

如果需要读取cursor值时,需要用到异常来跳出循环。如:

drop procedure IF EXISTS test_proc;
delimiter //
create procedure test_proc()
begin
    -- 声明一个标志done, 用来判断游标是否遍历完成
    DECLARE done INT DEFAULT 0;

    -- 声明一个变量,用来存放从游标中提取的数据
    -- 特别注意这里的名字不能与由游标中使用的列明相同,否则得到的数据都是NULL
    DECLARE tname varchar(50) DEFAULT NULL;
    DECLARE tpass varchar(50) DEFAULT NULL;

    -- 声明游标对应的 SQL 语句
    DECLARE cur CURSOR FOR
        select name, password from netingcn_proc_test;

    -- 在游标循环到最后会将 done 设置为 1
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    -- 执行查询
    open cur;
    -- 遍历游标每一行
    REPEAT
        -- 把一行的信息存放在对应的变量中
        FETCH cur INTO tname, tpass;
        if not done then
            -- 这里就可以使用 tname, tpass 对应的信息了
            select tname, tpass;
        end if;
     UNTIL done END REPEAT;
    CLOSE cur;
end
//
delimiter ;
posted @ 2014-03-05 23:20  世间安得两全法  阅读(315)  评论(0)    收藏  举报