快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡亰集团_龟发之家论坛



作者:mysql AB;翻译:陈朋奕

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标准中把这个定义为非核心的,即可选组件。

在历程体中有一个约束,便是不能有对例程或表操作的数据库操作语句。例如下面的例子便是不法的:

CREATE PROCEDURE p1 ()

CREATE PROCEDURE p2 () DELETE FROM t; //

下面这些对MySQL 5.0来说全新的语句,历程体中是不法的:

CREATE PROCEDURE, A澳门新葡亰集团LTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION,

DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER.

不过你可以应用

CREATE PROCEDURE db5.p1 () DROP DATABASE db5//

然则类似

"USE database"

语句也是不法的,由于MySQL假定默认数据库便是历程的事情场所。

Call the Procedure 调用存储历程

1.

现在我们就可以调用一个存储历程了,你所必要输入的整个便是CALL和你历程名以及一个括号再一次强调,括号是必须确当你调用例子里面的p1历程时,结果是屏幕返回了t表的内容

mysql> CALL p1() //

+------+

| s1 |

+------+

| 5 |

+------+

1 row in set (0.03 sec)

Query OK, 0 rows affected (0.03 sec)

由于历程中的语句是

"SELECT * FROM t;"

2. Let me say that again, another way.

其他实现要领

mysql> CALL p1() //

和下面语句的履行效果一样:

mysql> SELECT * FROM t; //

以是,你调用p1历程就相称于你履行了下面语句:

"SELECT * FROM t;"

好了,主要的常识点"创建和调用历程措施"已经清楚了。我盼望你能对自己说这相称简单。然则很快我们就有一系列的演习,每次都加一条子句,或者改变已经存在的子句。那样在写繁杂部件前我们将会有很多可用的子句。

Characteristics Clauses 特性质句

1.

CREATE PROCEDURE p2 ()

LANGUAGE SQLcall 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语句被履行返回我们期望得到的随机数。

Digression: sql_mode unchanging

不会改变的

sql_mo澳门新葡亰集团de

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'"

语句

MySQL

mysql> CREATE PROCEDURE p4 () SELECT 'Hello, world' //

Query OK, 0 rows affected (0.00 sec)

mysql> CALL p4()//

+--------------+

| Hello, world |

+--------------+

| He澳门新葡亰集团llo, 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)。

第三个例子中有一个输出参数,第四个例子中有一个参数,既能作为输入也可以作为输出。

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.

这个语句将不会被调用

*/

完成历程体的构造便是BEGIN/END块。这个BEGIN/END语句块和Pascal说话中的BEGIN/END是基真相同的,和C说话的框架是很相似的。我们可以应用块去封装多条语句。在这个例子中,我们应用了多条设定会话变量的语句,然后完成了一些insert和select语句。假如你的历程体中有多条语句,那么你就必要BEGIN/END块了。BEGIN/END块也被称为复合语句,在这里你可以进行变量定义和流程节制。

未完待续...

您可能还会对下面的文章感兴趣: