本文把阅读到的重点摘抄下来。

一、一个子程序要么是一个程序要么是一个函数。使用CALL语句来调用程序,程序只能用输出变量传回值。就像别其它函数调用一样,函数可以被从语句外调用(即通过引用函数名),函数能返回标量值。存储子程序也可以调用其它存储子程序。

二、个存储子程序或函数与特定的数据库相联系:

  当一个子程序被调用时,一个隐含的USE db_name 被执行(当子程序终止时停止执行)。

  你可以使用数据库名限定子程序名。这可以用来引用一个不在当前数据库中而是在其他数据库中的子程序。比如,要引用一个与test数据库关联的存储程序p或函数f,你可以说CALL test.p()或test.f()。

  数据库移除的时候,与它关联的所有存储子程序也都被移除。

三、

  创建存储程序:

    CREATE PROCEDURE sp_name ([proc_parameter[,...]])
        [characteristic ...] routine_body 
创建函数:
    CREATE FUNCTION sp_name ([func_parameter[,...]])
        RETURNS type
        [characteristic ...] routine_body

  由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数。要指定为其它参数,可在参数名之前使用关键词 OUT或INOUT。指定参数为IN, OUT, 或INOUT 只对PROCEDURE是合法的。RETURNS子句只能对FUNCTION做指定,对函数而言这是强制的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。

四、MySQL允许子程序包含DDL语句,如CREATE和DROP。也允许存储程序(但不是存储函数)包含SQL 交互语句,如COMMIT。存储函数不可以包含那些做明确的和绝对的提交或者做回滚的语。

五、移除存储程序和函数

  DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

  这个语句被用来移除一个存储程序或函数。即,从服务器移除一个制定的子程序。在MySQL 5.1中,你必须有ALTER ROUTINE权限才可用此子程序。这个权限被自动授予子程序的创建者。

六、SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION

七、存储程序的调用

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

  CALL语句可以用声明为OUT或的INOUT参数的参数给它的调用者传回值。

八、BEGIN ... END复合语句

  [begin_label:] BEGIN

    [statement_list]

  END [end_label]

  存储子程序可以使用BEGIN ... END复合语句来包含多个语句。statement_list 代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。

  复合语句可以被标记。除非begin_label存在,否则end_label不能被给出,并且如果二者都存在,他们必须是同样的。

九、DECLARE语句

  DECLARE仅被用在BEGIN ... END复合语句里,并且必须在复合语句的开头,在任何其它语句之前。 光标必须在声明处理程序之前被声明,并且变量和条件必须在声明光标或处理程序之前被声明。

十、存储程序中的变量

  1.DECLARE局部变量

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

   这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个DEFAULT子句。值可以被指定为一个表达式,不需要为一个常数。如果没有DEFAULT子句,初始值为NULL。局部变量的作用范围在它被声明的BEGIN ... END块内。它可以被用在嵌套的块中,除了那些用相同名字声明变量的块。

   2.SELECT ... INTO语句

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

    这个SELECT语法把选定的列直接存储到变量。因此,只有单一的行可以被取回。注意: SQL变量名不能和列名一样。

十一、光标

  ①、声明光标

  DECLARE cursor_name CURSOR FOR select_statement

  这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。

  SELECT语句不能有INTO子句。

  ②、光标OPEN语句
    OPEN cursor_name
    这个语句打开先前声明的光标。

  ③、光标FETCH语句
    FETCH cursor_name INTO var_name [, var_name] ...
    这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。

  ④、光标CLOSE语句
    CLOSE cursor_name
    这个语句关闭先前打开的光标。 
    如果未被明确地关闭,光标在它被声明的复合语句的末尾被关闭。

  注意:光标必须在声明处理程序之前被声明,并且变量和条件必须在声明光标或处理程序之前被声明。

CREATE PROCEDURE curdemo()
BEGIN

DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;

DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cur1;
OPEN cur2;

REPEAT
  FETCH cur1 INTO a, b;
  FETCH cur2 INTO c;
  IF NOT done THEN
    IF b < c THEN
      INSERT INTO test.t3 VALUES (a,b);
    ELSE
      INSERT INTO test.t3 VALUES (a,c);
    END IF;
  END IF;
UNTIL done END REPEAT;

CLOSE cur1;
CLOSE cur2;

END

十二、流程控制语句

  ①、IF语句

IF search_condition THEN

  statement_list
[ELSEIF search_condition THEN

  statement_list] ...
[ELSE

  statement_list]
END IF

②、CASE语句

第一种:

CASE case_value
  WHEN when_value THEN

    statement_list
  [WHEN when_value THEN

    statement_list] ...
  [ELSE

    statement_list]
END CASE

第二种:

CASE
  WHEN search_condition THEN

    statement_list
  [WHEN search_condition THEN

    statement_list] ...
  [ELSE

    statement_list]
END CASE

  ③、LOOP语句
    [begin_label:] LOOP
      statement_list
    END LOOP [end_label]
  LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造。在循环内的语句一直重复直循环被退出,退出通常伴随着一个LEAVE 语句。
  LOOP语句可以被标注。除非begin_label存在,否则end_label不能被给出,并且如果两者都出现,它们必须是同样的。

  ④、LEAVE语句
    LEAVE label
  这个语句被用来退出任何被标注的流程控制构造。它和BEGIN ... END或循环一起被使用。

  ⑤、ITERATE label
    ITERATE只可以出现在LOOP, REPEAT, 和WHILE语句内。ITERATE意思为:“再次循环。”

  例如:

CREATE PROCEDURE doiterate(p1 INT)
BEGIN
  label1: LOOP
    SET p1 = p1 + 1;
    IF p1 < 10 THEN

      ITERATE label1;

    END IF;
    LEAVE label1;
  END LOOP label1;
  SET @x = p1;
