首页 > 代码库 > sql 游标
sql 游标
1、存储过程中有专门的定义域,在begin后。有些时候你要查询数据库,而查询的条件是要在你设置之后才进行查询的,这时候照样是不能把定义该游标放在这个设置之后,其实前面定义游标只做定义,不会进行查询,只有当你取游标的时候才会进行查询,这时候你设的值自然就进去了!
2、定义游标的查询语句比较慢,或者说可能会查询会锁表,我们要用查询语句后加上with ur,防止查询锁表。
3、定义域最后可以定义异常处理
declare exit handler for sqlexception begin values(SQLSTATE, SQLCODE) into p_o_sqlstate, p_o_sqlcode; set P_O_RESULT = ‘EXECUTION FAILED‘; end;
这里当存储过程执行异常,会自动运行到这里,讲异常状态跟code设置到相应的字段里:values(SQLSTATE, SQLCODE) into p_o_sqlstate, p_o_sqlcode
4、循环取数据的时有多种循环方法,比如
a、while do
end while;
b、cmpd1:loop
leave cmpd1;--数据没了,结束loop,离开loop
iterate cmpd1;--结束当前的,继续下一个
end loop cmpd1;
5、游标的用法,打开游标,然后取值,最后关闭,一般取游标的值都是跟循环语句联合用的
OPEN cur_mcht_day_payType_income;
FETCH cur_mcht_day_payType_income into v_merchant_id,v_total_order_amount,v_totalcount,v_fee,v_total_mcht_settle_fee,v_pay_type;
close cur_mcht_day_payType_income;
6、游标跟循环语句联合用
open cs_batch_date; cmpd1:loop
set v_batchDate=null; FETCH cs_batch_date INTO v_batchDate; if v_batchDate is null then leave cmpd1; end if;
SET v_p_i_timestamp = char(v_batchDate)||‘ 00:00:00‘; call MCHT_DAILY_REVENUE_REPORT(v_p_i_timestamp,P_O_SQLSTATE,P_O_SQLCODE,P_O_RESULT); set RESULT = RESULT+1;
end loop cmpd1;
close cs_batch_date;
sql 游标