MYSQL存储过程中的参数主要有局部参数和会话参数两种,又称局部变量和会话变量。
局部标量只在定义该局部变量的begin...end范围内有效,会话变量在整个存储过程范围内均有效。
1.局部变量
局部变量以关键字declare声明,后跟变量名和变量类型,例:
declare a int
在声明局部变量时,也可用关键字default 为变量指定默认值,未设置时默认值为NULL。例:
declare a int default 10
例局部变量与存储过程:
delimiter//
create procedure pl()
begin
declare x char(10) default 'outer';
begin
declare x char(10) default 'inner';
seclect x;
end;
select x;
end
//
调用存储过程call pl()//
第一次x值为inner,第二次x值为outer。
2.全局变量
MYsql中会话变量不必声明即可使用,并在整个存储过程中都有效,会话变量名以字符‘@’作为
起始字符。例:
delimiter//
create procedure p2()
begin
set @t=1;
begin
set @t=2;
select @t;
end;
select @t;
end
//
调用该存储过程call p2()//
两次@t的值均为2.
MYSQL中使用set关键字为变量赋值:
set var_name=expr[,var_name=expr]...
另一种赋值语句为:
select col_name[,...] into var_name[,...] from table_name where condition
表示将查询结果赋值给变量var_name.
光标的运用
通过MYSQL查询数据库,其结果可能为多条记录。在存储过程和函数中使用光标可以实现逐条读取
结果集中的记录。光标使用包括声明光标(declare cursor)、打开光标(open cursor)、使用
光标(fetch cursor)和关闭光标(close cursor)。光标声明必须在处理程序之前,且声明在变量和
条件之后。
1.声明光标
declare cursor_name cursor for select_statement
其中 cursor_name是光标的名称。select_statement是一个select语句,返回一行或多行数据。
其中这个语句也可以在存储过程中定义多个光标,但是必须保证每个光标名称的唯一性。例:
declare info_of_student cursor for select
sid,name,age,sex,age from studentinfo
where sid= 1;
这里的select 子句不能包含into子句,并且光标只能在存储过程或存储函数中使用,上述代码
不能单独执行。
打开光标open cursor_name ,
在一个程序中,一个光标可以被打开多次。由于可能在用户打
开光标后,其他用户或程序正在更新数据表,可能导致用户在每次打开光标后,显示的结果都
不同。
使用光标
光标在打开后可使用:fetch cursor_name into var_name[,var_name]...
其中cursor_name 代表已经打开的光标的名称;var_name参数表示将光标中的select语句
查询出来的信息存入该参数中。var_name 是存放数据的变量名,必须在声明光标前定义好。
fetch...into 语句与select...into语句具有相同的意义。
将已打开的光标info_of_student中select 语句查询出来的信息存入tmp_name和tmp_tel中。
其中tmp_name和tmp_tel必须在使用前定义。其代码如下:
fetch info_of_student into tmp_name,tmp_tel;
关闭光标
光标使用完毕后要及时关闭。对于已关闭的光标,不能再使用fetch来使用。
close cursor_name