mysql 存储过程 游标

以下的文章主要介绍的是MySQL游标的使用笔记,其可以用在存储过程的SQL语句,其主要类型主要有以下几种,以下就是对其详细介绍,相信如果你掌握了这项技术,会在以后的学习或是工作中带来很大的帮助。

1、 无返回结果语句,如:INSERT,UPDATE,DROP, DELETE等

2、 select语句返回单行变量并可传给本地变量(select ..into)

 

3、 返回多行结果集的select语句,并可使用MySQL游标循环处理

 

注意,存储过程返回的多行结果集,可以被客户端程序(如php)所接收,但要在一个存储过程中接收另一个存储过程的结果集是不可能的,一般解决办法是存入临时表供其它过程共用

4、 prepare语句

 

以下主要讲述游标及prepare部分

游标 定义

 

DECLARE cursor_name CURSOR FOR SELECT_statement; 

 

 游标操作   OPEN 打开游标

 

OPEN cursor_name; 

 

  FETCH 获取游标当前指针的记录,并传给指定变量列表,注意变量数必须与MySQL游标返回的字段数一致,要获得多行数据,使用循环语句去执行FETCH

 

FETCH cursor_name INTO variable list;

 

 CLOSE关闭游标

 

CLOSE cursor_name ;

 

 注意:MySQL的游标是向前只读的,也就是说,你只能顺序地从开始往后读取结果集,不能从后往前,也不能直接跳到中间的记录.

 

一个完整的例子:

定义本地变量

DECLARE o varchar(128);

 

 定义游标

 

DECLARE ordernumbers CURSOR  
FOR  
SELECT callee_name FROM account_tbl where acct_timeduration=10800;  
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1;  
SET no_more_departments=0; 

 

 打开游标

 

OPEN ordernumbers;

 

 循环所有的行

 

REPEAT  
-- Get order number  
FETCH ordernumbers INTO o;  
update account set allMoneyallMoney=allMoney+72,lastMonthConsumelastMonthConsume=lastMonthConsume-72 where NumTg=@o;  

 

 循环结束

UNTIL no_more_departments  
END REPEAT;

 

 关闭游标

 

CLOSE ordernumbers; 

 

 变量定义:

 

declare variable_name [,variable_name...] datatype [default value];

其中,datatype为mysql的数据类型,如:int, float, date, varchar(length)

例:

declare l_int int unsigned default 4000000; declare l_numeric numeric(8,2) default 9.95; declare l_date date default '1999-12-31'; declare l_datetime datetime default '1999-12-31 23:59:59'; declare l_varchar varchar(255) default 'this will not be padded';

变量赋值

set 变量名 = 表达式值 [,variable_name = expression ...]
 

参数

mysql存储过程的参数用在存储过程的定义,共有三种参数类型,in,out,inout

create procedure|function([[in |out |inout ] 参数名 数据类形...])

 

in 输入参数

表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

out 输出参数

该值可在存储过程内部被改变,并可返回

inout 输入输出参数

调用时指定,并且可被改变和返回

 

建存储过程:

 

语法:

create procedure p()

begin

 

end  
create procedure productpricing()

begin

    select avg(pro_price) as priceaverage

    from products;

end;

# begin…end之间是存储过程的主体定义

# mysql的分界符是分号(;) 

                        

调用存储过程的方法是:

 

# call加上过程名以及一个括号

# 例如调用上面定义的存储过程

call productpricing();

 

/*初始化*/  drop procedure if exists  useCursor //     
/*建立 存储过程 create */ 
 CREATE PROCEDURE useCursor() 
BEGIN
  /*局部变量的定义 declare*/   
 declare tempName varchar(50) DEFAULT '';
 /*局部变量的定义 生命长度 设置默认值 declare*/   
 declare allName VARCHAR(4000) DEFAULT '';
  /*创建游标*/
 declare cur1 CURSOR for select username from trade_01.f_user;
 /*  设置游标异常 捕捉捕获异常停止游标  
 *   并设置 循环使用 变量 tmpname 为 null 跳出循环。*/ 
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET tempName = NULL; 
/*开始游标*/
 OPEN cur1;
/*游标向下走一步*/
 FETCH cur1 INTO tempName;
/*循环游标*/
 WHILE (tempName is not null) DO
 set tempName=CONCAT(tempName,";");
/*拼接名称*/
 set allName= CONCAT(allName,tempName);
 FETCH cur1 INTO tempName;
 END WHILE;
/*关闭游标*/
 CLOSE cur1;
 /*输出拼接名称*/
 select allName;
 END
/*调用存储过程*/
call useCursor()//

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值