Oracle sql和过程的总结

1、  递归

start with ...connect by 的用法, start with 后面所跟的就是就是递归的种子。

递归的种子也就是递归开始的地方 connect by 后面的"prior" 如果缺省:则只能查询到符合条件的起始行,并不进行递归查询;

connect by prior 后面所放的字段是有关系的,它指明了查询的方向。没有start with 也是可以的


在实际中又发现了没有具体某一个数据作为开始节点,整个表都想作为开始节点,结果很悲剧,出来的并不是自己想要的结果。

总结了下,这个递归语句只能根据具体的某一个start with 具体值   返回的是具有关联关系的记录。

针对这种需求,可以这样实现,写一个过程入参为“start with 后面跟的具体值”    出参就是递归后的结果。示例如下:

create or replace function sp_get_child_team(p_vc_team_no IN HsCrmType.VC20%Type)
  RETURN type_constraintpdt  /*CREATE OR REPLACE TYPE type_constraintpdt IS TABLE OF NUMBER (10);*/
  PIPELINED as
  var_vc_team_no   HsCrmType.VC20%Type;
  v_vc_team_no     HsCrmType.VC20%Type;
  v_cursor         HsCrmType.t_cursor;

begin
  v_vc_team_no := nvl(p_vc_team_no,' ');

  open v_cursor for
  select b.l_serial_no from brokerteam b
    connect by prior b.l_serial_no = b.vc_up_team_no
        start with b.l_serial_no = v_vc_team_no;   --需要获取子团队的team

  loop
    fetch v_cursor
      into var_vc_team_no;
    exit when v_cursor%NOTFOUND;
    PIPE ROW(var_vc_team_no);
  end loop;
  close v_cursor;

end sp_get_child_team;


然后就可以直接这样了:

select b.l_serial_no as vc_team_no,t.column_value from
                                  brokerteam b, table(sp_get_child_team(b.l_serial_no)) t

这样就可以得到brokerteam表的所有递归记录了。


2、  Oracle分析函数

2.1、sum(en_business_balance) over(partition by vc_operator_no,vc_customer_no order by l_oc_date range unbounded preceding)en_business_balance

该分析函数的算法是根据l_oc_date排序,按照vc_operator_no,vc_customer_no 分组,依次增加,比如第一天的business是1,第二天的也是1,用此分析函数的话第一天是1,第二天等于第一天加第二天的business,也就是2,很实用,这里主要是算一段时间内的交易总额什么时候超过了标准,所以需要依次算出来当前时间加前段时间的business。

2.2、RANK() OVER(PARTITION BY ''1'' ORDER BY sum(rn.en_stock_asset)DESC) as eb_sort

该分析函数的算法是根据某一分组,按照sum(en_stock_asset)进行排序,得出来排名。

比如结果如下:

sum               sort

          10                    1

          10                    1

           9                     3

           8                     4


3、季度、周

 季度:select to_char(to_date('20110101','yyyyMMdd'),'yyyyq') from dual;

  周   :select to_char(to_date('20110101','yyyyMMdd'),'yyyyMMw') from dual;

/* oracle中的周不是按照周一到周日,而是单纯的按照7天,比如9月1号是周四,那2011091(9月第一周)就是包括20110901到20110907也就是下周三。月末不够7天也算是一星期,从1号算作每月第一周的开始*/  


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值