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 |
+--------------+
| 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)。
第三个例子中有一个输出参数,第四个例子中有一个参数,既能作为输入也可以作为输出。
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块也被称为复合语句,在这里你可以进行变量定义和流程控制。
未完待续...
MySQL 5.0 新特性教程 存储过程:第二讲
0
相关文章