1 创建存储过程和函数
创建存储过程和函数的create语法规范如下:

    CREATE
        [DEFINER = { user | CURRENT_USER }] ##很多时候不需要特别声明
        PROCEDURE sp_name ([proc_parameter[,...]])
        [characteristic ...] routine_body

    CREATE
        [DEFINER = { user | CURRENT_USER }]
        FUNCTION sp_name ([func_parameter[,...]]) ##输入参数
        RETURNS type  ## 声明返回值
        [characteristic ...] routine_body

    proc_parameter:
        [ IN | OUT | INOUT ] param_name type ##声明输入输出参数

    func_parameter:
        param_name type ##输入参数,由于其输出参与已经在return中声明,不需要再指定

    type:
        Any valid MySQL data type

    characteristic:
        COMMENT 'string'
      | LANGUAGE SQL
      | [NOT] DETERMINISTIC  ##默认为NOT DTERMINISTIC
      | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
      | SQL SECURITY { DEFINER | INVOKER }

    routine_body:
        Valid SQL routine statement

如果没有声明[NOT] DETERMINISTIC选项,则mysql默认的选项为NOT DETERMINISTIC,意味着mysql针对DETERMINISTIC的优化器不会开启。因此这个选项需要特别注意的写上。
但是仅有create语句是不够的,一般创建过程和函数有一下3个步骤:
a 修改delimiter
b create语句+begin...end语句 作为存储过程和函数的主体部分
c 恢复原有的delimiter
如 官方文档中创建存储过程的实例:

    mysql> delimiter //

    mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
        -> BEGIN
        ->   SELECT COUNT(*) INTO param1 FROM t;
        -> END//
    Query OK, 0 rows affected (0.00 sec)

    mysql> delimiter ;   

创建函数的示例:

    mysql> delimiter //
    mysql> CREATE FUNCTION hello (s CHAR(20))
    mysql> RETURNS CHAR(50) DETERMINISTIC
        -> RETURN CONCAT('Hello, ',s,'!');
    Query OK, 0 rows affected (0.00 sec)
    mysql> delimiter ;

2 调用方法

    CALL sp_name([parameter[,...]])
    CALL sp_name[()]

3 查看状态

    SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']
    或者:
    SHOW CREATE {PROCEDURE | FUNCTION} sp_name
    或者从information_schema.Routines表中查看
    SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=' sp_name ' ;

4 修改

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

5 删除

    DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

6 过程和函数的好处
可以参见博文利用mysql的存储过程比单独执行mysql的优势在哪里?好处有什么?
简单说起来主要是:可复用,高效率,省流量,更安全。

posted on 2016-02-25 22:37  迷阳  阅读(1198)  评论(0编辑  收藏  举报