cursor的两种使用方法举例

在一次培训中,我很"狂妄"的对参加的同事说,现在的研发不懂sql的,他只懂对象操作,你别让他改sql... 其实那一刻,我是深深的无奈。

这次翻出了很多尘封的笔记,包括我在技术成长蹒跚学步阶段的许许多多范例... 事实证明,优秀的程序员永远都是SI成长的良师,这是多年前我司一位优秀的程序员mm写的两段procedure,引领我进入了自主编写PLSQL代码的天地。曾经有很长一段时间,我都不敢宣称自己会写PLSQL代码,因为一直没耐心看语法看书,除了Oracle Online Document的E文文档外,我也没找到更好更合适的教材。每一次要用的时候,我就翻出这两段procedure参考,然后依葫芦画瓢...

今天贴出来,以纪念我司高手辈出的那个年代,纪念我从小小白成长为普通小白的那个年代...

DECLARE
    --Acct data for update cursor
  CURSOR curAcct
  IS
    select * FROM Acct where encodestr is null
    FOR UPDATE;
 
  --get node parent 嵌套cursor
  CURSOR curNode ( numNodeId NUMBER )
  IS
    select *
      FROM Node
     START WITH nodeid = numNodeId CONNECT BY PRIOR parent_node = nodeid;
 
  recAcct  Acct%ROWTYPE;
  recNode        Node%ROWTYPE;
  varEncodeStr   Varchar(256);
BEGIN
--for方式双层嵌套引用cursor
 FOR recAcct IN curAcct LOOP 
  varEncodeStr := '';
  FOR recNode IN curNode(recAcct.NODE_ID) LOOP
      varEncodeStr := recNode.NODEID ||'-'|| varEncodeStr;
  
   EXIT WHEN recNode.PARENT_NODE = 0;
     END LOOP;
 
  update Acct
     SET EncodeStr = varEncodeStr
   WHERE ID = recAcct.ID;
 END LOOP;
 
 COMMIT;
EXCEPTION
    WHEN OTHERS THEN
 ROLLBACK;
END;
/
--set cstm and enduser Encodestr
DECLARE
    v_adls_pa number(2);  
    v_163_pa  number(2);  
    v_cash_pa number(2);
    v_prom_pa   number(2);
    v_cus_id  cstm.Id%TYPE;
    v_user_id EndUser.Id%TYPE;
    v_encode  Acct.ENCODESTR%TYPE;
   
    CURSOR cur_general_pa
    IS
      select cus.id,
             cus.enduserid,
             pa.encodestr
        FROM cstm cus, Acct pa, cstm2Acct c2p
       WHERE cus.id=c2p.cstmid
         and pa.id=c2p.Acctid
         and cus.encodestr is null 
         and pa.type = 1                  
       UNION
      select cus.id,
             cus.enduserid,
             pa.encodestr
        FROM cstm cus, Acct pa, cstm2Acct c2p
       WHERE cus.id=c2p.cstmid
         and pa.id=c2p.Acctid
         and cus.encodestr is null 
         and pa.type = 2                
   ;
  
    CURSOR cur_cash_pa
    IS     
      select cus.id,
             cus.enduserid,
             pa.encodestr
        FROM cstm cus, Acct pa, cstm2Acct c2p
       WHERE cus.id=c2p.cstmid
         and pa.id=c2p.Acctid 
         and pa.type= 3
         and cus.encodestr is null
          ;
                                             
BEGIN

--open方式引用cursor
  OPEN cur_general_pa;
  LOOP   
    FETCH cur_general_pa INTO v_cus_id, v_user_id, v_encode;
 IF (cur_general_pa%NOTFOUND) THEN
    EXIT;
    END IF;
    update cstm set encodestr=v_encode where id=v_cus_id;
    update enduser  set encodestr=v_encode where id=v_user_id;
 COMMIT;
  END LOOP;
  CLOSE cur_general_pa;
 
  OPEN cur_cash_pa;
  LOOP   
    FETCH cur_cash_pa INTO v_cus_id, v_user_id, v_encode;
 IF (cur_cash_pa%NOTFOUND) THEN
    EXIT;
    END IF;
    update cstm set encodestr=v_encode where id=v_cus_id;
    update enduser  set encodestr=v_encode where id=v_user_id;
 COMMIT;
  END LOOP;
  CLOSE cur_cash_pa;
  
EXCEPTION
    WHEN OTHERS THEN
 ROLLBACK;
END;
/

不解释,有需要的自己慢慢看吧。信息量极为丰富,程序体整体结构,如何定义变量,如何赋值,if语句,for循环,exception程序段,cursor的不同调用方式,cursor嵌套调用,md,甚至连递归查询的大牛语句都有... 怪不得我可以靠着它们坐吃山空那么长时间...



Link URL: http://echo.sharera.com/blog/BlogTopic/73688.htm

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26127/viewspace-676115/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26127/viewspace-676115/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值