zoukankan      html  css  js  c++  java
  • [轉]mysql5存储过程语法

    From : http://yadang418.blog.163.com/blog/static/26843656200901534127348/

    A

    声明

    描述

    CREATE PROCEDURE

    建立一个存放在MySQL数据库的表格的存储过程。

    CREATE FUNCTION

    建立一个用户自定义的函数,尤其是返回数据的存储过程。

    ALTER PROCEDURE

    更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。.

    ALTER FUNCTION

    更改用CREATE FUNCTION 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。.

    DROP PROCEDURE

    MySQL的表格中删除一个或多个存储过程。

    DROP FUNCTION

    MySQL的表格中删除一个或多个存储函数。

    SHOW CREATE PROCEDURE

    返回使用CREATE PROCEDURE 建立的预先指定的存储过程的文本。这一声明是SQL:2003规范的一个MySQL扩展。

    SHOW CREATE FUNCTION

    返回使用CREATE  FUNCTION建立的预先指定的存储过程的文本。这一声明是SQL:2003规范的一个MySQL扩展。

    SHOW PROCEDURE STATUS

    返回一个预先指定的存储过程的特性,包括名称、类型、建立者、建立日期、以及更改日期。这一声明是SQL:2003规范的一个MySQL扩展。

    SHOW FUNCTION STATUS

    返回一个预先指定的存储函数的特性,包括名称、类型、建立者、建立日期、以及更改日期。这一声明是SQL:2003规范的一个MySQL扩展。

    CALL

    调用一个使用CREATE PROCEDURE建立的预先指定的存储过程。

    BEGIN ... END

    包含一组执行的多声明。

    DECLARE

    用于指定当地变量、环境、处理器,以及指针。

    SET

    用于更改当地和全局服务器变量的值。

    SELECT ... INTO

    用于存储显示变量的纵列。

    OPEN

    用于打开一个指针。

    FETCH

    使用特定指针来获得下一列。

    CLOSE

    用于关闭和打开指针。

    IF

    一个An if-then-else-end if 声明。

    CASE ... WHEN

    一个 case声明的结构

    LOOP

    一个简单的循环结构;可以使用LEAVE 语句来退出。

    LEAVE

    用于退出IFCASELOOPREPEAT以及WHILE 语句。

    ITERATE

    用于重新开始循环。

    REPEAT

    在结束时测试的循环。

    WHILE

    在开始时测试的循环。

     

    .创建存储过程

    1.基本语法:

    create procedure sp_name()
    begin
    .........
    end

    2.参数传递

    .调用存储过程

    1.基本语法:call sp_name()
    注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递

    .删除存储过程

    1.基本语法:
    drop procedure sp_name//
    2.
    注意事项
    (1)
    不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

    .区块,条件,循环

    1.区块定义,常用
    begin
    ......
    end;
    也可以给区块起别名,如:
    lable:begin
    ...........
    end lable;
    可以用leave lable;跳出区块,执行区块以后的代码
    2.
    条件语句

    if 条件 then
    statement
    else
    statement
    end if;


    3.
    循环语句
    (1).while
    循环

    [label:] WHILE expression DO
    statements
    END WHILE [label] ;

    (2).loop循环

    [label:] LOOP

    statements
    END LOOP [label];

    (3).repeat until循环

    [label:] REPEAT
    statements
    UNTIL expression
    END REPEAT [label] ;

    .其他常用命令

    1.show procedure status
    显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
    2.show create procedure sp_name

    存储过程创建语法:

    CREATE PROCEDURE procedure_name ([parameter[,...])

    [LANGUAGE SQL]

    [ [NOT] DETERMINISTIC ]

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

    [SQL SECURITY {DEFINER|INVOKER} ]

    [COMMENT comment_string]

    procedure_statements

    可用SHOW PROCEDURE STATUS SHOW CREATE PROCEDURE 来查看存储过程信息
    另,系统表INFORMATION_SCHEMA.ROUTINES也包含了存储过程的一些信息
    同样地,函数也可以使用同样方式查看(SHOW FUNCTION STATUS)

    函数的创建
     
    CREATE FUNCTION function_name (parameter[,...])

    RETURNS datatype

    [LANGUAGE SQL]

    [ [NOT] DETERMINISTIC ]

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

    [ SQL SECURITY {DEFINER|INVOKER} ]

    [ COMMENT comment_string ]

    语句体

    函数与存储过程基本一样,其区别主要有:
    1
      要使用RETURNS指定返回类型
    2
      函数必须返回值,且在语句体中使用RETURN返回(注意:指定返回类型用RETURNS,返回值用RETURN)
    3
      参数不区分INOUT,全部为IN类形


    :
    CREATE FUNCTION cust_status(in_status CHAR(1))
        RETURNS VARCHAR(20)
    BEGIN
        DECLARE long_status VARCHAR(20);
        IF in_status = 'O' THEN        SET long_status='Overdue';
        ELSEIF in_status = 'U' THEN    SET long_status='Up to date';
        ELSEIF in_status = 'N' THEN    SET long_status='New';
        END IF;
        RETURN(long_status);
    END;
     
    调用:
    SELECT cust_status('O');
     
    触发器

    CREATE [DEFINER={user|CURRENT_USER}] TRIGGER trigger_name

    {BEFORE|AFTER} {UPDATE|INSERT|DELETE}

    ON table_name

    FOR EACH ROW

    trigger_statements

    意义:当对表table_name执行updateinsert,delete操作之前(before)或之后(after)时触发语句trigger_statements操作

    :
    mysql> CREATE TRIGGER account_balance_au
     AFTER UPDATE ON account_balance FOR EACH ROW
    BEGIN
      DECLARE dummy INT;
      IF NEW.balance<0 THEN
         SET NEW.balance=NULL;
      END IF;
    END
     
    上述触发器表示:当更新表account_balance之后,如果更新的值balance小于0,则将它改为NULL,
    :如果为OLD.balance则表示更新前的原值

  • 相关阅读:
    常用资料管理
    IIC学习笔记
    博客的开始
    试用Markdown编辑器
    裁剪方法--layer.makesToBounds 和 clipsToBounds区别和联系
    block循环引用问题--内存泄露
    UITextFiled/UITextView---占位文字的设置
    使用KVC取得私有成员变量时报连线错误
    Xcode开发--运行时runtime
    Xcode开发--屏蔽警告
  • 原文地址:https://www.cnblogs.com/Athrun/p/2119368.html
Copyright © 2011-2022 走看看