END

⑥、REPEAT语句
[begin_label:] REPEAT
  statement_list
UNTIL search_condition
END REPEAT [end_label]

REPEAT语句内的语句或语句群被重复,直至search_condition 为真。

REPEAT 语句可以被标注。 除非begin_label也存在,end_label才能被用,如果两者都存在,它们必须是一样的。

例如:

mysql> delimiter //

mysql> CREATE PROCEDURE dorepeat(p1 INT)
-> BEGIN
-> SET @x = 0;
-> REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> CALL dorepeat(1000)//
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @x//
+------+
| @x |
+------+
| 1001 |
+------+
1 row in set (0.00 sec)

  ⑦、WHILE语句

[begin_label:] WHILE search_condition DO
  statement_list
END WHILE [end_label]

WHILE语句内的语句或语句群被重复,直至search_condition 为真。

WHILE语句可以被标注。 除非begin_label也存在,end_label才能被用,如果两者都存在,它们必须是一样的。

例如:

CREATE PROCEDURE dowhile()
BEGIN
  DECLARE v1 INT DEFAULT 5;

  WHILE v1 > 0 DO
  ...
  SET v1 = v1 - 1;
END WHILE;
END

阅读MySQL文档第20章:存储程序和函数的更多相关文章

  1. 阅读MySQL文档第21章摘抄

    触发程序是与表相关的数据库对象. mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); Query OK, 0 ro ...

  2. Ext JS 6学习文档-第8章-主题和响应式设计

    Ext JS 6学习文档-第8章-主题和响应式设计 主题和响应式设计 本章重点在 ExtJS 应用的主题和响应式设计.主要有以下几点内容: SASS 介绍和入门 主题 响应式设计 SASS 介绍和入门 ...

  3. Ext JS 6学习文档-第7章-图表

    Ext JS 6学习文档-第7章-图表 使用图表 本章中将探索在 ExtJS 中使用不同类型的图表并使用一个名为费用分析的示例项目结束本章所学.以下是将要所学的内容: 图表类型 条形图 和 柱形图 图 ...

  4. Ext JS 6学习文档-第6章-高级组件

    Ext JS 6学习文档-第6章-高级组件 高级组件 本章涵盖了高级组件,比如 tree 和 data view.它将为读者呈现一个示例项目为 图片浏览器,它使用 tree 和 data view 组 ...

  5. Ext JS 6学习文档-第5章-表格组件(grid)

    Ext JS 6学习文档-第5章-表格组件(grid) 使用 Grid 本章将探索 Ext JS 的高级组件 grid .还将使用它帮助读者建立一个功能齐全的公司目录.本章介绍下列几点主题: 基本的 ...

  6. Ext JS 6学习文档-第4章-数据包

    Ext JS 6学习文档-第4章-数据包 数据包 本章探索 Ext JS 中处理数据可用的工具以及服务器和客户端之间的通信.在本章结束时将写一个调用 RESTful 服务的例子.下面是本章的内容: 模 ...

  7. Ext JS 6学习文档-第3章-基础组件

    Ext JS 6学习文档-第3章-基础组件 基础组件 在本章中,你将学习到一些 Ext JS 基础组件的使用.同时我们会结合所学创建一个小项目.这一章我们将学习以下知识点: 熟悉基本的组件 – 按钮, ...

  8. Emacs阅读chm文档

    .title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium ...

  9. 阅读MDN文档之CSS选择器介绍(一)

    本文为阅读MDN文档笔记 目录 Different types of Selectors Attribute Selectors Presence and value attribute select ...

随机推荐

  1. Django的学习基础1

    著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. Django的MTV模式本质上与MVC模式没有什么差别,也是 ...

  2. C#实体对象序列化成Json,格式化,并让字段的首字母小写

    解决办法有两种:第一种:使用对象的字段属性设置JsonProperty来实现(不推荐,因为需要手动的修改每个字段的属性) public class UserInfo { [JsonProperty(& ...

  3. SSRS Report Knowledge Base

    1. 获取Textbox的值,根据Textbox值更改单元格颜色 Textbox值:=ReportItems!Textbox1.Value 当前单元格的值:=Me.Value =IIF(ReportI ...

  4. Shiro - web应用

    先不谈Spring,首先试着用最简易的方式将Shiro集成到web应用. 即使用一些Servlet ContextListener.Filter.ini这些简单的配置完成与web应用的集成. web. ...

  5. WebAPI搭建(二) 让WebAPI 返回JSON格式的数据

    在RestFul风格盛行的年代,对接接口大多数人会选择使用JSON,XML和JSON的对比传送(http://blog.csdn.net/liaomin416100569/article/detail ...

  6. redis操作基本命令

    Redis—— Remote Dictionary Server,它是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,我们 ...

  7. ApplicationContextAware接口

    在某些特殊的情况下,Bean需要实现某个功能,但该功能必须借助于Spring容器才能实现,此时就必须让该Bean先获取Spring容器,然后借助于Spring容器实现该功能.为了让Bean获取它所在的 ...

  8. TCP客户端 服务端详细代码

    本文章转自http://www.myexception.cn/program/1912019.html TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TC ...

  9. javascript检查数据中是否存在相同的元素

    这里是两个用于数组中查找重复元素的demo,可以看看啦 <!DOCTYPE html><html lang="en"><head> <me ...

  10. 原生JS的轮播图

    学习前端也有一小段时间了,当初在学习javascript的时候,练手的一个轮播图实例,轮播图也是挺常见的了. 着是通过获取图片偏移量实现的.也实现了无缝切换.还有一点问题就是没有加上图片切换的时候的延 ...