zoukankan      html  css  js  c++  java
  • CREATE PROCEDURE

    1 CREATE PROCEDURE(创建)

    CREATE PROCEDURE存储过程名(參数列表)

    BEGIN

    SQL语句代码块

    END

    注意:

    由括号包围的參数列必须总是存在。假设没有參数,也该使用一个空參数列()。每一个參数默认都是一个IN參数。要指定为其他參数,可在參数名之前使用关键词 OUT或INOUT

    mysqlclient定义存储过程的时候使用delimiter命令来把语句定界符从;变为//。

    当使用delimiter命令时,你应该避免使用反斜杠(‘"’)字符,由于那是MySQL的转义字符。

    如:

    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)

    1.2 ALTER PROCEDURE(改动)

    ALTER PROCEDURE存储过程名SQL语句代码块

    这个语句能够被用来改变一个存储程序的特征。

    1.3 DROP PROCEDURE(删除)

    DROP PROCEDURE IF EXISTS存储过程名

    eg:DROP PROCEDURE IF EXISTS proc_employee (proc_employee存储过程名)

    这个语句被用来移除一个存储程序。不能在一个存储过程中删除还有一个存储过程,仅仅能调用还有一个存储过程

    1.4 SHOW CREATE PROCEDURE(类似于SHOW CREATE TABLE,查看一个已存在的存储过程)

    SHOW CREATE PROCEDURE存储过程名

    1.5 SHOW PROCEDURE STATUS(列出全部的存储过程)

    SHOW PROCEDURE STATUS

    1.6 CALL语句(存储过程的调用)

    CALL存储过程名(參数列表)

    CALL语句调用一个先前用CREATE PROCEDURE创建的程序。

    CALL语句能够用声明为OUT或的INOUT參数的參数给它的调用者传回值。

    存储过程名称后面必须加括号,哪怕该存储过程没有參数传递

    1.7 BEGIN ... END(复合语句)

    [begin_label:]

    BEGIN

    [statement_list]

    END

    [end_label]

    存储子程序能够使用BEGIN ... END复合语句来包括多个语句。

    statement_list代表一个或多个语句的列表。statement_list之内每一个语句都必须用分号(;)来结尾。

    复合语句能够被标记。除非begin_label存在,否则end_label不能被给出,而且假设二者都存在,他们必须是相同的。

    1.8 DECLARE语句(用来声明局部变量)

    DECLARE语句被用来把不同项目局域到一个子程序:局部变量

    DECLARE仅被用在BEGIN ... END复合语句里,而且必须在复合语句的开头,在不论什么其他语句之前。

    1.9 存储程序中的变量

    1.1 DECLARE局部变量

    DECLARE var_name[,...] type [DEFAULT value]

    这个语句被用来声明局部变量。

    要给变量提供一个默认值,请包括一个DEFAULT子句。

    值能够被指定为一个表达式,不须要为一个常数。

    假设没有DEFAULT子句,初始值为NULL。

    局部变量的作用范围在它被声明的BEGIN ... END块内。

    它能够被用在嵌套的块中,除了那些用同样名字声明变量的块。

    1.2 变量SET语句

    SET var_name = expr [, var_name = expr]

    在存储程序中的SET语句是一般SET语句的扩展版本号。

    被參考变量可能是子程序内声明的变量,或者是全局server变量。

    在存储程序中的SET语句作为预先存在的SET语法的一部分来实现。这同意SET a=x, b=y, ...这种扩展语法。

    当中不同的变量类型(局域声明变量及全局和集体变量)能够被混合起来。

    这也同意把局部变量和一些仅仅对系统变量有意义的选项合并起来。

    1.3 SELECT ... INTO语句

    SELECT col_name[,...] INTO var_name[,...] table_expr

    这个SELECT语法把选定的列直接存储到变量。

    因此,仅仅有单一的行能够被取回。

    SELECT id,data INTO x,y FROM test.t1 LIMIT 1;

    注意,用户变量名在MySQL 5.1中是对大写和小写不敏感的。

    重要: SQL变量名不能和列名一样。假设SELECT ... INTO这种SQL语句包括一个对列的參考,并包括一个与列同样名字的局部变量,MySQL当前把參考解释为一个变量的名字。

    1.10 MySQL存储过程參数类型(in、out、inout)

    此小节内容来自:

    參见地址:http://www.blogjava.net/nonels/archive/2009/04/22/233324.html

    MySQL存储过程參数(in)

    MySQL存储过程 “in”參数:跟 C语言的函数參数的值传递类似, MySQL存储过程内部可能会改动此參数,但对 in类型參数的改动,对调用者(caller)来说是不可见的(not visible)。

    MySQL存储过程參数(out)

    MySQL存储过程 “out”參数:从存储过程内部传值给调用者。在存储过程内部,该參数初始值为 null,不管调用者是否给存储过程參数设置值

    MySQL存储过程參数(inout)

    MySQL存储过程 inout參数跟 out类似,都能够从存储过程内部传值给调用者。不同的是:调用者还能够通过 inout參数传递值给存储过程。

    总结

    假设只想把数据传给 MySQL存储过程,那就使用“in”类型參数;假设只从 MySQL存储过程返回值,那就使用“out”类型參数;假设须要把数据传给 MySQL存储过程,还要经过一些计算后再传回给我们,此时,要使用“inout”类型參数。

    1.11 样例:

    1.1 创建存储过程

    带(输出參数)返回值的存储过程:

    --删除存储过程

    DROP PROCEDURE IF EXISTS proc_employee_getCount

    --创建存储过程

    CREATE PROCEDURE proc_employee_getCount(out n int)

    BEGIN

    SELECT COUNT(*) FROM employee ;

    END

    --MYSQL调用存储过程

    CALL proc_employee_getCount(@n);

    带输入參数的存储过程:

    --删除存储过程

    DROP PROCEDURE IF EXISTS proc_employee_findById;

    --创建存储过程

    CREATE PROCEDURE proc_employee_findById(in n int)

    BEGIN

    SELECT * FROM employee where id=n;

    END

    --定义变量

    SET @n=1;

    --调用存储过程

    CALL proc_employee_findById(@n);

    操作存储过程时应注意:

    1. 删除存储过程时仅仅须要指定存储过程名就可以,不带括号;

    2. 创建存储过程时,无论该存储过程有无參数,都须要带括号;

    3. 在使用SET定义变量时应遵循SET的语法规则;

    SET @变量名=初始值;

    4. 在定义存储过程參数列表时,应注意參数名与数据库中字段名差别开来,否则将出现无法预期的结果

  • 相关阅读:
    报错Required String parameter 'customerInfo' is not present的原因及处理办法
    Mybatis 中$与#的区别
    ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
    Git使用
    前后端分离
    对excel文件的读取
    POI导入和导出Excel总结
    git权限
    @RequestParam与@PathVariable
    lombok学习
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4027263.html
Copyright © 2011-2022 走看看