存储过程,数组游标

这个存储过程主要涉及了游标和数组,主要是数组吧。我想把业务介绍一下,以便大家阅读代码,
突然想到写之前自己写了点文码,直接贴这个吧。后面多谢了些注释,都是程序员的语言-你懂的。
后期需求变更的修改的话可能会用到返回结果集:http://blog.163.com/panqbi@yeah/blog/static/13062014920102454315771/
先把参考网站贴出来   最终 要的是这句:open result for sqlText;   以后再说吧,但愿别变更。

思路: 首先找出状态在借出的所有备件的Ids
select id from T_BNS_SP sp where sp_state='借出' succ
使用游标遍历所有的id 
将id 拼接成为三个变量   “,”+str     str   str+","
查出相关ownerid
select sm.owner_id from T_BNS_SP_BORROW_MAIN   sm where instr(sm.sp_id ,',834')>0   or   instr(sm.sp_id ,'834,') >0 or sm.sp_id='834';   succ
将sm.owner_id 放入一个数组,返回该数组


===========华丽的分割线==============




--之前需要在命令行里建立好的数组类型
CREATE OR REPLACE TYPE USERID_ARRAY AS VARRAY(50000) of VARCHAR2(10);


--存储过程部分正式开始
create or replace procedure pro_borrow_alarm(user_ids out USERID_ARRAY )   is
user_id     VARCHAR2(20); --使用人,向数组user_ids里面所添加的元素
sp_id   VARCHAR2(10); --配件Id

---where 条件 ;(instr(sm.sp_id ,sp_id_prefix)>0   or   instr(sm.sp_id ,sp_id_suffix) >0
---因为有些人借了两个或多个东西,在数据库字段里sp_id1,sp_id2......的形式表现了出来
sp_id_prefix   VARCHAR2(10); 
sp_id_suffix   VARCHAR2(10);

CURSOR CUR_SP_IDS IS --声明显式游标  
    select id from T_BNS_SP sp where sp_state='借出' ; --业务内容,查询已经借出的物品Id
    SP CUR_SP_IDS%ROWTYPE; --定义游标变量,该变量的类型为基于游标CUR_SP_IDS的记录 
   
    --这一步非常的恶心for 中的Ins 不是Int类型,需要一个同步变量。那Ins到底是什么,我差点为这事跳楼
    i BINARY_INTEGER := 0; 
   
begin
    user_ids := USERID_ARRAY();--初始化数组必须有
    --用for循环的方式遍历游标,其他的暂不介绍了
    for ins in CUR_SP_IDS loop    
        sp_id:= SP.id;
        sp_id_prefix:= SP.id||','; 
        sp_id_suffix:= ','||SP.id;
        select sm.owner_id into user_id   from T_BNS_SP_BORROW_MAIN   sm where (instr(sm.sp_id ,sp_id_prefix)>0   or   instr(sm.sp_id ,sp_id_suffix) >0 or sm.sp_id=sp_id) and   (sysdate - sm.start_time)>30 and rownum = 1;
        i:=i+1;
        --以上内容不解释,应该很清楚了,不懂的话可以留言
   
  user_ids.EXTEND;--如果不加执行的时候会报ORA-06533,实际上集合没有存储空间
        user_ids(i):=user_id;--为数组赋值的方式
       
    end loop; 
 
end ;
/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值