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 息信些这留保时载转请
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注关的业事 息信些这留保时载转请