SlideShare a Scribd company logo
1 of 59
Download to read offline
MySQL 5.0 存储过程
                                 MySQL 5.0 新特性系列 第一部分




                                         MySQL 技术白皮书


                                                                  Peter Gulutzan
                                                                  March, 2005
                                                                    奕朋陈:译翻
                                                                  学大技科子电安西
                                                                  2005-5-6




            内国持支,的目业商何任及涉不,译翻人个于属:明声(                      )谢谢,处出明 注时载转请,展发
                                                       MySQL




Copyright 2005, MySQL AB                     页 第
                                              1
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                    MySQL注关的业事         息信些这留保时载转请
Table of Contents
      目录(      词名有专是都本基为因,了译翻做不录目                                 )



              Introduction ....................................................................................................3
              A Definition and an Example ........................................................................3
              Why Stored Procedures ................................................................................4
              Why MySQL Statements are Legal in a Procedure Body...........................8
              Characteristics Clauses ..............................................................................10
              Parameters....................................................................................................13
              The New SQL Statements ...........................................................................15
              Scope ...........................................................................................................16
              Loops.............................................................................................................21
              Error Handling..............................................................................................29
              Cursors .........................................................................................................35
              Security .........................................................................................................41
              Functions ......................................................................................................43
              Metadata........................................................................................................44
              Details ...........................................................................................................48
              Style...............................................................................................................52
              Tips when writing long routines.................................................................63
              Bugs ..............................................................................................................64
              Feature Requests .........................................................................................65
              Resources .....................................................................................................65
              Conclusion....................................................................................................66
              About MySQL ...............................................................................................66




Copyright 2005, MySQL AB                              页 第         2
信来请误错有如         chenpengyi_007@163.com        对您谢感时同,读阅和持支的您谢谢,                                 MySQL    注关的业事                  息信些这留保时载转请
息信些这留保时载转请              注关的业事         MySQL   对您谢感时同,读阅和持支的您谢谢,                                 chenpengyi_007@163.com
                                                                                                         信来请误错有如
                                                      页 第      3                Copyright 2005, MySQL AB
                。受接会也家大信相,惯习的去过们我是这为因,程过储存
                               pi()
