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

一、一个子程序要么是一个程序要么是一个函数。使用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. 清除SQL Server内存

    数据库进行查询时,会缓存结果集,当查询结果过大时会出现内存爆满的情况,如果手动清除SQL所占用的内存呢,在网上搜索一下,把结果贴下面: --强制释放内存 Create procedure [dbo]. ...

  2. 巧用CheckedTextView完成自定义radiobutton的listview

    因为要用自定义图片的radiobutton的listview,最开始想自己重新写BaseAdapter,重新定义BaseAdapter中的每个list的item.总之android提供了太多方便的控件 ...

  3. java gc 随记

    gc为garbage collection的缩写,中文翻译为垃圾回收.垃圾为不在使用的实例.变量,回收为释放垃圾所占用的内存空间. 学习过的C语言.C++语言,是没有垃圾回收机制的,因此需要软件工程师 ...

  4. IIS调试技术之 Debug Diagnostic (调试诊断)

    IIS 调试技术之 Debug Diagnostic (调试诊断) 1      概述 1.1  文档简介 系统出现错误或崩溃,免不了要进行调试.调试能进行的前提是错误能重现,但实际上要重现一个错误有 ...

  5. redis(8)集群简介

    一.集群 互联网每天都会产生大量的数据,单实例已经不能满足需求.但是如果依赖于硬件成本的提升,那就不是所有人能够负担的起的. 集群这个时候出现,一定程度上解决了这个问题.它通过互联网,将多个单实例连接 ...

  6. getElementsByName属性

    getElementsByName() 方法可返回带有指定名称的对象的集合 语法 document.getElementsByName(name) 该方法与 getElementById() 方法相似 ...

  7. 解决maven项目中,缺少 maven dependencies

    因为项目需要将普通项目转换为maven项目,在右键 ’项目‘configure 后,添加maven后,发现缺少 maven dependencies,于是从网上找了一些处理措施,大体上是在.class ...

  8. 设计模式入门,观察者模式,c++代码实现

    // test02.cpp : Defines the entry point for the console application.////设计模式第2章 观察者模式#include " ...

  9. mysql的with rollup

    无意间发现了mysql的with rollup函数(用在group by 函数后面) 测试 1. SELECT NAME,DATE,score FROM stu 结果是 2. SELECT NAME, ...

  10. mac 安装mysql-python

    ln -s /usr/local/mysl/bin/* /usr/bin  #建立软连接 sudo pip install mysql-python    #安装 python             ...