存储过程(一) 基础语句块、参数、变量
来源:互联网 发布:excel2010软件下载 编辑:程序博客网 时间:2024/06/04 20:02
最近在学习mysql存储过程,简单整理了下自己看过的一些内容,跟各位分享。
基础语句块介绍:
LANGUAGE SQL
NOT DETERMINISTIC,
该字句是传递给系统的信息。这里一个确定过程的定义,就是那些每次输入一样输出也一样的程序。在这个案例中,既然主体中含有 SELECT 语句,
那返回肯定是未知的,因此我们称其 NOT DETERMINISTIC。但是MySQL内置的优化程序不会注意这个,至少在现在不注意。
DETERMINISTIC
SQL SECURITY,可以定义为 SQL SECURITY DEFINER 或SQL SECURITYINVOKER---权限控制的领域:
SQL SECURITY DEFINER告诉服务器在调用时检查创建过程用户的权限
SQL SECURITY INVOKER告诉MySQL服务器在定义和调用时过程时,都要检查用户权限。
begin ... end
完成过程体的构造就是 BEGIN/END 块。我们可以使用块去封装多条语句。如下所示实例,我们使用了多条设定会话变量的语句,然后完成了一些 insert 和 select语句。如果你的过程体中有多条语句,那么你就需要 BEGIN/END块了。BEGIN/END 块也被称为复合语句,在这里你可以进行变量定义和流程控制(顺序、选择、循环)。 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.
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 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 值是从过程中传出的。
begin
set c=a+ b;
end;
调用过程:
call sp_add (1,2,@a);
select @a;
Variables 变量
在复合语句中声明变量的指令是 DECLARE。
(1) Example with two DECLARE statements,
(2) Example with no DEFAULT clause and SET statement
CREATE PROCEDURE p8 ()
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;
在过程中定义的变量并不是真正的定义,你只是在 BEGIN/END 块内定义了而已(译注:也就是形参)。注意这些变量和会话变量不一样,不能使用修饰符@,你必须清楚的在
BEGIN/END 块中声明变量和它们的类型。变量一旦声明,你就能在任何能使用会话变量、文字、列名的地方使用。有很多初始化变量的方法。如果没有默认的子句,那么变量的初始值为 NULL。你可以在任何时候使用 SET 语句给变量赋值。
(3)Example with DEFAULT clause
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 |
+--------+
结果显示了过程能正常工作
(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 语句时,内部变量消失,此时已经在其作用域外,变量不再可见了,因此在存储过程外再也不能找到这个声明了的变量,但是你可以通过 OUT 参数或者将其值指派给会话变量来保存其值。调用作用域例子的过程:
mysql> CALL p11()
+-------+
| x1 |
+-------+
| inner |
+-------+
+-------+
| x1 |
+-------+
| outer |
+-------+
我们看到的结果时,第一个 SELECT 语句检索到最内层的变量,第二个检索到第二层的变量。
变量的种类
1)局部变量 2)用户自定义变量
局部变量必须声明后再使用;
用户自定义变量可以直接使用。
变量的声明方式:
DECLARE var_name [, var_name] ... type [DEFAULT value] (局部变量)
SET @var_name = expr [, @var_name = expr] ...(用户自定义变量)
赋值的方法:
第一种:SET var_name = expr [, var_name = expr] ...
例:Declare a int; set a := 100;
第二种:SELECT col_name [, col_name] ... INTO var_name [, var_name] ...
table_expr
例:Declare x int; select id into x from test.t1;
0 0
- 存储过程(一) 基础语句块、参数、变量
- oracle 存储过程以及plsql语句块
- mysql 存储过程 (一) 基础
- 存储过程 函数(基础一)
- 执行字符串SQL语句--带有参数的存储过程以及 int类型的字符串变量注意事项
- Mysql存储过程--变量,参数,注释
- Mysql存储过程--变量,参数,注释
- mysql基础---存储过程及变量定义(十)
- 存储过程中执行参数SQL语句
- PL/SQL语句块基本语法(ORACLE存储过程,函数,包,游标)
- PL/SQL语句块基本语法(ORACLE存储过程,函数,包,游标)
- PL/SQL语句块基本语法(ORACLE存储过程,函数,包,游标)
- 存储过程块中为何不可使用DDL语句?
- 存储过程块
- 存储过程(一)
- 存储过程(一)
- 存储过程(一)
- 存储过程(一)
- Linux 进程通信(System V)管道
- 3.2一Wnd窗口基类的设计
- JS将时间截转成时间格式
- iOS多线程的初步研究(三)-- NSRunLoop
- HDU 1596(find the safest road) 最短路(SPFA&FLOYD&Dijkstra)
- 存储过程(一) 基础语句块、参数、变量
- iOS多线程的初步研究(四)-- NSTimer
- hadoop全分布模式的详细操作
- Linux 进程通信(System V)消息队列
- hdu1864(最大报销额 DP动态规划)
- oauth2.0认证和授权原理以及视频教程
- LVS的DR模型工作流程从ip数据层的详细分析
- Cocos| 3D建模规范及注意事项
- log4js multiprocess appenders 的配置