用使常经更会面里书本在我。) 如,样一数函的载装预 和来起用使(数函的值回返以可                  Mysql
         SQL
 中句语 他其在是二 ,程过储存的说们我是一:种两有”)程例(    “的持支                                      routines          MySQL
   ,说来的确准,)样一序程子的里言语规正像就(序程的中库库书在储存种一是程过储存
                                        A Definition and an Example 定义及实例
                            。助帮和持支的久长到得以,户用
 Mysql
    深资的识认你询咨以可,障故现出然仍行运果如但。上脑电的您在行运的常正能将子例
 的里这此因。   , ,  HP-UX   Windows Sparc
                   括包,了 多更持支能时同,本版的高更有经已              OS                                        Mysql
  ,候时的书本读阅您在。过通试测上版共公      、      在经已都子例的以所      Mysql 5.0.3       Suse 9.2 Linux
    )本脚关相载下站网                mysql.com
                 在以可,的版子电是不的读所在现你果如(中序程端户客
    mysql
      到制复码代将接直以可你,掉去示显统系些这 和     的中子例将会我候时有               "->"       "mysql>"
                                                         Query OK, 0 rows affected (0.00 sec)
                                                            -> END;//
                                          <--               -> /* This procedure does nothing */
                                                            -> BEGIN
                                                         mysql> CREATE PROCEDURE p ()
                               :如例。调强示表以边右的
                       <--
     面页在放号符” “将用会我时同,释注加间落段和行些某在要需则,大较比例实果如
                                                               Query OK, 0 rows affected (0.00 sec)
                                                               mysql> DROP FUNCTION f;
              :子例个举里这在。样一不本文通普与来起看们他使,                                                         Courier
 成改体字将,整调行进码代的现出就幕屏的端户客 对会我,时码代际实示演要想我次每              mysql
                                                                         约定和编程风格
                                                   Conventions and Styles约定和编程风格
                                  。握掌能就快很信
   相,学去程课着跟要只是但,难很例用个这为认会家大许也前之习学在,例用用实的大较
   示展家大给会后最,念概立建家大为的慢慢始开节细个一每从会我,的目的样这到达了为
      。识知的要需到学你让子例、题问的单简用,话对行进您与样那家专行内像能书本
  这望希。集一第的书丛性特新                   MySQL 5.0
                    绍介是这,”图视构架息信、图视、器发触、程过
    储存“了绍介是说来的单简。的写而户用老    的性特新本版 解了要需为是书本            MySQL                     5.0
                                                                                         Introduction
息信些这留保时载转请      注关的业事     MySQL    对您谢感时同,读阅和持支的您谢谢,                             chenpengyi_007@163.com
                                                                                          信来请误错有如
                                           页 第      4            Copyright 2005, MySQL AB
         。已而点优的上以有没是只们它,择选的好很是还处好的程例言语部外用使
                       SQL
    ,过不。势优的句语 用使比相言语部外等 或 、 与是就这。包的同不置配         PHP     Java C
   脑电的号型同不的你为者或,可许置设行执中统系作操在序程为要需不也,包境环行运
    加添外额你要需不,上台平何任的持支 在行运以可它道知就你,时程过储存写编Mysql
    SQL
      用你当!的植移以可是程过储存。序程用应是不而辑逻库据数是它为因,响影生产
                              !件组的用复可是程过储存
                              !件组的用复可是程过储存
     会不程过储存对这,言语的机主了变改你果如下一象想!件组的用复可是程过储存
                              !件组的用复可是程过储存
                    。了往来息信的多么那没就间之端户客和器务服时
   步一每的务任行执在样这。成完来程过储存的上器务服在存保用使以可就你,务任性复
    重的互交户用有没但句语多、环循、查检要需是的理处要需你果如。量流息信络网低
   降否能于在却法方要主的度速升提是但。快么那来起行运序程的写编) 如(言语部外                              C
                  SQL
     像会不程过储存 此因,器译编有没于由。样那的做所)句语理处预(                                         statements
     Prepared
        像就,进改了做上制机存缓在器务服 是就的说以可们我。样一不也验体        Mysql
                               Mysql
                             !快更行运统系使会程过储存
                             !快更行运统系使会程过储存
   的到得户用,势优个这明证上 在能不时暂们我然虽!快更行运统系使会程过储存
                             !快更行运统系使会程过储存
                                      。读阅你
    供可档文的方三第多许有还,户用验经的用雇者或询咨以可你多很有也,念概些这得
    获里那人他其 从以可你此因。的同相是往往法语的们它而,在存已早中 他其在                                   DBMS
                            !术技的证认被经已是程过储存
       数函的能功同相是但,的新是它中 在然虽!术技的证认被经已是程过储存
                            !术技的证认被经已是程过储存
                            !术技的证认被经已是程过储存Mysql
   。做去不得不你 ,因原要需不做样这。来中程过储存到移转)中本脚是或,中) (                                       UDF
     数函义定自户用 ,中序程用应器务服在能可(序程有现把虑考始开该应你而然。路
      的过走们他走你带来户用的验经有的量大多很有没也,过用使人何任有没前之此在
   ,竟毕 。意注加更要需你时用使在的然自很,能功的新是说来   于对程过储存于由                   MySQL
                       Why Stored Procedures 为什么要用存储过程
                  。的然必是联关的程过储存和器发触为因,器发触——象
   对库据数的新绍介将们我时同。节细有所的作工的做程过储存用利以可你绍介会将我面下
              束结块句语   END                               /* end of block             */
              句语        INSERT INTO table1 VALUES (variable1);/* statement SQL       */
                 束结     END IF;                              /* end of IF IF   */
                 值赋       SET variable1 = 'beasts';         /* assignment       */
                        ELSE
                 值赋       SET variable1 = 'birds';          /* assignment      */
              始开件条      IF parameter1 = 17 THEN             /* start of IF IF       */
              明声量变      DECLARE variable1 CHAR(10);             /* variables         */
               头块句语   BEGIN                              /* start of block         */
                  数参  (IN parameter1 INTEGER)              /* parameters      */
              名程过储存   CREATE PROCEDURE procedure1                /* name             */
                  )释注文中何任添不序程的后此,读阅便方了为:注译(
                          :明声例实的程过储存括包个一是面下
                                         IF
           。义定法语的新有句件条 和制控环循,理处常异,量变部局对里这在
                SQL          SQL
       。集句语 的句语 多很括包以可及以,表列数参,字名括包程过储存个一
!存保被将程过储存
                                            !存保被将程过储存
              ,消撤票支的中理处物事行银示显如例,序程个一了好写编你果如!存保被将程过储存
                                            !存保被将程过储存
               这。中库据数在存保式形的码代源以会它 。序程的你到找以可就人的票支解了要想那
              。样一的说中论划规的到听上课在你跟能可这联关的义意有程进的据数理处和据数使将
                ) 、 如(库据数些某。准标        Mysql !植移以可程过储存
                                     持支全完 !植移以可程过储存
                                            !植移以可程过储存
                                            !植移以可程过储存      SQL 2003                         DB2 Mimer
                够足予给会将们我。持支不     、 如,的持支不分部有也但。持支样同         Oracle SQL Server
                       。上 到移转易容更能码代的写编 他其为使,具工和助帮
                                         DBMS                                   Mysql


               Setting up with MySQL 5.0 设置并开始
                                         设置并开始MySQL 5.0服务
                                                       服务


               务服   始开来                者或
                   mysql_fix_privilege_tables       过通 ~/mysql-5.0/scripts/mysql_install_db        MySQL

              员理管库据数有没果如。装安经已     定假我,分部一的作工备准的习练们我为作             MySQL 5.0
               ,事件一掉忘易容很你过不。了装安去己自要需就你,件软他其及以库据数好装安你为
                                   。表的     为名个一有要需你是就那
                                            mysql.proc

              要需只(       者或            行运须必你,后本版新最了装安在 mysql_fix_privilege_tables       mysql_install_db
              个一行运后份身 在用启时同我。作工能不将程过储存然不——)了够就个一中其行运                                        root
                        SQL               :下如,本脚 的式正非
              mysql>source/home/pgulutzan/mysql-
              5.0/scripts/mysql_prepare_privilege_tables_for_5.sql


               Starting the MySQL Client 启动
                                         启动MySQL客户端
                                                客户端


              是者或本版制进二是的用使你果如,式方他其用使会许也你。式方的端户客 动启我是这
                           mysql
               Windows    :序程下以行运下录目子他其在会能可你,脑电的统系
              pgulutzan@mysqlcom:~> /usr/local/mysql/bin/mysql --user=root
              Welcome to the MySQL monitor. Commands end with ; or g.
              Your MySQL connection id is 1 to server version: 5.0.3-alpha-debug

              Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

              的后陆登份身 以示展会将我,中示演在            root                 mysql   的大极有我着味意样这,果结的回返端户客
                             。权特
               Check for the Correct Version 核对版本



              的用使认确了为            MySQL    的用使我认确法方种两有我。本版询查要们我,的确正是本版的
               :本版 是
                  5.0

              SHOW VARIABLES LIKE 'version';
              or
              SELECT VERSION();




Copyright 2005, MySQL AB                       页 第     5
信来请误错有如         chenpengyi_007@163.com 对您谢感时同,读阅和持支的您谢谢,                      MySQL 注关的业事          息信些这留保时载转请
:如例
              mysql> SHOW VARIABLES LIKE 'version';
              +---------------+-------------------+
              | Variable_name | Value                |
              +---------------+-------------------+
              | version        | 5.0.3-alpha-debug |
              +---------------+-------------------+
              1 row in set (0.00 sec)

              mysql> SELECT VERSION();
              +-------------------+
              | VERSION()             |
              +-------------------+
              | 5.0.3-alpha-debug |
              +-------------------+
              1 row in set (0.00 sec)



              字数见看当              。作工常正上端户客个这在够能程过储存认确以可就后
                           '5.0.x'


               The Sample "Database" 示例数据库
                                     示例数据库


              的骤步个这现实库据数认默为定设后然库据数的新个一建创是事件一第的做要在现
              SQL                          :下如句语
              CREATE DATABASE db5;
              USE db5;

              :如例
              mysql> CREATE DATABASE db5;
              Query OK, 1 row affected (0.00 sec)

              mysql> USE db5;
              Database changed

              。表作工的单简个一建创们我后然库据数的际实的据数要重有用使免避要里这在
                                SQL:下如句语 的骤步个这现实
              mysql> CREATE DATABASE db5;
              Query OK, 1 row affected (0.01 sec)

              mysql> USE db5;
              Database changed

              mysql> CREATE TABLE t (s1 INT);
              Query OK, 0 rows affected (0.01 sec)

              mysql> INSERT INTO t VALUES (5);
              Query OK, 1 row affected (0.00 sec)

                要需不并里这在为因,单简的表持保要我是因原的做样这。列一了入插中表在只我现发会你
              。了杂复够经已身本它为因,表据数的大用使要需不,程过储存授教是而,巧技的据数询查示展
Copyright 2005, MySQL AB                      页 第   6
信来请误错有如         chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢,       注关的业事
                                                          MySQL       息信些这留保时载转请
息信些这留保时载转请        注关的业事        MySQL    对您谢感时同,读阅和持支的您谢谢,                                   chenpengyi_007@163.com
                                                                                                      信来请误错有如
                                                页 第            7            Copyright 2005, MySQL AB
                          :况情的面下现出会将时用调在,了做
  样这果如,字名的数函建内                      MySQL
                   用使要不意注但,符字个 为制限度长其,符格空括包                          64
                              db5.p1
  以可它,开分以可名程过储存。” “如,法方中折的样这”名程过储存 名库据数“                                              .
        取采以可你 。)。吧持支会后以望希:话者译(持支不    是但,)持支                                 MySQL
  Oracle         DBMS
     (载重许允 些某。载重致导会将样这为因,字名的同相取程过储存个两给能不
  将你中库据数个一同在,字名个一同是’ ‘和’ ‘此因,感敏不写小大对名程过储存      p1         P1
                  题问的符识标法合:话外题
                  题问的符识标法合:话外题
                  题问的符识标法合:话外题
                  题问的符识标法合:话外题                                        Digression: Legal Identifiers
                     。 是字名的程过储存新面上,名程过是分部二第    p1
                        <--                CREATE PROCEDURE p1 () SELECT * FROM t; //
                          :”        CREATE PROCEDURE           “ 是分部一第的程过储存句语                 SQL
                        <--                CREATE PROCEDURE p1 () SELECT * FROM t; //
                                                                                    。碑程里的要重
个这下记中记日的你在好最,话的样这是如假。程过储存个一第的建创                                             Mysql   用使你是这许也
                                           CREATE PROCEDURE p1 () SELECT * FROM t; //
                                        CREATE PROCEDURE Example 创建程序实例
                                                                                 "DELIMITER ;//".
                                  :了以可就句语面
                                    ;
  下入输,符隔分为作)号分(” “用使复恢要后以果如。样一我跟择选好最你,解理易容
 更了为中程课个这在是但,择选来好喜的己自据根以可你。样这欢喜不我但,的号符” “                                                     @
           DB2                  |
 用使中序程 在过见曾我。 “线竖用人有也, “杠斜双过用曾我。符隔分为作串符字
              ”         ”                                //
  的中序程或句语的你在现出能可太不个一择选要需你此因号分个一要需都个一每以所,句
  语多许有中程过储存为因,题问少不生产会这,中程过储存在但,”;“号分用使都们我
  来以直一。号符串符字或符字的句语 个一入输成完经已你端户客 知通你是符隔分  SQL                                mysql
                                                                            mysql> DELIMITER //
                                                                                           :如例
                                                                                    DELIMITER //
                                               SQL
                                    :下如句语 的骤步个这现实,符隔分个一要需们我在现
                                                                   Pick a Delimiter 选择分隔符
                        始开表的列一含包只的 为字名个这从将们我,库据数例示是就这t
mysql> CALL pi();
              Error 1064 (42000): You have a syntax error.
              mysql> CALL pi ();
              Error 1305 (42000): PROCEDURE does not exist.

              上加后名数函的用调在须必你但,数函的 叫字名个一是的用调我,里子例个一第的面上在        pi
                                         。样那子例个二第像就,格空
              CREATE PROCEDURE p1 () SELECT * FROM t; //                   <--

                                         。”表列数参“是”)(“中其
               中子例。数参加添内号括在要需常通。表列数参是分部三第的句语
              CREATE PROCEDURE
              。的须必是这而然,号括空入键要需只我以所——的空是表列数参此因,数参有没程过储存的
              CREATE PROCEDURE p1 () SELECT * FROM t; //                   <--

              "SELECT * FROM t;"    。体主的程过储存是
              句语中体程过。句语 的般一是,体主的程过储存是它,了分部个一后最的句语了到后然                            SQL
              。号分个这写不以可时) (号符束结句语有面后果如,号分个一含包
              "SELECT * FROM t;"                                             //
              的用使家大是词个这) (为因,事好件是会将体主的序程做叫分部这把我得记还你果如                        body
              使以所。示演了为是只里这,中程过储存在用句语    将会不们我常通。语术的上术技
                                             SELECT
                            。作工常正否是序程出看的好更时用调在能,句语的样这用
       Why MySQL Statements are Legal in a Procedure Body
       什么MySQL语句在存储过程体中是合法的?
       什么     语句在存储过程体中是合法的?
              语句在存储过程体中是合法的

                      含包个一建创以可你?呢的法合是才中程过储存 在句语 的样么什
                     SQL       Mysql                                                   INSERT, UPDATE,
              中码代果如是的住记要需一唯你。句语的等等
              DELETE, SELECT, DROP, CREATE, REPLACE
              是都言语义定库据数何任:中句语 准标在。植移能不将码代么那,能功充扩
                 MySQL                             含包              SQL
                                               :如,的法合
              CREATE PROCEDURE p () DELETE FROM t; //

              SET   、COMMIT    及以   ROLLBACK :如,的法合是也
              CREATE PROCEDURE p () SET @x = 5; //

              MySQL     。法合将都句语的言语作操据数何任:能功加附的
              CREATE PROCEDURE p () DROP TABLE t; //

              MySQL     的接直:能功充扩         SELECT   :的法合是也
              CREATE PROCEDURE p () SELECT 'a'; //

              为称能功的句语 括包中程过储存将我,下一提便顺             DDL               MySQL   标 在是因原的能功加附       SQL
                   。件组选可即,的心核非为义定个这把中准



Copyright 2005, MySQL AB                     页 第  8
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                             MySQL 注关的业事         息信些这留保时载转请
息信些这留保时载转请      注关的业事  MySQL   对您谢感时同,读阅和持支的您谢谢,                          chenpengyi_007@163.com
                                                                                    信来请误错有如
                                       页 第  9             Copyright 2005, MySQL AB
                   。句子的用可多很有会将们我前件部杂复写在样那
   。句子的在存经已变改者或,句子条一加都次每,习练的列系一有就们我快很是但。单
  简当相这说己自对能你望希我。了楚清经已”法方程过用调和建创“点识知的要主,了好
                                                          "SELECT * FROM t;".
                                 :句语面下了行执你于当相就程过 用调你,以所         p1
                                                   mysql> SELECT * FROM t; //
                                                 :样一果效行执的句语面下和
                                                            mysql> CALL p1() //
                                                             式方现实他其
                                                             式方现实他其
                                                             式方现实他其
                                                             式方现实他其            2.
                                       "SELECT * FROM t;"   是句语的中程过为因
                                             Query OK, 0 rows affected (0.03 sec)
                                             1 row in set (0.03 sec)
                                             +------+
                                             |    5|
                                             +------+
                                             | s1 |
                                             +------+
                                             mysql> CALL p1() //
     t                    p1
容内的表 了回返幕屏是果结,时程过 的面里子例用调你当的须必是号括,调强次一再号括个
容内的表 了回返幕屏是果结,时程过 的面里子例用调你当的须必是号括,调强次一再号括个
容内的表 了回返幕屏是果结,时程过 的面里子例用调你当的须必是号括,调强次一再号括个
容内的表 了回返幕屏是果结,时程过 的面里子例用调你当的须必是号括,调强次一再号括个
             CALL
 一及以名程过你和 是就部全的入输要需所你,了程过储存个一用调以可就们我在现
 一及以名程过你和 是就部全的入输要需所你,了程过储存个一用调以可就们我在现
 一及以名程过你和 是就部全的入输要需所你,了程过储存个一用调以可就们我在现
 一及以名程过你和 是就部全的入输要需所你,了程过储存个一用调以可就们我在现                                         1.
                                        Call the Procedure 调用存储过程
                MySQL
                 。所场作工的程过是就库据数认默定假   为因,的法非是也
  "CREATE PROCEDURE db5.p1 () DROP DATABASE db5//"
  句语           似类是但,                                  "USE database"
  DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER.
             用使以可你过不
  CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION,
           MySQL 5.0
                  :的法非是中体程过在,句语的新全说来    对些这面下
                                  CREATE PROCEDURE p2 () DELETE FROM t; //
                                 CREATE PROCEDURE p1 ()
                                    :的法非是
 就子例的面下如例。句语作操库据数的作操表或程例对有能不是就,束约个一有中体程过在
Characteristics Clauses 特征子句


                1.

              CREATE PROCEDURE p2 ()
              LANGUAGE SQL                                      <--
              NOT DETERMINISTIC                                  <--
              SQL SECURITY DEFINER                                <--
              COMMENT 'A Procedure'                            <--
              SELECT CURRENT_DATE, RAND() FROM t //

              些这。前之体主,后之号括在容内句子。句子的性特程过储存映反能些一是的出给我里这
                                    ?呢用作么什有们他,的选可是都句子
               2.

              CREATE PROCEDURE p2 ()
              LANGUAGE SQL                                      <--
              NOT DETERMINISTIC
              SQL SECURITY DEFINER
              COMMENT 'A Procedure'
              SELECT CURRENT_DATE, RAND() FROM t //

              语 用使体主的程过面下明说了为是仅仅。的用作有没是句子
                           LANGUAGE SQL          个这,好很                                     SQL
              要需) 的 ( 些某为因,的用有是明声里这在你但,的认默统系是条这。写编言                     DBMS     IBM DB2
               言语他其的外 除现出会能可后今,外此。上用是还好最题问容兼的 注关你果如,它
                                DB2                                            SQL
                                             。 程过储存的持支
               3.

              CREATE PROCEDURE p2 ()
              LANGUAGE SQL
              NOT DETERMINISTIC                                  <--
              SQL SECURITY DEFINER
              COMMENT 'A Procedure'
              SELECT CURRENT_DATE, RAND() FROM t //

              那是就义定的程过定确个一里这。息信的统系给递传是,
                             NOT DETERMINISTIC   ,句子个一下
                回返那,句语   有含中体主然既,中例案个这在。序程的样一也出输样一入输次每些                  SELECT
               这意注会不序程化优的置内   是但。          其称们我此因的知未是定肯
                                         NOT DETERMINISTIC     MySQL
                                            。意注不在现在少至,个




Copyright 2005, MySQL AB                      页 第
                                              10
信来请误错有如         chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢,      MySQL 注关的业事        息信些这留保时载转请
4.

              CREATE PROCEDURE p2 ()
              LANGUAGE SQL
              NOT DETERMINISTIC
              SQL SECURITY DEFINER                                   <--
              COMMENT 'A Procedure'
              SELECT CURRENT_DATE, RAND() FROM t //

                       或           为义定以可,
                             SQL SECURITY        是句子个一下SQL SECURITY DEFINER     SQL SECURITY
                。子例的限权试测有会将面后在们我然当,了域领的制控限权了入进就这 。
               INVOKER

                  是项选个一另(限权的户用程过建创查检时用调在着味意
              SQL SECURITY DEFINER                                                      SQL
               SECURITY INVOKER           。)
              可就户用的程过建创查检器务服    诉告令指           用使,言而在现
                                SQL SECURITY DEFINER         MySQL
              )     (项选个一另而。了户用的程过用调行执查检不就,用调被经已程过当,了以                              INVOKER
                               。限权的者用调查检要然仍步一这在器务服诉告是则
               5.

              CREATE PROCEDURE p2 ()
              LANGUAGE SQL
              NOT DETERMINISTIC
              SQL SECURITY DEFINER
              COMMENT 'A Procedure'                               <--
              SELECT CURRENT_DATE, RAND() FROM t //

                               。明说释注的选可个一是
              COMMENT 'A procedure'

              固有没出指会中文在我,准标的定固有没个这。起一在储存义定程过跟会句子释注,后最
                          。少很中 的准标们我在些这是的运幸过不,句语的准标定      SQL


               6.

              CREATE PROCEDURE p2 ()
              LANGUAGE SQL
              NOT DETERMINISTIC
              SQL SECURITY DEFINER
              COMMENT ''
              SELECT CURRENT_DATE, RAND() FROM t //

              :的效等是句语面下跟程过面上
              CREATE PROCEDURE p2 ()
              SELECT CURRENT_DATE, RAND() FROM t //

              :于当相就了略省果如,值认默有也句子征特
              LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ''.




Copyright 2005, MySQL AB                     页 第
                                             11
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                          MySQL   注关的业事     息信些这留保时载转请
一些题外话


              :   用调
                  用调
                  用调
                  用调       果结的
                           果结的
                           果结的
                           果结的
                      p2()//
              mysql> call p2() //
              +--------------+-----------------+
              | CURRENT_DATE | RAND()                     |
              +--------------+-----------------+
              | 2004-11-09 | 0.7822275075896 |
              +--------------+-----------------+
              1 row in set (0.26 sec)
              Query OK, 0 rows affected (0.26 sec)

                  个一,时 程过用调当p2             SELECT   。数机随的得获望期们我回返行执被句语
              :        的变改会不
                       的变改会不
                       的变改会不
                       的变改会不 sql_mode

              mysql> set sql_mode='ansi' //
              mysql> create procedure p3()select'a'||'b'//
              mysql> set sql_mode=''//
              mysql> call p3()//
              +------------+
              | 'a' || 'b' |
              +------------+
              | ab           |
              +------------+

              是但串符字接连来线竖条两用使要需们我:如例。境环行运持保动自会时建创程过在
              MySQL
              然仍它,心担用不,   为改    将们我果如。法合才候时的 为
                         sql mode   ansi          在有只这              sql mode    non-ansi
                                   。作工常正能时用使次一第它要只,作工能
               Exercise 练习
              Question                              题问
                                                    题问
                                                    题问
                                                    题问
                        。求请些这理处能就案答的面后看不否能试试,话的下一习练意介不你果如
                ,里这了到学经已你然既,题问个这考思去间时秒 约大用。      示显,程过个一建创
                                     `Hello world`            5
                    :习复西东的过讲才刚些一择选机随再们我,候时的题问考思你当。单简很该应个这                                      DETERMINISTIC
              )表列数参(名程过    用使程过用调……句子的性特赖依入输和出输映反是句子)性定确(                             CALL
                                            。了到也间时猜我,了好。式方
              Answer                                案答
                                                    案答
                                                    案答
                                                    案答
                               句语           含包中体程过在是就案答,的好
                                                  "SELECT 'Hello, world'"




Copyright 2005, MySQL AB                      页 第    12
信来请误错有如         chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢,                 MySQL  注关的业事       息信些这留保时载转请
mysql> CREATE PROCEDURE p4 () SELECT 'Hello, world' //
              Query OK, 0 rows affected (0.00 sec)

              mysql> CALL p4()//
              +--------------+
              | Hello, world |
              +--------------+
              | Hello, world |
              +--------------+
              1 row in set (0.00 sec)
              Query OK, 0 rows affected (0.00 sec)


      Parameters 参数

              数参义定中程过储存在么怎究研的步一进更们我让
              1. CREATE PROCEDURE p5
                 () ...

              2. CREATE PROCEDURE p5
                 ([IN] name data-type) ...

              3. CREATE PROCEDURE p5
                 (OUT name data-type) ...

              4. CREATE PROCEDURE p5
                 (INOUT name data-type) ...

              列数参的中子例个一第的面上。中号括的后名程过储存在须必表列数参的过讲面前下一忆回
              。) ( 为数参认默为因,选可 词的里这。数参入输个一有中子例个二第,的空是表        IN                 IN   input
               。出输为作以可也入输为作能既,数参个一有中子例个四第,数参出输个一有中子例个三第




Copyright 2005, MySQL AB                     页 第 13
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                         MySQL   注关的业事   息信些这留保时载转请
IN example 输入的例子



              mysql> CREATE PROCEDURE p5(p INT) SET @x = p //
              Query OK, 0 rows affected (0.00 sec)
              mysql> CALL p5(12345)//
              Query OK, 0 rows affected (0.00 sec)
              mysql> SELECT @x//
              +-------+
              | @x      |
              +-------+
              | 12345 |
              +-------+
              1 row in set (0.00 sec)

              后然。值的 数参为定设 量变话会将我中体程过在。程过的数参入输有是的示演子例的 个这
                   IN                                                        x            p
               。入传 值数参将经已们我明证, 量变话会示显择选。 数参入传 将,程过用调
                             12345           p           @x                             12345


               OUT example 输出的例子


              mysql> CREATE PROCEDURE p6 (OUT p INT)
                  -> SET p = -5 //
              mysql> CALL p6(@y)//
              mysql> SELECT @y//
              +------+
              | @y |
              +------+
              | -5 |
              +------+

                   。中 量变话会入传值的 将中用调程过在后然,数参出输是 的次这。子例个一另是这
                                         p                              p                @y
              。的出传中程过从是值 诉告是 ,出看以可们我后用调在, 值赋数参给们我,中体程过在
                                             -5                        OUT       DBMS
                                  果效的样同到达来       句语用以可们我样同
                                     "SET @y = -5;".

               Compound Statements 复合语句


              :体程过下一析分细详的开展们我在现
              CREATE PROCEDURE p7 ()
              BEGIN
               SET @a = 5;
               SET @b = 5;
               INSERT INTO t VALUES (@a);
               SELECT s1 * @a FROM t WHERE s1 >= @b;
              END; //     /* I won't CALL this.   用调被会不将句语个这      */




Copyright 2005, MySQL AB                     页 第  14
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                          MySQL   注关的业事      息信些这留保时载转请
的中言语 和块句语        个这。块     是就造构的体程过成完
                                         BEGIN/END      BEGIN/END             Pascal      BEGIN/END
               子例个这在。句语条多装封去块用使以可们我。的似相很是架框的言语 和,的同相本基是
                                  C
              程过的你果如。句语 和 些一了成完后然,句语的量变话会定设条多了用使们我,中                   insert select
              这在,句语合复为称被也块      。了块      要需就你么那,句语条多有中体
                                               BEGIN/END          BEGIN/END
                                       。制控程流和义定量变行进以可你里
      The New SQL Statements 新SQL语句
                                 语句
               Variables 变量
              是令指的量变明声中句语合复在                  DECLARE 。
               (1) Example with two DECLARE statements     个两
                                                           个两
                                                           个两
                                                           个两     DECLARE   子例的句语
                                                                            子例的句语
                                                                            子例的句语
                                                                            子例的句语
               CREATE PROCEDURE p8 ()
              BEGIN
                DECLARE a INT;
                DECLARE b INT;
                SET a = 5;
                SET b = 5;
                INSERT INTO t VALUES (a);
                SELECT s1 * a FROM t WHERE s1 >= b;
              END; //      /* I won't CALL this */

                :注译(已而了义定内块      在是只你,义定的正真是不并量变的义定中程过在       BEGIN/END
                 在的楚清须必你 符饰修用使能不,样一不量变话会和量变些这意注 。)参形是就也                        @
                 变话会用使能何任在能就你,明声旦一量变 。型类的们它和量变明声中块
              BEGIN/END
                                          。用使方地的名列、字文、量
              子例的句语定设和句子认默有没
              子例的句语定设和句子认默有没
              子例的句语定设和句子认默有没
              子例的句语定设和句子认默有没
              (2) Example with no DEFAULT clause and SET statement

               CREATE PROCEDURE p9 ()
              BEGIN
                DECLARE a INT /* there is no DEFAULT clause */;
                DECLARE b INT /* there is no DEFAULT clause */;
                SET a = 5;   /* there is a SET statement */
                SET b = 5;   /* there is a SET statement */
                INSERT INTO t VALUES (a);
                SELECT s1 * a FROM t WHERE s1 >= b;
              END; //      /* I won't CALL this */

              为值始初的量变么那,句子的认默有没果如。法方的量变化始初多很有                                      NULL何任在以可你。
                        SET    。值赋量变给句语 用使候时




Copyright 2005, MySQL AB                      页 第15
信来请误错有如         chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢,             MySQL注关的业事         息信些这留保时载转请
(3) Example with DEFAULT clause        有含
                                                     有含
                                                     有含
                                                     有含     子例的句子
                                                            子例的句子
                                                            子例的句子
                                                            子例的句子
                                                      DEFAULT

               CREATE PROCEDURE p10 ()
              BEGIN
                DECLARE a, b INT DEFAULT 5;
                INSERT INTO t VALUES (a);
                SELECT s1 * a FROM t WHERE s1 >= b;
              END; //

              了用使里这在。的样一是还果结是但,变改些一了做里这在们我                               DEFAULT   初定设来句子
                 。了开分现实的句语 和     把要需不就这,值始
                                     DECLARE    SET

                           子例的用调
                           子例的用调
                           子例的用调
                           子例的用调
              (4) Example of CALL
                mysql> CALL p10() //
              +--------+
              | s1 * a |
              +--------+
              |      25 |
              |      25 |
              +--------+
              2 rows in set (0.00 sec)
              Query OK, 0 rows affected (0.00 sec)

              作工常正能程过了示显果结
                   域用作
                   域用作
                   域用作
                   域用作
              (5) Scope

              CREATE PROCEDURE p11 ()
              BEGIN
               DECLARE x1 CHAR(5) DEFAULT 'outer';
               BEGIN
                DECLARE x1 CHAR(5) DEFAULT 'inner';
                SELECT x1;
                END;
               SELECT x1;
               END; //

               同。的法合是这然当,块       的套嵌有中子例。题问的域用作下一论讨来们我在现        BEGIN/END
               优的高更有享内域用作其在量变的部内。的法合是也样这, 是都字名,量变个两含包时
                                          x1
              因,了见可再不量变,外域用作其在经已时此,失消量变部内,时句语 到行执当。权先
                                END
               派指值其将者或数参TUO过通以可你是但,量变的了明声个这到找能不也再外程过储存在此
                                              值其存保来量变话会给




Copyright 2005, MySQL AB                      页 第16
信来请误错有如         chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢,              注关的业事
                                                                 MySQL             息信些这留保时载转请
:程过的子例域用作用调
              mysql> CALL p11()//
              +-------+
              | x1      |
              +-------+
              | inner |
              +-------+
              +-------+
              | x1      |
              +-------+
              | outer |
              +-------+

              个一第时果结的到看们我                 SELECT   量变的层二第到索检个二第,量变的层内最到索检句语
               Conditions and IF-THEN-ELSE 条件式和
                                           条件式和IF-THEN-ELSE


              1.   :子例的式件条含包些一写以可们我在现
                   :子例的式件条含包些一写以可们我在现
                   :子例的式件条含包些一写以可们我在现
                   :子例的式件条含包些一写以可们我在现
              CREATE PROCEDURE p12 (IN parameter1 INT)
              BEGIN
               DECLARE variable1 INT;
               SET variable1 = parameter1 + 1;
               IF variable1 = 0 THEN
                 INSERT INTO t VALUES (17);
               END IF;
               IF parameter1 = 0 THEN
                 UPDATE t SET s1 = s1 + 1;
               ELSE
                 UPDATE t SET s1 = s1 + 2;
               END IF;
              END; //

                是个一另,    句语 是个一,句语 个两有面里。程过的句语 含包个一是里这
                                IF                           IF              IF   END IF        IF
              更能你让单简其使量尽会我但,程过的杂复用使里这在以可们我。
                     ELSE            END IF    句语   句语
                                                。楚清弄易容
              2.

              CALL p12 (0) //

              样这, 为值入传,程过个这用调们我               0         parameter1   。 为将值的
                                                                         0




Copyright 2005, MySQL AB                       页 第 17
信来请误错有如         chenpengyi_007@163.com 对您谢感时同,读阅和持支的您谢谢,                MySQL 注关的业事        息信些这留保时载转请
3.

              CREATE PROCEDURE p12 (IN parameter1 INT)
              BEGIN
               DECLARE variable1 INT;
               SET variable1 = parameter1 + 1;                            <--
               IF variable1 = 0 THEN
                 INSERT INTO t VALUES (17);
               END IF;
               IF parameter1 = 0 THEN
                 UPDATE t SET s1 = s1 + 1;
               ELSE
                 UPDATE t SET s1 = s1 + 2;
               END IF;
              END; //

              量变里这      variable1   为值赋被     parameter1   量变后行执以所,值的 加
                                                           1                           variable1   。为
                                                                                                   1

              4.

              CREATE PROCEDURE p12 (IN parameter1 INT)
              BEGIN
               DECLARE variable1 INT;
               SET variable1 = parameter1 + 1;
               IF variable1 = 0 THEN                                      <--
                 INSERT INTO t VALUES (17);
               END IF;
               IF parameter1 = 0 THEN
                 UPDATE t SET s1 = s1 + 1;
               ELSE
                 UPDATE t SET s1 = s1 + 2;
               END IF;
              END; //

              量变为因      variable1   件条此因, 为值
                                         1          "if variable1 = 0"   …… ,假为  IF    END IF  。行执被有没,过跳被
              5.
              CREATE PROCEDURE p12 (IN parameter1 INT)
              BEGIN
                 DECLARE variable1 INT;
                 SET variable1 = parameter1 + 1;
                 IF variable1 = 0 THEN
                   INSERT INTO t VALUES (17);
                 END IF;
                 IF parameter1 = 0 THEN                                    <--
                   UPDATE t SET s1 = s1 + 1;
                 ELSE
                   UPDATE t SET s1 = s1 + 2;
                 END IF;
              END; //




Copyright 2005, MySQL AB                     页 第    18
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                                     MySQL      注关的业事         息信些这留保时载转请
了行执被句语间中是于,真为果结断判,件条 个二第到
                        IF

              6.

              CREATE PROCEDURE p12 (IN parameter1 INT)
              BEGIN
               DECLARE variable1 INT;
               SET variable1 = parameter1 + 1;
               IF variable1 = 0 THEN
                 INSERT INTO t VALUES (17);
               END IF;
               IF parameter1 = 0 THEN
                 UPDATE t SET s1 = s1 + 1;                 <--
               ELSE
                 UPDATE t SET s1 = s1 + 2;
               END IF;
              END; //

              条一下则, 为值     果如。行执被句语
                        parameter1      , 于等值
                                         0        数参为因
                                             UPDATE          parameter1   NULL
              行两, 用调们我果如以所, 值含包都们他,行两有中 表在现 行执被将句语
              UPDATE                         t              5                    p12
                             6                 。 成变会值的
              7.

              mysql> CALL p12(0)//
              Query OK, 2 rows affected (0.28 sec)

              mysql> SELECT * FROM t//
              +------+
              | s1 |
              +------+
              |    6|
              |    6|
              +------+
              2 rows in set (0.01 sec)

              。样那的望期所们我是也果结
               CASE 指令
              1.
              CREATE PROCEDURE p13 (IN parameter1 INT)
              BEGIN
                 DECLARE variable1 INT;
                 SET variable1 = parameter1 + 1;
                 CASE variable1
                  WHEN 0 THEN INSERT INTO t VALUES (17);
                  WHEN 1 THEN INSERT INTO t VALUES (18);
                  ELSE INSERT INTO t VALUES (19);
                 END CASE;
              END; //




Copyright 2005, MySQL AB                     页 第 19
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                     MySQL 注关的业事      息信些这留保时载转请
用使以可们我断判的假真件条多更行进要需果如                           CASE   。句语     CASE   。单简样一 和用使句语
                                                                                         IF
                       :子例的面上考参以可们我
               2.

              mysql> CALL p13(1)//
              Query OK, 1 row affected (0.00 sec)

              mysql> SELECT * FROM t//
              +------+
              | s1 |
              +------+
              |    6|
              |    6|
              | 19 |
              +------+
              3 rows in set (0.00 sec)

                        。中 表到入插被 值,子例面上如, 值入传,后程过行执
                                     1                   19      t

              Question                       题问
                                             题问
                                             题问
                                             题问
                                ?么什是用作的
                     : CALL p13(NULL) //         题问
                             CALL?作动些那了做句语 个这:个一另
              。出做内秒 在,断判码代据根以可也,么什了做     察观后行执过通以可你
                                    SELECT                                          5

              Answer                          案答
                                              案答
                                              案答
                                              案答
               mysql> CALL p13(NULL)//
              Query OK, 1 row affected (0.00 sec)

              mysql> SELECT * FROM t//
              +------+
              | s1 |
              +------+
              |    6|
              |    6|
              | 19 |
              | 19 |
              +------+
              4 rows in set (0.00 sec)

              值的    量变是因原。录记的 值数含包条一另了入插
                             p13           ,时 用调你当是案答
                                         MySQL                       19                  variable1
              ,来出不答回你果如。义意有家大对这望希。了行执被就分部 的句语 , 为
                    NULL CASE            ELSE
                                       。走下向续继以可们我,题问有没




Copyright 2005, MySQL AB                     页 第    20
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                               MySQL注关的业事         息信些这留保时载转请
Loops 循环语句

              WHILE ... END WHILE
              LOOP ... END LOOP
              REPEAT ... END REPEAT
              GOTO

              及以环循 ,环循     :式方环循的准标种三有们我。环循些一建创会将们我面下                          WHILE          LOOP
              使就了用,吧用要不好最:语者译(
               REPEAT            :式方环循的准标非种一有还。环循               GO TO
                                               。)乱混程流
               WHILE ... END WHILE

              CREATE PROCEDURE p14 ()
              BEGIN
               DECLARE v INT;
               SET v = 0;
               WHILE v < 5 DO
                INSERT INTO t VALUES (v);
                SET v = v + 1;
               END WHILE;
              END; //

              。法语的新多很握掌要需不此因,似相句语 跟它,式方种这欢喜很我。式方的环循
                 WHILE                               是这               IF
               。出退会将环循候时的 于大 量变当,间之
                   INSERT SET           和   在句语 和
                                            WHILE   的里这  END WHILE                    v   5
               而, 为值量变认默,化始初有没果如,误错的见常个一止防了为使句语
                 "SET v = 0;"                        用使                                              NULL
              NULL                      。 为都果结作操值何任和
                                             NULL

              WHILE ... END WHILE example

               mysql> CALL p14()//
              Query OK, 1 row affected (0.00 sec)

              果结的 程过用调是就上以        p14

                 是回返统系注关用不           "one row affected"   是还   "five rows affected"   后最对只数计的里这为因,
              。数计行进作动   个一
                   INSERT




Copyright 2005, MySQL AB                     页 第    21
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                                     MySQL注关的业事          息信些这留保时载转请
WHILE ... END WHILE example: CALL

              mysql> select * from t; //
              +------+
              | s1 |
              +------+
              ....
              |    0|
              |    1|
              |    2|
              |    3|
              |    4|
              +------+
              9 rows in set (0.00 sec)

              。行 了入插中库据数向序程到看以可后用调                5


               REPEAT ... END REPEAT

               CREATE PROCEDURE p15 ()
              BEGIN
                DECLARE v INT;
                SET v = 0;
                REPEAT
                 INSERT INTO t VALUES (v);
                 SET v = v + 1;
                 UNTIL v >= 5
                END REPEAT;
              END; //

              ,果结查检后行执在它于在别区。样一环循
                      REPEAT        面前和能功,子例的环循     个一是这
                                                      WHILE
                 WHILE    )吧     于同等能可:语者译(。查检前行执是则    而      DO WHILE


               REPEAT ... END REPEAT: look at the UNTIL: UNTIL的作用
                                                       :      的作用


               CREATE PROCEDURE p15 ()
              BEGIN
                DECLARE v INT;
                SET v = 0;
                REPEAT
                 INSERT INTO t VALUES (v);
                 SET v = v + 1;
                 UNTIL v >= 5                                    <--
                END REPEAT;
              END; //

              到意注     UNTIL  。好更号分的外额上加你然当,号分写不以可里这在,号分有没面后句语




Copyright 2005, MySQL AB                     页 第
                                             22
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                          MySQL  注关的业事   息信些这留保时载转请
REPEAT ... END REPEAT: calling :调用


              mysql> CALL p15()//
              Query OK, 1 row affected (0.00 sec)

              mysql> SELECT COUNT(*) FROM t//
              +----------+
              | COUNT(*) |
              +----------+
              |       14 |
              +----------+
              1 row in set (0.00 sec)

              录记行 了入插又后程过 用调到看以可们我   p15                 5


               LOOP ... END LOOP

               CREATE PROCEDURE p16 ()
              BEGIN
                DECLARE v INT;
                SET v = 0;
                loop_label: LOOP
                  INSERT INTO t VALUES (v);
                  SET v = v + 1;
                  IF v >= 5 THEN
                    LEAVE loop_label;
                  END IF;
                END LOOP;
              END; //

              是上以    LOOP   和点这,件条始初要需不环循 。子例的环循
                                           LOOP                              WHILE   它时同,似相环循
               和又  REPEAT           。件条束结要需不也样一环循
               LOOP ... END LOOP: with IF and LEAVE 包含 和LEAVE的LOOP循环
                                                    包含IF和    的    循环


              CREATE PROCEDURE p16 ()
              BEGIN
               DECLARE v INT;
               SET v = 0;
               loop_label: LOOP
                 INSERT INTO t VALUES (v);
                 SET v = v + 1;
                 IF v >= 5 THEN                                      <--
                   LEAVE loop_label;
                 END IF;
               END LOOP;
              END; //

              循开离是义意的句语   里这。句语 IF 含包中句语 在,句语 入加部内环循在
                                           IF                LEAVE         LEAVE
              一进面后在会我题问号标的句语环循于关,号标句语环循加
                   LEAVE               LEAVE是法语的   。环
                                                 。解讲步



Copyright 2005, MySQL AB                       页 第  23
信来请误错有如         chenpengyi_007@163.com 对您谢感时同,读阅和持支的您谢谢,             MySQL 注关的业事       息信些这留保时载转请
LOOP ... END LOOP: calling :调用
               mysql> CALL p16()//
              Query OK, 1 row affected (0.00 sec)

              mysql> SELECT COUNT(*) FROM t//
              +----------+
              | COUNT(*) |
              +----------+
              |       19 |
              +----------+
              1 row in set (0.00 sec)

              。中 表入插被行 另是果结,后 程过用调
                        p16              5               t

               Labels 标号
              CREATE PROCEDURE p17 ()
              label_1: BEGIN
                label_2: WHILE 0 = 1 DO LEAVE label_2; END
              WHILE;
                label_3: REPEAT LEAVE label_3; UNTIL 0 =0
              END REPEAT;
                label_4: LOOP LEAVE label_4; END LOOP;
              END; //

               我。子例的程过的号标句语个 含包个一有里这在现。号标句语了用使我中子例环循个一后最                    4
               的法合在能只号标句语,号标句语用使前句语 者或
                        BEGIN               、
                                  WHILE REPEAT  、   在以可们     LOOP
              。句语合复或句语的 为义定名号标句语开离着味意          此因。用使面前句语
                                   "LEAVE label_3"                              label_3

               End Labels 标号结束符


               CREATE PROCEDURE p18 ()
              label_1: BEGIN
                label_2: WHILE 0 = 1 DO LEAVE label_2; END
              WHILE label_2;
                label_3: REPEAT LEAVE label_3; UNTIL 0 =0
              END REPEAT label_3 ;
                label_4: LOOP LEAVE label_4; END LOOP
              label_4 ;
              END label_1 ; //

              。用有分十是不并符束结号标些这。样一用使时头开在和,号标句语用使时束结句语在以可也你
              ,惯习程编的好良有了为然当样一字名号标的义定始开和须必们他,要需你果如。的选可是们它
                                     。符束结号标用使是还好最,读阅人他便方




Copyright 2005, MySQL AB                     页 第    24
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                                  注关的业事
                                                                    MySQL                 息信些这留保时载转请
LEAVE and Labels 跳出和标号


               CREATE PROCEDURE p19 (parameter1 CHAR)
              label_1: BEGIN
                label_2: BEGIN
                  label_3: BEGIN
                    IF parameter1 IS NOT NULL THEN
                      IF parameter1 = 'a' THEN
                        LEAVE label_1;
                      ELSE BEGIN
                        IF parameter1 = 'b' THEN
                          LEAVE label_2;
                        ELSE
                          LEAVE label_3;
                          END IF;
                        END;
                      END IF;
                    END IF;
                  END;
                END;
              END;//

              LEAVE    。句语合复的杂复出跳序程使句语
     ITERATE       代迭
                   代迭
                   代迭
                   代迭
              是标目果如        ITERATE   到用须必就,话的句语)代迭(     LEAVE   句语
              CREATE PROCEDURE p20 ()
              BEGIN
               DECLARE v INT;
               SET v = 0;
               loop_label: LOOP
                 IF v = 3 THEN
                   SET v = v + 1;
                   ITERATE loop_label;
                   END IF;
                 INSERT INTO t VALUES (v);
                 SET v = v + 1;
                 IF v >= 5 THEN
                   LEAVE loop_label;
                   END IF;
                 END LOOP;
              END; //

               中言语 像点有它 ,用引环循的部内环循在是也样一句语
              ITERATE                        和句语)代迭(
                                         LEAVE                                 C
              思意)代迭(     ,号标句语合复用引,中句语合复在现出以可它样同,”
                  Continue                            “的             ITERATE
                                              。句语合复始开新重是
                            :环循的程过代迭要需个是这,环循个这面下察观并动启们我那




Copyright 2005, MySQL AB                     页 第 25
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                   MySQL  注关的业事   息信些这留保时载转请
ITERATE: Walking through the loop    环循入深
                                                   环循入深
                                                   环循入深
                                                   环循入深
              CREATE PROCEDURE p20 ()
              BEGIN
               DECLARE v INT;
               SET v = 0;
               loop_label: LOOP                           <--
                 IF v = 3 THEN
                   SET v = v + 1;
                   ITERATE loop_label;
                   END IF;
                 INSERT INTO t VALUES (v);
                 SET v = v + 1;
                 IF v >= 5 THEN
                   LEAVE loop_label;
                   END IF;
                 END LOOP;
              END; //

              。来起行运环循的号标了义定经已个这让
              ITERATE: Walking through the loop

              CREATE PROCEDURE p20 ()
              BEGIN
               DECLARE v INT;
               SET v = 0;
               loop_label: LOOP
                 IF v = 3 THEN                            <--
                   SET v = v + 1;
                   ITERATE loop_label;
                   END IF;
                 INSERT INTO t VALUES (v);
                 SET v = v + 1;
                 IF v >= 5 THEN
                   LEAVE loop_label;
                   END IF;
                 END LOOP;
              END; //

              v   。 到加增它把们我后然, 成变值的
                         3                4


              ITERATE: walking through the loop

              CREATE PROCEDURE p20 ()
              BEGIN
               DECLARE v INT;
               SET v = 0;
               loop_label: LOOP
                 IF v = 3 THEN
                   SET v = v + 1;
                   ITERATE loop_label;                    <--
                   END IF;
                 INSERT INTO t VALUES (v);
                 SET v = v + 1;
                 IF v >= 5 THEN
Copyright 2005, MySQL AB                     页 第
                                              26
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                    MySQL 注关的业事   息信些这留保时载转请
LEAVE loop_label;
                  END IF;
                END LOOP;
              END; //

              始开后然      ITERATE    。程过)代迭(
              ITERATE: walking through the loop

              CREATE PROCEDURE p20 ()
              BEGIN
               DECLARE v INT;
               SET v = 0;
               loop_label: LOOP                          <--
                 IF v = 3 THEN
                   SET v = v + 1;
                   ITERATE loop_label;
                   END IF;
                 INSERT INTO t VALUES (v);
                 SET v = v + 1;
                 IF v >= 5 THEN
                   LEAVE loop_label;
                   END IF;
                 END LOOP;
              END; //

              的里这     ITERATE   。部头的环循了到回又环循让)代迭(
              ITERATE: walking through the loop

              CREATE PROCEDURE p20 ()
              BEGIN
               DECLARE v INT;
               SET v = 0;
               loop_label: LOOP
                 IF v = 3 THEN
                   SET v = v + 1;
                   ITERATE loop_label;
                   END IF;
                 INSERT INTO t VALUES (v);
                 SET v = v + 1;
                 IF v >= 5 THEN
                   LEAVE loop_label;                     <--
                   END IF;
                 END LOOP;
              END; //

              行执将序程,时 为变值的 当
                 v          5            LEAVE    句语
              ITERATE: walking through the loop

              CREATE PROCEDURE p20 ()
              BEGIN
               DECLARE v INT;
               SET v = 0;
               loop_label: LOOP
                 IF v = 3 THEN
                   SET v = v + 1;
Copyright 2005, MySQL AB                     页 第
                                             27
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                   MySQL 注关的业事   息信些这留保时载转请
ITERATE loop_label;
                  END IF;
                INSERT INTO t VALUES (v);
                SET v = v + 1;
                IF v >= 5 THEN
                  LEAVE loop_label;
                  END IF;
                END LOOP;
              END; //                                                <--

               LEAVE   。步一后最的句语合复达到令指行运使,环循出跳是就果结的
               GOTO

              CREATE PROCEDURE p...
              BEGIN
              ...
              LABEL label_name;
              ...
              GOTO label_name;
              ...
              END;

              号标立建里这在且而,句语 准标是不这然虽。句语 用使以可中程过储存的
              MySQL                            GOTO                         SQL
              我以所,汰淘被慢慢会句语个这,容兼 他其和了为于由。样一不的中例惯和也法方的          DBMS
                   MySQL             。及提有没中册手考参   在们
              Grand combination         合组大
                                        合组大
                                        合组大
                                        合组大
              CREATE PROCEDURE p21
              (IN parameter_1 INT, OUT parameter_2 INT)
              LANGUAGE SQL DETERMINISTIC SQL SECURITY INVOKER
              BEGIN
                DECLARE v INT;
                label goto_label; start_label: LOOP
                  IF v = v THEN LEAVE start_label;
                  ELSE ITERATE start_label;
                  END IF;
                END LOOP start_label;
                REPEAT
                  WHILE 1 = 0 DO BEGIN END;
                  END WHILE;
                  UNTIL v = v END REPEAT;
                GOTO goto_label;
              END;//

               块     ,数参性特,表列数参括包,法语有所的讲前之们我了含包句语的中子例面上                                    BEGIN/END
               是这。 ,      ,   ,    , ,   IF, ,明声量变,句语合复
                                              WHILE    LOOP   REPEAT       LEAVE   ITERATE GOTO
              。法合分十却法语的面里是但。环循的尽无有面里为因,它行运会不我,程过储存的谬荒个一
                       。西东的新多更触接要将们我面下。句语明声量变和制控程流的新是些这




Copyright 2005, MySQL AB                     页 第  28
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                               MySQL   注关的业事       息信些这留保时载转请
Error Handling 异常处理
                              异常处理

                    要摘息信的页几面后
                 例样题问
                Sample Problem
                   器理处常异
                Handlers
                      件条
                Conditions

              理处常异是的讲要在现们我,了好
                            录记障故:例样题问
                            录记障故:例样题问
                            录记障故:例样题问
                            录记障故:例样题问
              1. Sample Problem: Log Of Failures

               很是例样题问的理处错出示展来用们我中件文志日在录记其将能望希我,时败失
                 INSERT                              当
               的误错些这下记中件文个一另在想我,时败失   当。录记的误错到得望希我。的通普INSERT
              束约的联关键外反违将它是因原的趣兴感别特入插对我。等因原错出,间时错出如例,息信
              2. Sample Problem: Log Of Failures (2)

                mysql> CREATE TABLE t2
                     s1 INT, PRIMARY KEY (s1))
                     engine=innodb;//
              mysql> CREATE TABLE t3 (s1 INT, KEY (s1),
                     FOREIGN KEY (s1) REFERENCES t2 (s1))
                     engine=innodb;//
              mysql> INSERT INTO t3 VALUES (5);//
              ...
              ERROR 1216 (23000): Cannot add or update a child row: a foreign key
              constraint fails   )息信错出的统系是的示显里这(
              打是查检联关键外此因,   是的用使们我。表键外个一及以,表键主个一建创要始开我                    InnoDB
              很以可下件条种这然当。败失会将作动,时值的中表键主非入插中表键外向我当后然。的开
                             1216            。 号误错到找快
              3. Sample Problem: Log Of Failures

               CREATE TABLE error_log (error_message
              CHAR(80))//

              。表的误错储存时错出作动入插做在个一立建是就步一下
              4. Sample Problem: Log Of Errors

               CREATE PROCEDURE p22 (parameter1 INT)
              BEGIN
                DECLARE EXIT HANDLER FOR 1216
                  INSERT INTO error_log VALUES
                  (CONCAT('Time: ',current_date,
                   '. Foreign Key Reference Failure For
              Value = ',parameter1));
                INSERT INTO t3 VALUES (parameter1);
              END;//

              意。的常异理处来用是           句语个一第的里这。序程的们我是就面上    DECLARE EXIT HANDLER
              功成作动当是思意 。行一入插中表录记误错在会将序程个这,了生发 误错果如是思
                             1215                                            EXIT
                                         。句语合复个这出退后交提

Copyright 2005, MySQL AB                     页 第 29
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                               MySQL 注关的业事    息信些这留保时载转请
5. Sample Problem: Log Of Errors

               CALL p22 (5) //

              息信误错有没是但。现出中表键主在有没并值 为因,常正很这,败失会程过储存个这用调     5
              录记中表    是但,西东何任加增有没中表 。了中程过在含包经已理处错出为因回返  t3                            error_log
                          。败失作动          们我诉告就这,息信些一了下
                                              INSERT into table t3


               DECLARE HANDLER syntax 声明异常处理的语法
                                      声明异常处理的语法
                                        异常


              DECLARE
              { EXIT | CONTINUE }
              HANDLER FOR
              { error-number | { SQLSTATE error-string } | condition }
              SQL statement

              ,器理处种两许允   。码代的发触动自后错出序程当段一是就也,法用的理处误错是就面上                             MySQL
               ,理处     ,的示演要将们我是就种一另。种这是就的用所才刚们我,理处 是种一
                     EXIT                                                               CONTINUE
               出有没就句语合复个这么那,行运续继然仍序程主原,后行执它于在同不,似类理处 跟它
                   EXIT
                                                     。了口
                         子例理处
                         子例理处
                         子例理处
                         子例理处
              1. DECLARE CONTINUE HANDLER example CONTINUE

              CREATE TABLE t4 (s1 int,primary key(s1));//
              CREATE PROCEDURE p23 ()
              BEGIN
               DECLARE CONTINUE HANDLER
               FOR SQLSTATE '23000' SET @x2 = 1;
               SET @x = 1;
               INSERT INTO t4 VALUES (1);
               SET @x = 2;
               INSERT INTO t4 VALUES (1);
               SET @x = 3;
               END;//

               的上册手考参
                   MySQL是这                CONTINUE     。里这到贝拷它把我以所,好分十子例个这,子例的理处
              出看以可们我子例个这过通                 CONTINUE                   。的作工何如是理处
              2. DECLARE CONTINUE HANDLER                          理处常异
                                                                   理处常异
                                                                   理处常异
                                                                   理处常异
                                                               CONTINUE      明声
                                                                             明声
                                                                             明声
                                                                             明声
               CREATE TABLE t4 (s1 int,primary key(s1));//
              CREATE PROCEDURE p23 ()
              BEGIN
               DECLARE CONTINUE HANDLER
               FOR SQLSTATE '23000' SET @x2 = 1;                             <--
               SET @x = 1;
               INSERT INTO t4 VALUES (1);
               SET @x = 2;
               INSERT INTO t4 VALUES (1);
               SET @x = 3;
               END;//

               为将我次这       SQLSTATE      ?吗 码代误错    的用使们我面前得记还。序程理处个一义定值           MySQL          1216
              的里这上实事         23000SQLSTATE。了用调被就错出束约键主或错出束约键外当,的用常更是

Copyright 2005, MySQL AB                     页 第  30
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                                       注关的业事
                                                                         MySQL             息信些这留保时载转请
3. DECLARE CONTINUE HANDLER

               CREATE TABLE t4 (s1 int,primary key(s1));//
              CREATE PROCEDURE p23 ()
              BEGIN
               DECLARE CONTINUE HANDLER
               FOR SQLSTATE '23000' SET @x2 = 1;
               SET @x = 1;                                              <--
               INSERT INTO t4 VALUES (1);
               SET @x = 2;
               INSERT INTO t4 VALUES (1);
               SET @x = 3;
               END;//

              是句语的行执个一第的程过储存个这                       "SET @x = 1"   。
               4. DECLARE CONTINUE HANDLER example

               CREATE TABLE t4 (s1 int,primary key(s1));//
              CREATE PROCEDURE p23 ()
              BEGIN
               DECLARE CONTINUE HANDLER
               FOR SQLSTATE '23000' SET @x2 = 1;
               SET @x = 1;
               INSERT INTO t4 VALUES (1);
               SET @x = 2;
               INSERT INTO t4 VALUES (1);                                     <--
               SET @x = 3;
               END;//

              。中表键主到入插被 值后行运
                        1

              5. DECLARE CONTINUE HANDLER

              CREATE TABLE t4 (s1 int,primary key(s1));//
              CREATE PROCEDURE p23 ()
              BEGIN
               DECLARE CONTINUE HANDLER
               FOR SQLSTATE '23000' SET @x2 = 1;
               SET @x = 1;
               INSERT INTO t4 VALUES (1);
               SET @x = 2;                                              <--
               INSERT INTO t4 VALUES (1);
               SET @x = 3;
               END;//

              。 为变值的 后然
                   @x            2

              6. DECLARE CONTINUE HANDLER example

               CREATE TABLE t4 (s1 int,primary key(s1));//
              CREATE PROCEDURE p23 ()
              BEGIN
               DECLARE CONTINUE HANDLER
               FOR SQLSTATE '23000' SET @x2 = 1;
               SET @x = 1;
Copyright 2005, MySQL AB                     页 第31
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                                  MySQL   注关的业事   息信些这留保时载转请
INSERT INTO t4 VALUES (1);
               SET @x = 2;
               INSERT INTO t4 VALUES (1);                              <--
               SET @x = 3;
               END;//

              。制限性一唯有键主为因,了败失但,值数入插中表键主往次再试尝序程后然
              7. DECLARE CONTINUE HANDLER example

               CREATE TABLE t4 (s1 int,primary key(s1));//
              CREATE PROCEDURE p23 ()
              BEGIN
               DECLARE CONTINUE HANDLER
               FOR SQLSTATE '23000' SET @x2 = 1;                        <--
               SET @x = 1;
               INSERT INTO t4 VALUES (1);
               SET @x = 2;
               INSERT INTO t4 VALUES (1);
               SET @x = 3;
               END;//

              语的理处误错是句语的行执个一下。理处误错行进始开,发触被序程理处误错,败失入插于由
                   @x2          2              。 为设被 ,句
              8. DECLARE CONTINUE HANDLER example

               CREATE TABLE t4 (s1 int,primary key(s1));//
              CREATE PROCEDURE p23 ()
              BEGIN
               DECLARE CONTINUE HANDLER
               FOR SQLSTATE '23000' SET @x2 = 1;
               SET @x = 1;
               INSERT INTO t4 VALUES (1);
               SET @x = 2;
               INSERT INTO t4 VALUES (1);
               SET @x = 3;                                       <--
               END;//

              是这为因,束结有没并里这到                  CONTINUE   ,后之句语入插的败失到回返行执以所。理处常异
              。作动 为定设 将行执续继@x            3

              9. DECLARE CONTINUE HANDLER example

                mysql> CALL p23()//
              Query OK, 0 rows affected (0.00 sec)
              mysql> SELECT @x, @x2//
              +------+------+
              | @x | @x2 |
              +------+------+
              |3     |1     |
              +------+------+
              1 row in set (0.00 sec)

              以可里这从 。 为,值的 察观 , 是道知以可的定确很,值的 察观们我后程过行运
                                     @x                      3          @x2      1
              让,器理处误错整调去间时点花以可家大。行进路思的们我照按全完,误无行运序程断判
              ,乱紊很序程来起看样那然虽,方地的误错 现出能可在放是不而,部首的段句语在放查检
                               。楚清很也全安很码代的样这是但。觉感的去跳来跳
Copyright 2005, MySQL AB                     页 第 32
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                           MySQL   注关的业事       息信些这留保时载转请
1. DECLARE CONDITION

               CREATE PROCEDURE p24 ()
              BEGIN
                DECLARE `Constraint Violation`
                 CONDITION FOR SQLSTATE '23000';
                DECLARE EXIT HANDLER FOR
                 `Constraint Violation` ROLLBACK;
                START TRANSACTION;
                INSERT INTO t2 VALUES (1);
                INSERT INTO t2 VALUES (1);
                COMMIT;
                END; //

               误错者或     给可你上实事。的改修上础基的面前在,子例的理处误错个一外另是这                     SQLSTATE
               我:的现实么怎是它看看面下。了字名的义定己自用使中理处在以可就你,字名的他其码代
                   t2, 滚回(
                      )        会都作操入插的表个这对以所,表
                             InnoDB              为义定 表把      ROLLBACK           ROLLBACK
              误错        致导会值的样同个两入插键主对为因。的生发会好恰是也)务事滚回(                    SQLSTATE 23000
                                     。误错束约是
                           SQLSTATE 23000         里这,生发
              2. DECLARE CONDITION     件条明声
                                       件条明声
                                       件条明声
                                       件条明声
              CREATE PROCEDURE p24 ()
              BEGIN
               DECLARE `Constraint Violation`
                CONDITION FOR SQLSTATE '23000';
               DECLARE EXIT HANDLER FOR
                `Constraint Violation` ROLLBACK;
               START TRANSACTION;
               INSERT INTO t2 VALUES (1);
               INSERT INTO t2 VALUES (1);
               COMMIT;
               END; //

              致导会误错束约个这               ROLLBACK  和)务事滚回(  SQLSTATE 23000   。生发误错
              3. DECLARE CONDITION

               mysql> CALL p24()//
              Query OK, 0 rows affected (0.28 sec)

              mysql> SELECT * FROM t2//
              Empty set (0.00 sec)

              。录记何任入插有没 表到看们我果结面上从,么什是果结看看程过储存个这用调们我                 t2
                                  。的要想们我是正这。了滚回都务事部全
              4. DECLARE CONDITION

               mysql> CREATE PROCEDURE p9 ()
                 -> BEGIN
                 -> DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;
                 -> DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END;
                 -> DECLARE EXIT HANDLER FOR SQLWARNING BEGIN END;
                 -> END;//
              Query OK, 0 rows affected (0.00 sec)

              :件条的明声预个三是里这                 NOT FOUND (行到不找 ), SQLEXCEPTION (误错  ),
Copyright 2005, MySQL AB                      页 第33
信来请误错有如         chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢,      MySQL注关的业事        息信些这留保时载转请
。用使以可就件条明声要需不此因,的明声预是们它为因。 释注或告警
              SQLWARNING (               )
              到得会将你,                    :明声的样这做去你果如过不
                                             "DECLARE SQLEXCEPTION CONDITION ..."
                                               。示提息信误错
      Cursors 游标

              :要摘能功现实标游
              DECLARE cursor-name CURSOR FOR SELECT ...;
              OPEN cursor-name;
              FETCH cursor-name INTO variable [, variable];
              CLOSE cursor-name;

              是但,现实的整完有没并还法语标游的中程过储存的们我然虽。了标游眼着始开们我在现
                   。标游闭关,取读里标游从,标游开打,标游明声如务事的本基成完以可经已
               1. Cursor Example

               CREATE PROCEDURE p25 (OUT return_val INT)
              BEGIN
                DECLARE a,b INT;
                DECLARE cur_1 CURSOR FOR SELECT s1 FROM t;
                DECLARE CONTINUE HANDLER FOR NOT FOUND
                 SET b = 1;
                OPEN cur_1;
                REPEAT
                 FETCH cur_1 INTO a;
                 UNTIL b = 1
                END REPEAT;
                CLOSE cur_1;
                SET return_val = a;
              END;//

              。子例新的程过储存的标游含包下一看们我
              2. Cursor Example

               CREATE PROCEDURE p25 (OUT return_val INT)
              BEGIN
                DECLARE a,b INT;                           <--
                DECLARE cur_1 CURSOR FOR SELECT s1 FROM t;
                DECLARE CONTINUE HANDLER FOR NOT FOUND
                 SET b = 1;
                OPEN cur_1;
                REPEAT
                 FETCH cur_1 INTO a;
                 UNTIL b = 1
                END REPEAT;
                CLOSE cur_1;
                SET return_val = a;
              END;//

              ,明声量变行进要先首。的要重分十是序顺,下一说带附。量变个三了明声始开程过个这
               ,明声序顺按有没你果如。器理处误错明声是才面后再,标游明声后随,件条明声后然
                                           。息信误错示提会统系

Copyright 2005, MySQL AB                     页 第34
信来请误错有如                              对您谢感时同,读阅和持支的您谢谢,
                chenpengyi_007@163.com                          MySQL注关的业事          息信些这留保时载转请
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure
My sql procedure

More Related Content

Similar to My sql procedure

一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教Bruce Chen
 
與大師對談: 轉移到微服務架構必經之路 ~ 系統與資料庫重構
與大師對談: 轉移到微服務架構必經之路~ 系統與資料庫重構與大師對談: 轉移到微服務架構必經之路~ 系統與資料庫重構
與大師對談: 轉移到微服務架構必經之路 ~ 系統與資料庫重構Andrew Wu
 
MySQL快速入门与提高
MySQL快速入门与提高MySQL快速入门与提高
MySQL快速入门与提高mysqlpub
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocketpwesh
 
优酷 Web网站架构案例分析
优酷   Web网站架构案例分析优酷   Web网站架构案例分析
优酷 Web网站架构案例分析George Ang
 
Key value store
Key value storeKey value store
Key value storexuanhan863
 
Youku arch qcon2009_beijing
Youku arch qcon2009_beijingYouku arch qcon2009_beijing
Youku arch qcon2009_beijingdrewz lin
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践mysqlops
 
MySQL5.6&5.7 Cluster 7.3 Review
MySQL5.6&5.7 Cluster 7.3 ReviewMySQL5.6&5.7 Cluster 7.3 Review
MySQL5.6&5.7 Cluster 7.3 Review郁萍 王
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲ArBing Xie
 
Csdn Emag(Oracle)第四期
Csdn Emag(Oracle)第四期Csdn Emag(Oracle)第四期
Csdn Emag(Oracle)第四期yiditushe
 
MySQL Replication新功能介绍
MySQL Replication新功能介绍 MySQL Replication新功能介绍
MySQL Replication新功能介绍 orczhou
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程yiditushe
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程appollo0312
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计锐 张
 
1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计RolfZhang
 
3.架构设计篇2
3.架构设计篇23.架构设计篇2
3.架构设计篇2gavin shaw
 
Mysql proxy cluster
Mysql proxy clusterMysql proxy cluster
Mysql proxy clusterYiwei Ma
 

Similar to My sql procedure (20)

一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教一個微信專案從0到000的效能調教
一個微信專案從0到000的效能調教
 
與大師對談: 轉移到微服務架構必經之路 ~ 系統與資料庫重構
與大師對談: 轉移到微服務架構必經之路~ 系統與資料庫重構與大師對談: 轉移到微服務架構必經之路~ 系統與資料庫重構
與大師對談: 轉移到微服務架構必經之路 ~ 系統與資料庫重構
 
MySQL快速入门与提高
MySQL快速入门与提高MySQL快速入门与提高
MySQL快速入门与提高
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocket
 
优酷 Web网站架构案例分析
优酷   Web网站架构案例分析优酷   Web网站架构案例分析
优酷 Web网站架构案例分析
 
Key value store
Key value storeKey value store
Key value store
 
Youku arch qcon2009_beijing
Youku arch qcon2009_beijingYouku arch qcon2009_beijing
Youku arch qcon2009_beijing
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践
 
MySQL5.6&5.7 Cluster 7.3 Review
MySQL5.6&5.7 Cluster 7.3 ReviewMySQL5.6&5.7 Cluster 7.3 Review
MySQL5.6&5.7 Cluster 7.3 Review
 
000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲000 北京圣思园教育科技有限公司第一期面授培训大纲
000 北京圣思园教育科技有限公司第一期面授培训大纲
 
Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 
xcvx
xcvxxcvx
xcvx
 
Csdn Emag(Oracle)第四期
Csdn Emag(Oracle)第四期Csdn Emag(Oracle)第四期
Csdn Emag(Oracle)第四期
 
MySQL Replication新功能介绍
MySQL Replication新功能介绍 MySQL Replication新功能介绍
MySQL Replication新功能介绍
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计
 
1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计
 
3.架构设计篇2
3.架构设计篇23.架构设计篇2
3.架构设计篇2
 
Mysql proxy cluster
Mysql proxy clusterMysql proxy cluster
Mysql proxy cluster
 

More from colderboy17

Mysqlexplain 执行计划解读
Mysqlexplain 执行计划解读Mysqlexplain 执行计划解读
Mysqlexplain 执行计划解读colderboy17
 
新浪 李晓栋 非商业网络设备的新浪应用之路
新浪 李晓栋 非商业网络设备的新浪应用之路新浪 李晓栋 非商业网络设备的新浪应用之路
新浪 李晓栋 非商业网络设备的新浪应用之路colderboy17
 
网易 王磊 网易海量数据存储平台的构建和运维
网易 王磊 网易海量数据存储平台的构建和运维网易 王磊 网易海量数据存储平台的构建和运维
网易 王磊 网易海量数据存储平台的构建和运维colderboy17
 
网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维colderboy17
 
腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验
腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验
腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验colderboy17
 
淘宝 任卿 打造高效能的Cdn系统
淘宝 任卿 打造高效能的Cdn系统淘宝 任卿 打造高效能的Cdn系统
淘宝 任卿 打造高效能的Cdn系统colderboy17
 
搜狐畅游 叶金荣 游戏数据库运维经验分享
搜狐畅游 叶金荣 游戏数据库运维经验分享搜狐畅游 叶金荣 游戏数据库运维经验分享
搜狐畅游 叶金荣 游戏数据库运维经验分享colderboy17
 
搜狐 窦喆 Sohu-sagent
搜狐 窦喆 Sohu-sagent搜狐 窦喆 Sohu-sagent
搜狐 窦喆 Sohu-sagentcolderboy17
 
神州数码 Jason pan future_clouddatacenterv2
神州数码 Jason pan future_clouddatacenterv2神州数码 Jason pan future_clouddatacenterv2
神州数码 Jason pan future_clouddatacenterv2colderboy17
 
华为 余洲 定制化服务器
华为 余洲 定制化服务器华为 余洲 定制化服务器
华为 余洲 定制化服务器colderboy17
 
互联网运维大会 刘洋-2011-jul 1
互联网运维大会 刘洋-2011-jul 1互联网运维大会 刘洋-2011-jul 1
互联网运维大会 刘洋-2011-jul 1colderboy17
 
新浪 杨海朝 Redis运维之道
新浪 杨海朝 Redis运维之道新浪 杨海朝 Redis运维之道
新浪 杨海朝 Redis运维之道colderboy17
 
阿里巴巴 肖劲青 阿里巴巴运维自动化的探索与规划
阿里巴巴 肖劲青 阿里巴巴运维自动化的探索与规划阿里巴巴 肖劲青 阿里巴巴运维自动化的探索与规划
阿里巴巴 肖劲青 阿里巴巴运维自动化的探索与规划colderboy17
 
阿里巴巴 林钰 网站存储经验谈
阿里巴巴 林钰 网站存储经验谈阿里巴巴 林钰 网站存储经验谈
阿里巴巴 林钰 网站存储经验谈colderboy17
 
Okbuy 李小红 好乐买自动化运维实践
Okbuy 李小红 好乐买自动化运维实践Okbuy 李小红 好乐买自动化运维实践
Okbuy 李小红 好乐买自动化运维实践colderboy17
 
阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化colderboy17
 
深入浅出My sql数据库开发、优化与管理维护
深入浅出My sql数据库开发、优化与管理维护深入浅出My sql数据库开发、优化与管理维护
深入浅出My sql数据库开发、优化与管理维护colderboy17
 
深入浅出My sql数据库开发、优化与管理维护 (1)
深入浅出My sql数据库开发、优化与管理维护 (1)深入浅出My sql数据库开发、优化与管理维护 (1)
深入浅出My sql数据库开发、优化与管理维护 (1)colderboy17
 

More from colderboy17 (20)

MySQL SQL规范
MySQL SQL规范MySQL SQL规范
MySQL SQL规范
 
Redis
RedisRedis
Redis
 
Mysqlexplain 执行计划解读
Mysqlexplain 执行计划解读Mysqlexplain 执行计划解读
Mysqlexplain 执行计划解读
 
新浪 李晓栋 非商业网络设备的新浪应用之路
新浪 李晓栋 非商业网络设备的新浪应用之路新浪 李晓栋 非商业网络设备的新浪应用之路
新浪 李晓栋 非商业网络设备的新浪应用之路
 
网易 王磊 网易海量数据存储平台的构建和运维
网易 王磊 网易海量数据存储平台的构建和运维网易 王磊 网易海量数据存储平台的构建和运维
网易 王磊 网易海量数据存储平台的构建和运维
 
网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维网易 李弈远 网易服务集成框架的构建与运维
网易 李弈远 网易服务集成框架的构建与运维
 
腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验
腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验
腾讯 马志强 虚拟化环境下 网络 朋务器 平台的协作经验
 
淘宝 任卿 打造高效能的Cdn系统
淘宝 任卿 打造高效能的Cdn系统淘宝 任卿 打造高效能的Cdn系统
淘宝 任卿 打造高效能的Cdn系统
 
搜狐畅游 叶金荣 游戏数据库运维经验分享
搜狐畅游 叶金荣 游戏数据库运维经验分享搜狐畅游 叶金荣 游戏数据库运维经验分享
搜狐畅游 叶金荣 游戏数据库运维经验分享
 
搜狐 窦喆 Sohu-sagent
搜狐 窦喆 Sohu-sagent搜狐 窦喆 Sohu-sagent
搜狐 窦喆 Sohu-sagent
 
神州数码 Jason pan future_clouddatacenterv2
神州数码 Jason pan future_clouddatacenterv2神州数码 Jason pan future_clouddatacenterv2
神州数码 Jason pan future_clouddatacenterv2
 
华为 余洲 定制化服务器
华为 余洲 定制化服务器华为 余洲 定制化服务器
华为 余洲 定制化服务器
 
互联网运维大会 刘洋-2011-jul 1
互联网运维大会 刘洋-2011-jul 1互联网运维大会 刘洋-2011-jul 1
互联网运维大会 刘洋-2011-jul 1
 
新浪 杨海朝 Redis运维之道
新浪 杨海朝 Redis运维之道新浪 杨海朝 Redis运维之道
新浪 杨海朝 Redis运维之道
 
阿里巴巴 肖劲青 阿里巴巴运维自动化的探索与规划
阿里巴巴 肖劲青 阿里巴巴运维自动化的探索与规划阿里巴巴 肖劲青 阿里巴巴运维自动化的探索与规划
阿里巴巴 肖劲青 阿里巴巴运维自动化的探索与规划
 
阿里巴巴 林钰 网站存储经验谈
阿里巴巴 林钰 网站存储经验谈阿里巴巴 林钰 网站存储经验谈
阿里巴巴 林钰 网站存储经验谈
 
Okbuy 李小红 好乐买自动化运维实践
Okbuy 李小红 好乐买自动化运维实践Okbuy 李小红 好乐买自动化运维实践
Okbuy 李小红 好乐买自动化运维实践
 
阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化阿里巴巴 叶正盛 数据库性能量化
阿里巴巴 叶正盛 数据库性能量化
 
深入浅出My sql数据库开发、优化与管理维护
深入浅出My sql数据库开发、优化与管理维护深入浅出My sql数据库开发、优化与管理维护
深入浅出My sql数据库开发、优化与管理维护
 
深入浅出My sql数据库开发、优化与管理维护 (1)
深入浅出My sql数据库开发、优化与管理维护 (1)深入浅出My sql数据库开发、优化与管理维护 (1)
深入浅出My sql数据库开发、优化与管理维护 (1)
 

Recently uploaded

【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...ggbob1
 
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...黑客 接单【TG/微信qoqoqdqd】
 
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...ggbob1
 
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdfshanshanhui1
 
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...黑客 接单【TG/微信qoqoqdqd】
 
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務sardinesaying
 
Grade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxGrade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxPriscilleXu
 
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制bairnshajjes
 
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制gravestomas0
 
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制kathrynalvarez364
 
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxJAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxCHANSUITNEEMoe
 

Recently uploaded (11)

【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
【国外大学文凭样本】多大毕业证认证Q/微:892798920办多伦多大学毕业证留信留服使馆公公证,多大硕士毕业证,U of T研究生毕业证,文凭,改U o...
 
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
GPA低怎么办? | 身份黑后回复方案 | 出入境激活 身份恢复美本GPA太低了怎么办黑客服务,黑客修改大学成绩,黑客改成绩单,黑客入侵教务系统,找黑客修...
 
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
30T.ppt【国外大学文凭样本】TWU毕业证认证Q/微:892798920办西三一大学毕业证留信留服使馆公证,TWU硕士毕业证,TWU研究生毕业证,文凭...
 
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
003 DSKP KSSR SEMAKAN 2017 BAHASA CINA TAHUN 3.pdf
 
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
我了解到黑客在某些领域拥有卓越的技术能力,特别是在处理系统漏洞方面。在当前的情境下,如果我想要改变我的毕业成绩,他们的帮助或许是我唯一可行的选择。【微 t...
 
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務【創業簡報練習】當一個人吃飯會想起誰:(A)I-DOLL 陪吃娃娃|科技創業與營運實務
【創業簡報練習】當一個人吃飯會想起誰: (A)I-DOLL 陪吃娃娃|科技創業與營運實務
 
Grade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptxGrade 6 Lesson 7 Environment Protection.pptx
Grade 6 Lesson 7 Environment Protection.pptx
 
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
加急代办一个日本鹿儿岛纯心女子大学学位记🌈学习成绩单电子版定制🌈仿制荷兰大学毕业证🌈日语JLPT证书定制
 
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
未毕业在线购买日本熊本县立大学学位记🏆学习成绩单电子版定制🏆克隆爱尔兰大学文凭🏆CFA证书定制
 
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
哪里可以购买日本神奈川县立保健福祉大学学位记/录取通知书可以制作吗/补办马来西亚大学文凭/CIA证书定制
 
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptxJAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
JAWAPAN BUKU AKTIVITI BAHASA CINA TAHUN 3.pptx
 

My sql procedure

  • 1. MySQL 5.0 存储过程 MySQL 5.0 新特性系列 第一部分 MySQL 技术白皮书 Peter Gulutzan March, 2005 奕朋陈:译翻 学大技科子电安西 2005-5-6 内国持支,的目业商何任及涉不,译翻人个于属:明声( )谢谢,处出明 注时载转请,展发 MySQL Copyright 2005, MySQL AB 页 第 1 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL注关的业事 息信些这留保时载转请
  • 2. Table of Contents 目录( 词名有专是都本基为因,了译翻做不录目 ) Introduction ....................................................................................................3 A Definition and an Example ........................................................................3 Why Stored Procedures ................................................................................4 Why MySQL Statements are Legal in a Procedure Body...........................8 Characteristics Clauses ..............................................................................10 Parameters....................................................................................................13 The New SQL Statements ...........................................................................15 Scope ...........................................................................................................16 Loops.............................................................................................................21 Error Handling..............................................................................................29 Cursors .........................................................................................................35 Security .........................................................................................................41 Functions ......................................................................................................43 Metadata........................................................................................................44 Details ...........................................................................................................48 Style...............................................................................................................52 Tips when writing long routines.................................................................63 Bugs ..............................................................................................................64 Feature Requests .........................................................................................65 Resources .....................................................................................................65 Conclusion....................................................................................................66 About MySQL ...............................................................................................66 Copyright 2005, MySQL AB 页 第 2 信来请误错有如 chenpengyi_007@163.com 对您谢感时同,读阅和持支的您谢谢, MySQL 注关的业事 息信些这留保时载转请
  • 3. 息信些这留保时载转请 注关的业事 MySQL 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com 信来请误错有如 页 第 3 Copyright 2005, MySQL AB 。受接会也家大信相,惯习的去过们我是这为因,程过储存 pi() 用使常经更会面里书本在我。) 如,样一数函的载装预 和来起用使(数函的值回返以可 Mysql SQL 中句语 他其在是二 ,程过储存的说们我是一:种两有”)程例( “的持支 routines MySQL ,说来的确准,)样一序程子的里言语规正像就(序程的中库库书在储存种一是程过储存 A Definition and an Example 定义及实例 。助帮和持支的久长到得以,户用 Mysql 深资的识认你询咨以可,障故现出然仍行运果如但。上脑电的您在行运的常正能将子例 的里这此因。 , , HP-UX Windows Sparc 括包,了 多更持支能时同,本版的高更有经已 OS Mysql ,候时的书本读阅您在。过通试测上版共公 、 在经已都子例的以所 Mysql 5.0.3 Suse 9.2 Linux )本脚关相载下站网 mysql.com 在以可,的版子电是不的读所在现你果如(中序程端户客 mysql 到制复码代将接直以可你,掉去示显统系些这 和 的中子例将会我候时有 "->" "mysql>" Query OK, 0 rows affected (0.00 sec) -> END;// <-- -> /* This procedure does nothing */ -> BEGIN mysql> CREATE PROCEDURE p () :如例。调强示表以边右的 <-- 面页在放号符” “将用会我时同,释注加间落段和行些某在要需则,大较比例实果如 Query OK, 0 rows affected (0.00 sec) mysql> DROP FUNCTION f; :子例个举里这在。样一不本文通普与来起看们他使, Courier 成改体字将,整调行进码代的现出就幕屏的端户客 对会我,时码代际实示演要想我次每 mysql 约定和编程风格 Conventions and Styles约定和编程风格 。握掌能就快很信 相,学去程课着跟要只是但,难很例用个这为认会家大许也前之习学在,例用用实的大较 示展家大给会后最,念概立建家大为的慢慢始开节细个一每从会我,的目的样这到达了为 。识知的要需到学你让子例、题问的单简用,话对行进您与样那家专行内像能书本 这望希。集一第的书丛性特新 MySQL 5.0 绍介是这,”图视构架息信、图视、器发触、程过 储存“了绍介是说来的单简。的写而户用老 的性特新本版 解了要需为是书本 MySQL 5.0 Introduction
  • 4. 息信些这留保时载转请 注关的业事 MySQL 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com 信来请误错有如 页 第 4 Copyright 2005, MySQL AB 。已而点优的上以有没是只们它,择选的好很是还处好的程例言语部外用使 SQL ,过不。势优的句语 用使比相言语部外等 或 、 与是就这。包的同不置配 PHP Java C 脑电的号型同不的你为者或,可许置设行执中统系作操在序程为要需不也,包境环行运 加添外额你要需不,上台平何任的持支 在行运以可它道知就你,时程过储存写编Mysql SQL 用你当!的植移以可是程过储存。序程用应是不而辑逻库据数是它为因,响影生产 !件组的用复可是程过储存 !件组的用复可是程过储存 会不程过储存对这,言语的机主了变改你果如下一象想!件组的用复可是程过储存 !件组的用复可是程过储存 。了往来息信的多么那没就间之端户客和器务服时 步一每的务任行执在样这。成完来程过储存的上器务服在存保用使以可就你,务任性复 重的互交户用有没但句语多、环循、查检要需是的理处要需你果如。量流息信络网低 降否能于在却法方要主的度速升提是但。快么那来起行运序程的写编) 如(言语部外 C SQL 像会不程过储存 此因,器译编有没于由。样那的做所)句语理处预( statements Prepared 像就,进改了做上制机存缓在器务服 是就的说以可们我。样一不也验体 Mysql Mysql !快更行运统系使会程过储存 !快更行运统系使会程过储存 的到得户用,势优个这明证上 在能不时暂们我然虽!快更行运统系使会程过储存 !快更行运统系使会程过储存 。读阅你 供可档文的方三第多许有还,户用验经的用雇者或询咨以可你多很有也,念概些这得 获里那人他其 从以可你此因。的同相是往往法语的们它而,在存已早中 他其在 DBMS !术技的证认被经已是程过储存 数函的能功同相是但,的新是它中 在然虽!术技的证认被经已是程过储存 !术技的证认被经已是程过储存 !术技的证认被经已是程过储存Mysql 。做去不得不你 ,因原要需不做样这。来中程过储存到移转)中本脚是或,中) ( UDF 数函义定自户用 ,中序程用应器务服在能可(序程有现把虑考始开该应你而然。路 的过走们他走你带来户用的验经有的量大多很有没也,过用使人何任有没前之此在 ,竟毕 。意注加更要需你时用使在的然自很,能功的新是说来 于对程过储存于由 MySQL Why Stored Procedures 为什么要用存储过程 。的然必是联关的程过储存和器发触为因,器发触——象 对库据数的新绍介将们我时同。节细有所的作工的做程过储存用利以可你绍介会将我面下 束结块句语 END /* end of block */ 句语 INSERT INTO table1 VALUES (variable1);/* statement SQL */ 束结 END IF; /* end of IF IF */ 值赋 SET variable1 = 'beasts'; /* assignment */ ELSE 值赋 SET variable1 = 'birds'; /* assignment */ 始开件条 IF parameter1 = 17 THEN /* start of IF IF */ 明声量变 DECLARE variable1 CHAR(10); /* variables */ 头块句语 BEGIN /* start of block */ 数参 (IN parameter1 INTEGER) /* parameters */ 名程过储存 CREATE PROCEDURE procedure1 /* name */ )释注文中何任添不序程的后此,读阅便方了为:注译( :明声例实的程过储存括包个一是面下 IF 。义定法语的新有句件条 和制控环循,理处常异,量变部局对里这在 SQL SQL 。集句语 的句语 多很括包以可及以,表列数参,字名括包程过储存个一
  • 5. !存保被将程过储存 !存保被将程过储存 ,消撤票支的中理处物事行银示显如例,序程个一了好写编你果如!存保被将程过储存 !存保被将程过储存 这。中库据数在存保式形的码代源以会它 。序程的你到找以可就人的票支解了要想那 。样一的说中论划规的到听上课在你跟能可这联关的义意有程进的据数理处和据数使将 ) 、 如(库据数些某。准标 Mysql !植移以可程过储存 持支全完 !植移以可程过储存 !植移以可程过储存 !植移以可程过储存 SQL 2003 DB2 Mimer 够足予给会将们我。持支不 、 如,的持支不分部有也但。持支样同 Oracle SQL Server 。上 到移转易容更能码代的写编 他其为使,具工和助帮 DBMS Mysql Setting up with MySQL 5.0 设置并开始 设置并开始MySQL 5.0服务 服务 务服 始开来 者或 mysql_fix_privilege_tables 过通 ~/mysql-5.0/scripts/mysql_install_db MySQL 员理管库据数有没果如。装安经已 定假我,分部一的作工备准的习练们我为作 MySQL 5.0 ,事件一掉忘易容很你过不。了装安去己自要需就你,件软他其及以库据数好装安你为 。表的 为名个一有要需你是就那 mysql.proc 要需只( 者或 行运须必你,后本版新最了装安在 mysql_fix_privilege_tables mysql_install_db 个一行运后份身 在用启时同我。作工能不将程过储存然不——)了够就个一中其行运 root SQL :下如,本脚 的式正非 mysql>source/home/pgulutzan/mysql- 5.0/scripts/mysql_prepare_privilege_tables_for_5.sql Starting the MySQL Client 启动 启动MySQL客户端 客户端 是者或本版制进二是的用使你果如,式方他其用使会许也你。式方的端户客 动启我是这 mysql Windows :序程下以行运下录目子他其在会能可你,脑电的统系 pgulutzan@mysqlcom:~> /usr/local/mysql/bin/mysql --user=root Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 1 to server version: 5.0.3-alpha-debug Type 'help;' or 'h' for help. Type 'c' to clear the buffer. 的后陆登份身 以示展会将我,中示演在 root mysql 的大极有我着味意样这,果结的回返端户客 。权特 Check for the Correct Version 核对版本 的用使认确了为 MySQL 的用使我认确法方种两有我。本版询查要们我,的确正是本版的 :本版 是 5.0 SHOW VARIABLES LIKE 'version'; or SELECT VERSION(); Copyright 2005, MySQL AB 页 第 5 信来请误错有如 chenpengyi_007@163.com 对您谢感时同,读阅和持支的您谢谢, MySQL 注关的业事 息信些这留保时载转请
  • 6. :如例 mysql> SHOW VARIABLES LIKE 'version'; +---------------+-------------------+ | Variable_name | Value | +---------------+-------------------+ | version | 5.0.3-alpha-debug | +---------------+-------------------+ 1 row in set (0.00 sec) mysql> SELECT VERSION(); +-------------------+ | VERSION() | +-------------------+ | 5.0.3-alpha-debug | +-------------------+ 1 row in set (0.00 sec) 字数见看当 。作工常正上端户客个这在够能程过储存认确以可就后 '5.0.x' The Sample "Database" 示例数据库 示例数据库 的骤步个这现实库据数认默为定设后然库据数的新个一建创是事件一第的做要在现 SQL :下如句语 CREATE DATABASE db5; USE db5; :如例 mysql> CREATE DATABASE db5; Query OK, 1 row affected (0.00 sec) mysql> USE db5; Database changed 。表作工的单简个一建创们我后然库据数的际实的据数要重有用使免避要里这在 SQL:下如句语 的骤步个这现实 mysql> CREATE DATABASE db5; Query OK, 1 row affected (0.01 sec) mysql> USE db5; Database changed mysql> CREATE TABLE t (s1 INT); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO t VALUES (5); Query OK, 1 row affected (0.00 sec) 要需不并里这在为因,单简的表持保要我是因原的做样这。列一了入插中表在只我现发会你 。了杂复够经已身本它为因,表据数的大用使要需不,程过储存授教是而,巧技的据数询查示展 Copyright 2005, MySQL AB 页 第 6 信来请误错有如 chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢, 注关的业事 MySQL 息信些这留保时载转请
  • 7. 息信些这留保时载转请 注关的业事 MySQL 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com 信来请误错有如 页 第 7 Copyright 2005, MySQL AB :况情的面下现出会将时用调在,了做 样这果如,字名的数函建内 MySQL 用使要不意注但,符字个 为制限度长其,符格空括包 64 db5.p1 以可它,开分以可名程过储存。” “如,法方中折的样这”名程过储存 名库据数“ . 取采以可你 。)。吧持支会后以望希:话者译(持支不 是但,)持支 MySQL Oracle DBMS (载重许允 些某。载重致导会将样这为因,字名的同相取程过储存个两给能不 将你中库据数个一同在,字名个一同是’ ‘和’ ‘此因,感敏不写小大对名程过储存 p1 P1 题问的符识标法合:话外题 题问的符识标法合:话外题 题问的符识标法合:话外题 题问的符识标法合:话外题 Digression: Legal Identifiers 。 是字名的程过储存新面上,名程过是分部二第 p1 <-- CREATE PROCEDURE p1 () SELECT * FROM t; // :” CREATE PROCEDURE “ 是分部一第的程过储存句语 SQL <-- CREATE PROCEDURE p1 () SELECT * FROM t; // 。碑程里的要重 个这下记中记日的你在好最,话的样这是如假。程过储存个一第的建创 Mysql 用使你是这许也 CREATE PROCEDURE p1 () SELECT * FROM t; // CREATE PROCEDURE Example 创建程序实例 "DELIMITER ;//". :了以可就句语面 ; 下入输,符隔分为作)号分(” “用使复恢要后以果如。样一我跟择选好最你,解理易容 更了为中程课个这在是但,择选来好喜的己自据根以可你。样这欢喜不我但,的号符” “ @ DB2 | 用使中序程 在过见曾我。 “线竖用人有也, “杠斜双过用曾我。符隔分为作串符字 ” ” // 的中序程或句语的你在现出能可太不个一择选要需你此因号分个一要需都个一每以所,句 语多许有中程过储存为因,题问少不生产会这,中程过储存在但,”;“号分用使都们我 来以直一。号符串符字或符字的句语 个一入输成完经已你端户客 知通你是符隔分 SQL mysql mysql> DELIMITER // :如例 DELIMITER // SQL :下如句语 的骤步个这现实,符隔分个一要需们我在现 Pick a Delimiter 选择分隔符 始开表的列一含包只的 为字名个这从将们我,库据数例示是就这t
  • 8. mysql> CALL pi(); Error 1064 (42000): You have a syntax error. mysql> CALL pi (); Error 1305 (42000): PROCEDURE does not exist. 上加后名数函的用调在须必你但,数函的 叫字名个一是的用调我,里子例个一第的面上在 pi 。样那子例个二第像就,格空 CREATE PROCEDURE p1 () SELECT * FROM t; // <-- 。”表列数参“是”)(“中其 中子例。数参加添内号括在要需常通。表列数参是分部三第的句语 CREATE PROCEDURE 。的须必是这而然,号括空入键要需只我以所——的空是表列数参此因,数参有没程过储存的 CREATE PROCEDURE p1 () SELECT * FROM t; // <-- "SELECT * FROM t;" 。体主的程过储存是 句语中体程过。句语 的般一是,体主的程过储存是它,了分部个一后最的句语了到后然 SQL 。号分个这写不以可时) (号符束结句语有面后果如,号分个一含包 "SELECT * FROM t;" // 的用使家大是词个这) (为因,事好件是会将体主的序程做叫分部这把我得记还你果如 body 使以所。示演了为是只里这,中程过储存在用句语 将会不们我常通。语术的上术技 SELECT 。作工常正否是序程出看的好更时用调在能,句语的样这用 Why MySQL Statements are Legal in a Procedure Body 什么MySQL语句在存储过程体中是合法的? 什么 语句在存储过程体中是合法的? 语句在存储过程体中是合法的 含包个一建创以可你?呢的法合是才中程过储存 在句语 的样么什 SQL Mysql INSERT, UPDATE, 中码代果如是的住记要需一唯你。句语的等等 DELETE, SELECT, DROP, CREATE, REPLACE 是都言语义定库据数何任:中句语 准标在。植移能不将码代么那,能功充扩 MySQL 含包 SQL :如,的法合 CREATE PROCEDURE p () DELETE FROM t; // SET 、COMMIT 及以 ROLLBACK :如,的法合是也 CREATE PROCEDURE p () SET @x = 5; // MySQL 。法合将都句语的言语作操据数何任:能功加附的 CREATE PROCEDURE p () DROP TABLE t; // MySQL 的接直:能功充扩 SELECT :的法合是也 CREATE PROCEDURE p () SELECT 'a'; // 为称能功的句语 括包中程过储存将我,下一提便顺 DDL MySQL 标 在是因原的能功加附 SQL 。件组选可即,的心核非为义定个这把中准 Copyright 2005, MySQL AB 页 第 8 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 9. 息信些这留保时载转请 注关的业事 MySQL 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com 信来请误错有如 页 第 9 Copyright 2005, MySQL AB 。句子的用可多很有会将们我前件部杂复写在样那 。句子的在存经已变改者或,句子条一加都次每,习练的列系一有就们我快很是但。单 简当相这说己自对能你望希我。了楚清经已”法方程过用调和建创“点识知的要主,了好 "SELECT * FROM t;". :句语面下了行执你于当相就程过 用调你,以所 p1 mysql> SELECT * FROM t; // :样一果效行执的句语面下和 mysql> CALL p1() // 式方现实他其 式方现实他其 式方现实他其 式方现实他其 2. "SELECT * FROM t;" 是句语的中程过为因 Query OK, 0 rows affected (0.03 sec) 1 row in set (0.03 sec) +------+ | 5| +------+ | s1 | +------+ mysql> CALL p1() // t p1 容内的表 了回返幕屏是果结,时程过 的面里子例用调你当的须必是号括,调强次一再号括个 容内的表 了回返幕屏是果结,时程过 的面里子例用调你当的须必是号括,调强次一再号括个 容内的表 了回返幕屏是果结,时程过 的面里子例用调你当的须必是号括,调强次一再号括个 容内的表 了回返幕屏是果结,时程过 的面里子例用调你当的须必是号括,调强次一再号括个 CALL 一及以名程过你和 是就部全的入输要需所你,了程过储存个一用调以可就们我在现 一及以名程过你和 是就部全的入输要需所你,了程过储存个一用调以可就们我在现 一及以名程过你和 是就部全的入输要需所你,了程过储存个一用调以可就们我在现 一及以名程过你和 是就部全的入输要需所你,了程过储存个一用调以可就们我在现 1. Call the Procedure 调用存储过程 MySQL 。所场作工的程过是就库据数认默定假 为因,的法非是也 "CREATE PROCEDURE db5.p1 () DROP DATABASE db5//" 句语 似类是但, "USE database" DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER. 用使以可你过不 CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION, MySQL 5.0 :的法非是中体程过在,句语的新全说来 对些这面下 CREATE PROCEDURE p2 () DELETE FROM t; // CREATE PROCEDURE p1 () :的法非是 就子例的面下如例。句语作操库据数的作操表或程例对有能不是就,束约个一有中体程过在
  • 10. Characteristics Clauses 特征子句 1. CREATE PROCEDURE p2 () LANGUAGE SQL <-- NOT DETERMINISTIC <-- SQL SECURITY DEFINER <-- COMMENT 'A Procedure' <-- SELECT CURRENT_DATE, RAND() FROM t // 些这。前之体主,后之号括在容内句子。句子的性特程过储存映反能些一是的出给我里这 ?呢用作么什有们他,的选可是都句子 2. CREATE PROCEDURE p2 () LANGUAGE SQL <-- NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT 'A Procedure' SELECT CURRENT_DATE, RAND() FROM t // 语 用使体主的程过面下明说了为是仅仅。的用作有没是句子 LANGUAGE SQL 个这,好很 SQL 要需) 的 ( 些某为因,的用有是明声里这在你但,的认默统系是条这。写编言 DBMS IBM DB2 言语他其的外 除现出会能可后今,外此。上用是还好最题问容兼的 注关你果如,它 DB2 SQL 。 程过储存的持支 3. CREATE PROCEDURE p2 () LANGUAGE SQL NOT DETERMINISTIC <-- SQL SECURITY DEFINER COMMENT 'A Procedure' SELECT CURRENT_DATE, RAND() FROM t // 那是就义定的程过定确个一里这。息信的统系给递传是, NOT DETERMINISTIC ,句子个一下 回返那,句语 有含中体主然既,中例案个这在。序程的样一也出输样一入输次每些 SELECT 这意注会不序程化优的置内 是但。 其称们我此因的知未是定肯 NOT DETERMINISTIC MySQL 。意注不在现在少至,个 Copyright 2005, MySQL AB 页 第 10 信来请误错有如 chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢, MySQL 注关的业事 息信些这留保时载转请
  • 11. 4. CREATE PROCEDURE p2 () LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER <-- COMMENT 'A Procedure' SELECT CURRENT_DATE, RAND() FROM t // 或 为义定以可, SQL SECURITY 是句子个一下SQL SECURITY DEFINER SQL SECURITY 。子例的限权试测有会将面后在们我然当,了域领的制控限权了入进就这 。 INVOKER 是项选个一另(限权的户用程过建创查检时用调在着味意 SQL SECURITY DEFINER SQL SECURITY INVOKER 。) 可就户用的程过建创查检器务服 诉告令指 用使,言而在现 SQL SECURITY DEFINER MySQL ) (项选个一另而。了户用的程过用调行执查检不就,用调被经已程过当,了以 INVOKER 。限权的者用调查检要然仍步一这在器务服诉告是则 5. CREATE PROCEDURE p2 () LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT 'A Procedure' <-- SELECT CURRENT_DATE, RAND() FROM t // 。明说释注的选可个一是 COMMENT 'A procedure' 固有没出指会中文在我,准标的定固有没个这。起一在储存义定程过跟会句子释注,后最 。少很中 的准标们我在些这是的运幸过不,句语的准标定 SQL 6. CREATE PROCEDURE p2 () LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT '' SELECT CURRENT_DATE, RAND() FROM t // :的效等是句语面下跟程过面上 CREATE PROCEDURE p2 () SELECT CURRENT_DATE, RAND() FROM t // :于当相就了略省果如,值认默有也句子征特 LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ''. Copyright 2005, MySQL AB 页 第 11 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 12. 一些题外话 : 用调 用调 用调 用调 果结的 果结的 果结的 果结的 p2()// mysql> call p2() // +--------------+-----------------+ | CURRENT_DATE | RAND() | +--------------+-----------------+ | 2004-11-09 | 0.7822275075896 | +--------------+-----------------+ 1 row in set (0.26 sec) Query OK, 0 rows affected (0.26 sec) 个一,时 程过用调当p2 SELECT 。数机随的得获望期们我回返行执被句语 : 的变改会不 的变改会不 的变改会不 的变改会不 sql_mode mysql> set sql_mode='ansi' // mysql> create procedure p3()select'a'||'b'// mysql> set sql_mode=''// mysql> call p3()// +------------+ | 'a' || 'b' | +------------+ | ab | +------------+ 是但串符字接连来线竖条两用使要需们我:如例。境环行运持保动自会时建创程过在 MySQL 然仍它,心担用不, 为改 将们我果如。法合才候时的 为 sql mode ansi 在有只这 sql mode non-ansi 。作工常正能时用使次一第它要只,作工能 Exercise 练习 Question 题问 题问 题问 题问 。求请些这理处能就案答的面后看不否能试试,话的下一习练意介不你果如 ,里这了到学经已你然既,题问个这考思去间时秒 约大用。 示显,程过个一建创 `Hello world` 5 :习复西东的过讲才刚些一择选机随再们我,候时的题问考思你当。单简很该应个这 DETERMINISTIC )表列数参(名程过 用使程过用调……句子的性特赖依入输和出输映反是句子)性定确( CALL 。了到也间时猜我,了好。式方 Answer 案答 案答 案答 案答 句语 含包中体程过在是就案答,的好 "SELECT 'Hello, world'" Copyright 2005, MySQL AB 页 第 12 信来请误错有如 chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢, MySQL 注关的业事 息信些这留保时载转请
  • 13. mysql> CREATE PROCEDURE p4 () SELECT 'Hello, world' // Query OK, 0 rows affected (0.00 sec) mysql> CALL p4()// +--------------+ | Hello, world | +--------------+ | Hello, world | +--------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) Parameters 参数 数参义定中程过储存在么怎究研的步一进更们我让 1. CREATE PROCEDURE p5 () ... 2. CREATE PROCEDURE p5 ([IN] name data-type) ... 3. CREATE PROCEDURE p5 (OUT name data-type) ... 4. CREATE PROCEDURE p5 (INOUT name data-type) ... 列数参的中子例个一第的面上。中号括的后名程过储存在须必表列数参的过讲面前下一忆回 。) ( 为数参认默为因,选可 词的里这。数参入输个一有中子例个二第,的空是表 IN IN input 。出输为作以可也入输为作能既,数参个一有中子例个四第,数参出输个一有中子例个三第 Copyright 2005, MySQL AB 页 第 13 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 14. IN example 输入的例子 mysql> CREATE PROCEDURE p5(p INT) SET @x = p // Query OK, 0 rows affected (0.00 sec) mysql> CALL p5(12345)// Query OK, 0 rows affected (0.00 sec) mysql> SELECT @x// +-------+ | @x | +-------+ | 12345 | +-------+ 1 row in set (0.00 sec) 后然。值的 数参为定设 量变话会将我中体程过在。程过的数参入输有是的示演子例的 个这 IN x p 。入传 值数参将经已们我明证, 量变话会示显择选。 数参入传 将,程过用调 12345 p @x 12345 OUT example 输出的例子 mysql> CREATE PROCEDURE p6 (OUT p INT) -> SET p = -5 // mysql> CALL p6(@y)// mysql> SELECT @y// +------+ | @y | +------+ | -5 | +------+ 。中 量变话会入传值的 将中用调程过在后然,数参出输是 的次这。子例个一另是这 p p @y 。的出传中程过从是值 诉告是 ,出看以可们我后用调在, 值赋数参给们我,中体程过在 -5 OUT DBMS 果效的样同到达来 句语用以可们我样同 "SET @y = -5;". Compound Statements 复合语句 :体程过下一析分细详的开展们我在现 CREATE PROCEDURE p7 () BEGIN SET @a = 5; SET @b = 5; INSERT INTO t VALUES (@a); SELECT s1 * @a FROM t WHERE s1 >= @b; END; // /* I won't CALL this. 用调被会不将句语个这 */ Copyright 2005, MySQL AB 页 第 14 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 15. 的中言语 和块句语 个这。块 是就造构的体程过成完 BEGIN/END BEGIN/END Pascal BEGIN/END 子例个这在。句语条多装封去块用使以可们我。的似相很是架框的言语 和,的同相本基是 C 程过的你果如。句语 和 些一了成完后然,句语的量变话会定设条多了用使们我,中 insert select 这在,句语合复为称被也块 。了块 要需就你么那,句语条多有中体 BEGIN/END BEGIN/END 。制控程流和义定量变行进以可你里 The New SQL Statements 新SQL语句 语句 Variables 变量 是令指的量变明声中句语合复在 DECLARE 。 (1) Example with two DECLARE statements 个两 个两 个两 个两 DECLARE 子例的句语 子例的句语 子例的句语 子例的句语 CREATE PROCEDURE p8 () BEGIN DECLARE a INT; DECLARE b INT; SET a = 5; SET b = 5; INSERT INTO t VALUES (a); SELECT s1 * a FROM t WHERE s1 >= b; END; // /* I won't CALL this */ :注译(已而了义定内块 在是只你,义定的正真是不并量变的义定中程过在 BEGIN/END 在的楚清须必你 符饰修用使能不,样一不量变话会和量变些这意注 。)参形是就也 @ 变话会用使能何任在能就你,明声旦一量变 。型类的们它和量变明声中块 BEGIN/END 。用使方地的名列、字文、量 子例的句语定设和句子认默有没 子例的句语定设和句子认默有没 子例的句语定设和句子认默有没 子例的句语定设和句子认默有没 (2) Example with no DEFAULT clause and SET statement CREATE PROCEDURE p9 () BEGIN DECLARE a INT /* there is no DEFAULT clause */; DECLARE b INT /* there is no DEFAULT clause */; SET a = 5; /* there is a SET statement */ SET b = 5; /* there is a SET statement */ INSERT INTO t VALUES (a); SELECT s1 * a FROM t WHERE s1 >= b; END; // /* I won't CALL this */ 为值始初的量变么那,句子的认默有没果如。法方的量变化始初多很有 NULL何任在以可你。 SET 。值赋量变给句语 用使候时 Copyright 2005, MySQL AB 页 第15 信来请误错有如 chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢, MySQL注关的业事 息信些这留保时载转请
  • 16. (3) Example with DEFAULT clause 有含 有含 有含 有含 子例的句子 子例的句子 子例的句子 子例的句子 DEFAULT CREATE PROCEDURE p10 () BEGIN DECLARE a, b INT DEFAULT 5; INSERT INTO t VALUES (a); SELECT s1 * a FROM t WHERE s1 >= b; END; // 了用使里这在。的样一是还果结是但,变改些一了做里这在们我 DEFAULT 初定设来句子 。了开分现实的句语 和 把要需不就这,值始 DECLARE SET 子例的用调 子例的用调 子例的用调 子例的用调 (4) Example of CALL mysql> CALL p10() // +--------+ | s1 * a | +--------+ | 25 | | 25 | +--------+ 2 rows in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) 作工常正能程过了示显果结 域用作 域用作 域用作 域用作 (5) Scope CREATE PROCEDURE p11 () BEGIN DECLARE x1 CHAR(5) DEFAULT 'outer'; BEGIN DECLARE x1 CHAR(5) DEFAULT 'inner'; SELECT x1; END; SELECT x1; END; // 同。的法合是这然当,块 的套嵌有中子例。题问的域用作下一论讨来们我在现 BEGIN/END 优的高更有享内域用作其在量变的部内。的法合是也样这, 是都字名,量变个两含包时 x1 因,了见可再不量变,外域用作其在经已时此,失消量变部内,时句语 到行执当。权先 END 派指值其将者或数参TUO过通以可你是但,量变的了明声个这到找能不也再外程过储存在此 值其存保来量变话会给 Copyright 2005, MySQL AB 页 第16 信来请误错有如 chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢, 注关的业事 MySQL 息信些这留保时载转请
  • 17. :程过的子例域用作用调 mysql> CALL p11()// +-------+ | x1 | +-------+ | inner | +-------+ +-------+ | x1 | +-------+ | outer | +-------+ 个一第时果结的到看们我 SELECT 量变的层二第到索检个二第,量变的层内最到索检句语 Conditions and IF-THEN-ELSE 条件式和 条件式和IF-THEN-ELSE 1. :子例的式件条含包些一写以可们我在现 :子例的式件条含包些一写以可们我在现 :子例的式件条含包些一写以可们我在现 :子例的式件条含包些一写以可们我在现 CREATE PROCEDURE p12 (IN parameter1 INT) BEGIN DECLARE variable1 INT; SET variable1 = parameter1 + 1; IF variable1 = 0 THEN INSERT INTO t VALUES (17); END IF; IF parameter1 = 0 THEN UPDATE t SET s1 = s1 + 1; ELSE UPDATE t SET s1 = s1 + 2; END IF; END; // 是个一另, 句语 是个一,句语 个两有面里。程过的句语 含包个一是里这 IF IF IF END IF IF 更能你让单简其使量尽会我但,程过的杂复用使里这在以可们我。 ELSE END IF 句语 句语 。楚清弄易容 2. CALL p12 (0) // 样这, 为值入传,程过个这用调们我 0 parameter1 。 为将值的 0 Copyright 2005, MySQL AB 页 第 17 信来请误错有如 chenpengyi_007@163.com 对您谢感时同,读阅和持支的您谢谢, MySQL 注关的业事 息信些这留保时载转请
  • 18. 3. CREATE PROCEDURE p12 (IN parameter1 INT) BEGIN DECLARE variable1 INT; SET variable1 = parameter1 + 1; <-- IF variable1 = 0 THEN INSERT INTO t VALUES (17); END IF; IF parameter1 = 0 THEN UPDATE t SET s1 = s1 + 1; ELSE UPDATE t SET s1 = s1 + 2; END IF; END; // 量变里这 variable1 为值赋被 parameter1 量变后行执以所,值的 加 1 variable1 。为 1 4. CREATE PROCEDURE p12 (IN parameter1 INT) BEGIN DECLARE variable1 INT; SET variable1 = parameter1 + 1; IF variable1 = 0 THEN <-- INSERT INTO t VALUES (17); END IF; IF parameter1 = 0 THEN UPDATE t SET s1 = s1 + 1; ELSE UPDATE t SET s1 = s1 + 2; END IF; END; // 量变为因 variable1 件条此因, 为值 1 "if variable1 = 0" …… ,假为 IF END IF 。行执被有没,过跳被 5. CREATE PROCEDURE p12 (IN parameter1 INT) BEGIN DECLARE variable1 INT; SET variable1 = parameter1 + 1; IF variable1 = 0 THEN INSERT INTO t VALUES (17); END IF; IF parameter1 = 0 THEN <-- UPDATE t SET s1 = s1 + 1; ELSE UPDATE t SET s1 = s1 + 2; END IF; END; // Copyright 2005, MySQL AB 页 第 18 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 19. 了行执被句语间中是于,真为果结断判,件条 个二第到 IF 6. CREATE PROCEDURE p12 (IN parameter1 INT) BEGIN DECLARE variable1 INT; SET variable1 = parameter1 + 1; IF variable1 = 0 THEN INSERT INTO t VALUES (17); END IF; IF parameter1 = 0 THEN UPDATE t SET s1 = s1 + 1; <-- ELSE UPDATE t SET s1 = s1 + 2; END IF; END; // 条一下则, 为值 果如。行执被句语 parameter1 , 于等值 0 数参为因 UPDATE parameter1 NULL 行两, 用调们我果如以所, 值含包都们他,行两有中 表在现 行执被将句语 UPDATE t 5 p12 6 。 成变会值的 7. mysql> CALL p12(0)// Query OK, 2 rows affected (0.28 sec) mysql> SELECT * FROM t// +------+ | s1 | +------+ | 6| | 6| +------+ 2 rows in set (0.01 sec) 。样那的望期所们我是也果结 CASE 指令 1. CREATE PROCEDURE p13 (IN parameter1 INT) BEGIN DECLARE variable1 INT; SET variable1 = parameter1 + 1; CASE variable1 WHEN 0 THEN INSERT INTO t VALUES (17); WHEN 1 THEN INSERT INTO t VALUES (18); ELSE INSERT INTO t VALUES (19); END CASE; END; // Copyright 2005, MySQL AB 页 第 19 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 20. 用使以可们我断判的假真件条多更行进要需果如 CASE 。句语 CASE 。单简样一 和用使句语 IF :子例的面上考参以可们我 2. mysql> CALL p13(1)// Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM t// +------+ | s1 | +------+ | 6| | 6| | 19 | +------+ 3 rows in set (0.00 sec) 。中 表到入插被 值,子例面上如, 值入传,后程过行执 1 19 t Question 题问 题问 题问 题问 ?么什是用作的 : CALL p13(NULL) // 题问 CALL?作动些那了做句语 个这:个一另 。出做内秒 在,断判码代据根以可也,么什了做 察观后行执过通以可你 SELECT 5 Answer 案答 案答 案答 案答 mysql> CALL p13(NULL)// Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM t// +------+ | s1 | +------+ | 6| | 6| | 19 | | 19 | +------+ 4 rows in set (0.00 sec) 值的 量变是因原。录记的 值数含包条一另了入插 p13 ,时 用调你当是案答 MySQL 19 variable1 ,来出不答回你果如。义意有家大对这望希。了行执被就分部 的句语 , 为 NULL CASE ELSE 。走下向续继以可们我,题问有没 Copyright 2005, MySQL AB 页 第 20 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL注关的业事 息信些这留保时载转请
  • 21. Loops 循环语句 WHILE ... END WHILE LOOP ... END LOOP REPEAT ... END REPEAT GOTO 及以环循 ,环循 :式方环循的准标种三有们我。环循些一建创会将们我面下 WHILE LOOP 使就了用,吧用要不好最:语者译( REPEAT :式方环循的准标非种一有还。环循 GO TO 。)乱混程流 WHILE ... END WHILE CREATE PROCEDURE p14 () BEGIN DECLARE v INT; SET v = 0; WHILE v < 5 DO INSERT INTO t VALUES (v); SET v = v + 1; END WHILE; END; // 。法语的新多很握掌要需不此因,似相句语 跟它,式方种这欢喜很我。式方的环循 WHILE 是这 IF 。出退会将环循候时的 于大 量变当,间之 INSERT SET 和 在句语 和 WHILE 的里这 END WHILE v 5 而, 为值量变认默,化始初有没果如,误错的见常个一止防了为使句语 "SET v = 0;" 用使 NULL NULL 。 为都果结作操值何任和 NULL WHILE ... END WHILE example mysql> CALL p14()// Query OK, 1 row affected (0.00 sec) 果结的 程过用调是就上以 p14 是回返统系注关用不 "one row affected" 是还 "five rows affected" 后最对只数计的里这为因, 。数计行进作动 个一 INSERT Copyright 2005, MySQL AB 页 第 21 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL注关的业事 息信些这留保时载转请
  • 22. WHILE ... END WHILE example: CALL mysql> select * from t; // +------+ | s1 | +------+ .... | 0| | 1| | 2| | 3| | 4| +------+ 9 rows in set (0.00 sec) 。行 了入插中库据数向序程到看以可后用调 5 REPEAT ... END REPEAT CREATE PROCEDURE p15 () BEGIN DECLARE v INT; SET v = 0; REPEAT INSERT INTO t VALUES (v); SET v = v + 1; UNTIL v >= 5 END REPEAT; END; // ,果结查检后行执在它于在别区。样一环循 REPEAT 面前和能功,子例的环循 个一是这 WHILE WHILE )吧 于同等能可:语者译(。查检前行执是则 而 DO WHILE REPEAT ... END REPEAT: look at the UNTIL: UNTIL的作用 : 的作用 CREATE PROCEDURE p15 () BEGIN DECLARE v INT; SET v = 0; REPEAT INSERT INTO t VALUES (v); SET v = v + 1; UNTIL v >= 5 <-- END REPEAT; END; // 到意注 UNTIL 。好更号分的外额上加你然当,号分写不以可里这在,号分有没面后句语 Copyright 2005, MySQL AB 页 第 22 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 23. REPEAT ... END REPEAT: calling :调用 mysql> CALL p15()// Query OK, 1 row affected (0.00 sec) mysql> SELECT COUNT(*) FROM t// +----------+ | COUNT(*) | +----------+ | 14 | +----------+ 1 row in set (0.00 sec) 录记行 了入插又后程过 用调到看以可们我 p15 5 LOOP ... END LOOP CREATE PROCEDURE p16 () BEGIN DECLARE v INT; SET v = 0; loop_label: LOOP INSERT INTO t VALUES (v); SET v = v + 1; IF v >= 5 THEN LEAVE loop_label; END IF; END LOOP; END; // 是上以 LOOP 和点这,件条始初要需不环循 。子例的环循 LOOP WHILE 它时同,似相环循 和又 REPEAT 。件条束结要需不也样一环循 LOOP ... END LOOP: with IF and LEAVE 包含 和LEAVE的LOOP循环 包含IF和 的 循环 CREATE PROCEDURE p16 () BEGIN DECLARE v INT; SET v = 0; loop_label: LOOP INSERT INTO t VALUES (v); SET v = v + 1; IF v >= 5 THEN <-- LEAVE loop_label; END IF; END LOOP; END; // 循开离是义意的句语 里这。句语 IF 含包中句语 在,句语 入加部内环循在 IF LEAVE LEAVE 一进面后在会我题问号标的句语环循于关,号标句语环循加 LEAVE LEAVE是法语的 。环 。解讲步 Copyright 2005, MySQL AB 页 第 23 信来请误错有如 chenpengyi_007@163.com 对您谢感时同,读阅和持支的您谢谢, MySQL 注关的业事 息信些这留保时载转请
  • 24. LOOP ... END LOOP: calling :调用 mysql> CALL p16()// Query OK, 1 row affected (0.00 sec) mysql> SELECT COUNT(*) FROM t// +----------+ | COUNT(*) | +----------+ | 19 | +----------+ 1 row in set (0.00 sec) 。中 表入插被行 另是果结,后 程过用调 p16 5 t Labels 标号 CREATE PROCEDURE p17 () label_1: BEGIN label_2: WHILE 0 = 1 DO LEAVE label_2; END WHILE; label_3: REPEAT LEAVE label_3; UNTIL 0 =0 END REPEAT; label_4: LOOP LEAVE label_4; END LOOP; END; // 我。子例的程过的号标句语个 含包个一有里这在现。号标句语了用使我中子例环循个一后最 4 的法合在能只号标句语,号标句语用使前句语 者或 BEGIN 、 WHILE REPEAT 、 在以可们 LOOP 。句语合复或句语的 为义定名号标句语开离着味意 此因。用使面前句语 "LEAVE label_3" label_3 End Labels 标号结束符 CREATE PROCEDURE p18 () label_1: BEGIN label_2: WHILE 0 = 1 DO LEAVE label_2; END WHILE label_2; label_3: REPEAT LEAVE label_3; UNTIL 0 =0 END REPEAT label_3 ; label_4: LOOP LEAVE label_4; END LOOP label_4 ; END label_1 ; // 。用有分十是不并符束结号标些这。样一用使时头开在和,号标句语用使时束结句语在以可也你 ,惯习程编的好良有了为然当样一字名号标的义定始开和须必们他,要需你果如。的选可是们它 。符束结号标用使是还好最,读阅人他便方 Copyright 2005, MySQL AB 页 第 24 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com 注关的业事 MySQL 息信些这留保时载转请
  • 25. LEAVE and Labels 跳出和标号 CREATE PROCEDURE p19 (parameter1 CHAR) label_1: BEGIN label_2: BEGIN label_3: BEGIN IF parameter1 IS NOT NULL THEN IF parameter1 = 'a' THEN LEAVE label_1; ELSE BEGIN IF parameter1 = 'b' THEN LEAVE label_2; ELSE LEAVE label_3; END IF; END; END IF; END IF; END; END; END;// LEAVE 。句语合复的杂复出跳序程使句语 ITERATE 代迭 代迭 代迭 代迭 是标目果如 ITERATE 到用须必就,话的句语)代迭( LEAVE 句语 CREATE PROCEDURE p20 () BEGIN DECLARE v INT; SET v = 0; loop_label: LOOP IF v = 3 THEN SET v = v + 1; ITERATE loop_label; END IF; INSERT INTO t VALUES (v); SET v = v + 1; IF v >= 5 THEN LEAVE loop_label; END IF; END LOOP; END; // 中言语 像点有它 ,用引环循的部内环循在是也样一句语 ITERATE 和句语)代迭( LEAVE C 思意)代迭( ,号标句语合复用引,中句语合复在现出以可它样同,” Continue “的 ITERATE 。句语合复始开新重是 :环循的程过代迭要需个是这,环循个这面下察观并动启们我那 Copyright 2005, MySQL AB 页 第 25 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 26. ITERATE: Walking through the loop 环循入深 环循入深 环循入深 环循入深 CREATE PROCEDURE p20 () BEGIN DECLARE v INT; SET v = 0; loop_label: LOOP <-- IF v = 3 THEN SET v = v + 1; ITERATE loop_label; END IF; INSERT INTO t VALUES (v); SET v = v + 1; IF v >= 5 THEN LEAVE loop_label; END IF; END LOOP; END; // 。来起行运环循的号标了义定经已个这让 ITERATE: Walking through the loop CREATE PROCEDURE p20 () BEGIN DECLARE v INT; SET v = 0; loop_label: LOOP IF v = 3 THEN <-- SET v = v + 1; ITERATE loop_label; END IF; INSERT INTO t VALUES (v); SET v = v + 1; IF v >= 5 THEN LEAVE loop_label; END IF; END LOOP; END; // v 。 到加增它把们我后然, 成变值的 3 4 ITERATE: walking through the loop CREATE PROCEDURE p20 () BEGIN DECLARE v INT; SET v = 0; loop_label: LOOP IF v = 3 THEN SET v = v + 1; ITERATE loop_label; <-- END IF; INSERT INTO t VALUES (v); SET v = v + 1; IF v >= 5 THEN Copyright 2005, MySQL AB 页 第 26 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 27. LEAVE loop_label; END IF; END LOOP; END; // 始开后然 ITERATE 。程过)代迭( ITERATE: walking through the loop CREATE PROCEDURE p20 () BEGIN DECLARE v INT; SET v = 0; loop_label: LOOP <-- IF v = 3 THEN SET v = v + 1; ITERATE loop_label; END IF; INSERT INTO t VALUES (v); SET v = v + 1; IF v >= 5 THEN LEAVE loop_label; END IF; END LOOP; END; // 的里这 ITERATE 。部头的环循了到回又环循让)代迭( ITERATE: walking through the loop CREATE PROCEDURE p20 () BEGIN DECLARE v INT; SET v = 0; loop_label: LOOP IF v = 3 THEN SET v = v + 1; ITERATE loop_label; END IF; INSERT INTO t VALUES (v); SET v = v + 1; IF v >= 5 THEN LEAVE loop_label; <-- END IF; END LOOP; END; // 行执将序程,时 为变值的 当 v 5 LEAVE 句语 ITERATE: walking through the loop CREATE PROCEDURE p20 () BEGIN DECLARE v INT; SET v = 0; loop_label: LOOP IF v = 3 THEN SET v = v + 1; Copyright 2005, MySQL AB 页 第 27 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 28. ITERATE loop_label; END IF; INSERT INTO t VALUES (v); SET v = v + 1; IF v >= 5 THEN LEAVE loop_label; END IF; END LOOP; END; // <-- LEAVE 。步一后最的句语合复达到令指行运使,环循出跳是就果结的 GOTO CREATE PROCEDURE p... BEGIN ... LABEL label_name; ... GOTO label_name; ... END; 号标立建里这在且而,句语 准标是不这然虽。句语 用使以可中程过储存的 MySQL GOTO SQL 我以所,汰淘被慢慢会句语个这,容兼 他其和了为于由。样一不的中例惯和也法方的 DBMS MySQL 。及提有没中册手考参 在们 Grand combination 合组大 合组大 合组大 合组大 CREATE PROCEDURE p21 (IN parameter_1 INT, OUT parameter_2 INT) LANGUAGE SQL DETERMINISTIC SQL SECURITY INVOKER BEGIN DECLARE v INT; label goto_label; start_label: LOOP IF v = v THEN LEAVE start_label; ELSE ITERATE start_label; END IF; END LOOP start_label; REPEAT WHILE 1 = 0 DO BEGIN END; END WHILE; UNTIL v = v END REPEAT; GOTO goto_label; END;// 块 ,数参性特,表列数参括包,法语有所的讲前之们我了含包句语的中子例面上 BEGIN/END 是这。 , , , , , IF, ,明声量变,句语合复 WHILE LOOP REPEAT LEAVE ITERATE GOTO 。法合分十却法语的面里是但。环循的尽无有面里为因,它行运会不我,程过储存的谬荒个一 。西东的新多更触接要将们我面下。句语明声量变和制控程流的新是些这 Copyright 2005, MySQL AB 页 第 28 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 29. Error Handling 异常处理 异常处理 要摘息信的页几面后 例样题问 Sample Problem 器理处常异 Handlers 件条 Conditions 理处常异是的讲要在现们我,了好 录记障故:例样题问 录记障故:例样题问 录记障故:例样题问 录记障故:例样题问 1. Sample Problem: Log Of Failures 很是例样题问的理处错出示展来用们我中件文志日在录记其将能望希我,时败失 INSERT 当 的误错些这下记中件文个一另在想我,时败失 当。录记的误错到得望希我。的通普INSERT 束约的联关键外反违将它是因原的趣兴感别特入插对我。等因原错出,间时错出如例,息信 2. Sample Problem: Log Of Failures (2) mysql> CREATE TABLE t2 s1 INT, PRIMARY KEY (s1)) engine=innodb;// mysql> CREATE TABLE t3 (s1 INT, KEY (s1), FOREIGN KEY (s1) REFERENCES t2 (s1)) engine=innodb;// mysql> INSERT INTO t3 VALUES (5);// ... ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails )息信错出的统系是的示显里这( 打是查检联关键外此因, 是的用使们我。表键外个一及以,表键主个一建创要始开我 InnoDB 很以可下件条种这然当。败失会将作动,时值的中表键主非入插中表键外向我当后然。的开 1216 。 号误错到找快 3. Sample Problem: Log Of Failures CREATE TABLE error_log (error_message CHAR(80))// 。表的误错储存时错出作动入插做在个一立建是就步一下 4. Sample Problem: Log Of Errors CREATE PROCEDURE p22 (parameter1 INT) BEGIN DECLARE EXIT HANDLER FOR 1216 INSERT INTO error_log VALUES (CONCAT('Time: ',current_date, '. Foreign Key Reference Failure For Value = ',parameter1)); INSERT INTO t3 VALUES (parameter1); END;// 意。的常异理处来用是 句语个一第的里这。序程的们我是就面上 DECLARE EXIT HANDLER 功成作动当是思意 。行一入插中表录记误错在会将序程个这,了生发 误错果如是思 1215 EXIT 。句语合复个这出退后交提 Copyright 2005, MySQL AB 页 第 29 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 30. 5. Sample Problem: Log Of Errors CALL p22 (5) // 息信误错有没是但。现出中表键主在有没并值 为因,常正很这,败失会程过储存个这用调 5 录记中表 是但,西东何任加增有没中表 。了中程过在含包经已理处错出为因回返 t3 error_log 。败失作动 们我诉告就这,息信些一了下 INSERT into table t3 DECLARE HANDLER syntax 声明异常处理的语法 声明异常处理的语法 异常 DECLARE { EXIT | CONTINUE } HANDLER FOR { error-number | { SQLSTATE error-string } | condition } SQL statement ,器理处种两许允 。码代的发触动自后错出序程当段一是就也,法用的理处误错是就面上 MySQL ,理处 ,的示演要将们我是就种一另。种这是就的用所才刚们我,理处 是种一 EXIT CONTINUE 出有没就句语合复个这么那,行运续继然仍序程主原,后行执它于在同不,似类理处 跟它 EXIT 。了口 子例理处 子例理处 子例理处 子例理处 1. DECLARE CONTINUE HANDLER example CONTINUE CREATE TABLE t4 (s1 int,primary key(s1));// CREATE PROCEDURE p23 () BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; SET @x = 1; INSERT INTO t4 VALUES (1); SET @x = 2; INSERT INTO t4 VALUES (1); SET @x = 3; END;// 的上册手考参 MySQL是这 CONTINUE 。里这到贝拷它把我以所,好分十子例个这,子例的理处 出看以可们我子例个这过通 CONTINUE 。的作工何如是理处 2. DECLARE CONTINUE HANDLER 理处常异 理处常异 理处常异 理处常异 CONTINUE 明声 明声 明声 明声 CREATE TABLE t4 (s1 int,primary key(s1));// CREATE PROCEDURE p23 () BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; <-- SET @x = 1; INSERT INTO t4 VALUES (1); SET @x = 2; INSERT INTO t4 VALUES (1); SET @x = 3; END;// 为将我次这 SQLSTATE ?吗 码代误错 的用使们我面前得记还。序程理处个一义定值 MySQL 1216 的里这上实事 23000SQLSTATE。了用调被就错出束约键主或错出束约键外当,的用常更是 Copyright 2005, MySQL AB 页 第 30 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com 注关的业事 MySQL 息信些这留保时载转请
  • 31. 3. DECLARE CONTINUE HANDLER CREATE TABLE t4 (s1 int,primary key(s1));// CREATE PROCEDURE p23 () BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; SET @x = 1; <-- INSERT INTO t4 VALUES (1); SET @x = 2; INSERT INTO t4 VALUES (1); SET @x = 3; END;// 是句语的行执个一第的程过储存个这 "SET @x = 1" 。 4. DECLARE CONTINUE HANDLER example CREATE TABLE t4 (s1 int,primary key(s1));// CREATE PROCEDURE p23 () BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; SET @x = 1; INSERT INTO t4 VALUES (1); SET @x = 2; INSERT INTO t4 VALUES (1); <-- SET @x = 3; END;// 。中表键主到入插被 值后行运 1 5. DECLARE CONTINUE HANDLER CREATE TABLE t4 (s1 int,primary key(s1));// CREATE PROCEDURE p23 () BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; SET @x = 1; INSERT INTO t4 VALUES (1); SET @x = 2; <-- INSERT INTO t4 VALUES (1); SET @x = 3; END;// 。 为变值的 后然 @x 2 6. DECLARE CONTINUE HANDLER example CREATE TABLE t4 (s1 int,primary key(s1));// CREATE PROCEDURE p23 () BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; SET @x = 1; Copyright 2005, MySQL AB 页 第31 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 32. INSERT INTO t4 VALUES (1); SET @x = 2; INSERT INTO t4 VALUES (1); <-- SET @x = 3; END;// 。制限性一唯有键主为因,了败失但,值数入插中表键主往次再试尝序程后然 7. DECLARE CONTINUE HANDLER example CREATE TABLE t4 (s1 int,primary key(s1));// CREATE PROCEDURE p23 () BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; <-- SET @x = 1; INSERT INTO t4 VALUES (1); SET @x = 2; INSERT INTO t4 VALUES (1); SET @x = 3; END;// 语的理处误错是句语的行执个一下。理处误错行进始开,发触被序程理处误错,败失入插于由 @x2 2 。 为设被 ,句 8. DECLARE CONTINUE HANDLER example CREATE TABLE t4 (s1 int,primary key(s1));// CREATE PROCEDURE p23 () BEGIN DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; SET @x = 1; INSERT INTO t4 VALUES (1); SET @x = 2; INSERT INTO t4 VALUES (1); SET @x = 3; <-- END;// 是这为因,束结有没并里这到 CONTINUE ,后之句语入插的败失到回返行执以所。理处常异 。作动 为定设 将行执续继@x 3 9. DECLARE CONTINUE HANDLER example mysql> CALL p23()// Query OK, 0 rows affected (0.00 sec) mysql> SELECT @x, @x2// +------+------+ | @x | @x2 | +------+------+ |3 |1 | +------+------+ 1 row in set (0.00 sec) 以可里这从 。 为,值的 察观 , 是道知以可的定确很,值的 察观们我后程过行运 @x 3 @x2 1 让,器理处误错整调去间时点花以可家大。行进路思的们我照按全完,误无行运序程断判 ,乱紊很序程来起看样那然虽,方地的误错 现出能可在放是不而,部首的段句语在放查检 。楚清很也全安很码代的样这是但。觉感的去跳来跳 Copyright 2005, MySQL AB 页 第 32 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL 注关的业事 息信些这留保时载转请
  • 33. 1. DECLARE CONDITION CREATE PROCEDURE p24 () BEGIN DECLARE `Constraint Violation` CONDITION FOR SQLSTATE '23000'; DECLARE EXIT HANDLER FOR `Constraint Violation` ROLLBACK; START TRANSACTION; INSERT INTO t2 VALUES (1); INSERT INTO t2 VALUES (1); COMMIT; END; // 误错者或 给可你上实事。的改修上础基的面前在,子例的理处误错个一外另是这 SQLSTATE 我:的现实么怎是它看看面下。了字名的义定己自用使中理处在以可就你,字名的他其码代 t2, 滚回( ) 会都作操入插的表个这对以所,表 InnoDB 为义定 表把 ROLLBACK ROLLBACK 误错 致导会值的样同个两入插键主对为因。的生发会好恰是也)务事滚回( SQLSTATE 23000 。误错束约是 SQLSTATE 23000 里这,生发 2. DECLARE CONDITION 件条明声 件条明声 件条明声 件条明声 CREATE PROCEDURE p24 () BEGIN DECLARE `Constraint Violation` CONDITION FOR SQLSTATE '23000'; DECLARE EXIT HANDLER FOR `Constraint Violation` ROLLBACK; START TRANSACTION; INSERT INTO t2 VALUES (1); INSERT INTO t2 VALUES (1); COMMIT; END; // 致导会误错束约个这 ROLLBACK 和)务事滚回( SQLSTATE 23000 。生发误错 3. DECLARE CONDITION mysql> CALL p24()// Query OK, 0 rows affected (0.28 sec) mysql> SELECT * FROM t2// Empty set (0.00 sec) 。录记何任入插有没 表到看们我果结面上从,么什是果结看看程过储存个这用调们我 t2 。的要想们我是正这。了滚回都务事部全 4. DECLARE CONDITION mysql> CREATE PROCEDURE p9 () -> BEGIN -> DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END; -> DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; -> DECLARE EXIT HANDLER FOR SQLWARNING BEGIN END; -> END;// Query OK, 0 rows affected (0.00 sec) :件条的明声预个三是里这 NOT FOUND (行到不找 ), SQLEXCEPTION (误错 ), Copyright 2005, MySQL AB 页 第33 信来请误错有如 chenpengyi_007@163.com对您谢感时同,读阅和持支的您谢谢, MySQL注关的业事 息信些这留保时载转请
  • 34. 。用使以可就件条明声要需不此因,的明声预是们它为因。 释注或告警 SQLWARNING ( ) 到得会将你, :明声的样这做去你果如过不 "DECLARE SQLEXCEPTION CONDITION ..." 。示提息信误错 Cursors 游标 :要摘能功现实标游 DECLARE cursor-name CURSOR FOR SELECT ...; OPEN cursor-name; FETCH cursor-name INTO variable [, variable]; CLOSE cursor-name; 是但,现实的整完有没并还法语标游的中程过储存的们我然虽。了标游眼着始开们我在现 。标游闭关,取读里标游从,标游开打,标游明声如务事的本基成完以可经已 1. Cursor Example CREATE PROCEDURE p25 (OUT return_val INT) BEGIN DECLARE a,b INT; DECLARE cur_1 CURSOR FOR SELECT s1 FROM t; DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1; OPEN cur_1; REPEAT FETCH cur_1 INTO a; UNTIL b = 1 END REPEAT; CLOSE cur_1; SET return_val = a; END;// 。子例新的程过储存的标游含包下一看们我 2. Cursor Example CREATE PROCEDURE p25 (OUT return_val INT) BEGIN DECLARE a,b INT; <-- DECLARE cur_1 CURSOR FOR SELECT s1 FROM t; DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1; OPEN cur_1; REPEAT FETCH cur_1 INTO a; UNTIL b = 1 END REPEAT; CLOSE cur_1; SET return_val = a; END;// ,明声量变行进要先首。的要重分十是序顺,下一说带附。量变个三了明声始开程过个这 ,明声序顺按有没你果如。器理处误错明声是才面后再,标游明声后随,件条明声后然 。息信误错示提会统系 Copyright 2005, MySQL AB 页 第34 信来请误错有如 对您谢感时同,读阅和持支的您谢谢, chenpengyi_007@163.com MySQL注关的业事 息信些这留保时载转请