SQL 优化之一,查询结果多列转成一列 游标cursor

原开发代码:

SELECT
    rp_ord_no
FROM
    (
        SELECT
            ROW_NUMBER() over(PARTITION BY rp_ord_no ORDER BY post_ac_dt DESC) rn,
            a.rp_ord_no ,
            post_ac_dt,
            ord_sts
        FROM
            t_ppd_ordr a )
WHERE
    rn =2
AND rp_ord_no !=' '
AND ord_sts='S1'
and post_ac_dt='20200901';

此代码虽然post_ac_dt有索引但是没用到,导致了全表扫描。
原因是rn=2 后,没有必要用到索引。

改成:

select rp_ord_no from  (SELECT ROW_NUMBER() over(PARTITION BY rp_ord_no ORDER BY post_ac_dt DESC) rn,rp_ord_no from 
      (SELECT a.rp_ord_no,
       post_ac_dt,
       ord_sts
  FROM gsdpay.t_ppd_ordr a
 WHERE 
   rp_ord_no != ' '
   AND ord_sts = 'S1'
   and post_ac_dt = '20200901')) where rn=2;

走的索引。

之后因为查询结果是3条数据,需要在一列中展示。

 create or replace function FUNC_C4_ORDER return varchar2 is
  v_Result varchar2(1000); --declare,长度定义。
  V_ename  VARCHAR2(100);
  CURSOR emp_cursor IS
    select rp_ord_no
      from (SELECT ROW_NUMBER() over(PARTITION BY rp_ord_no ORDER BY post_ac_dt DESC) rn,
                   rp_ord_no
              from (SELECT a.rp_ord_no, post_ac_dt, ord_sts
                      FROM gsdpay.t_ppd_ordr a
                     WHERE rp_ord_no != ' '
                       AND ord_sts = 'S1'
                       and post_ac_dt = '20200901'))
     where rn = 2;
BEGIN
  v_Result := ' ';
  OPEN emp_cursor;
  loop
    FETCH emp_cursor
      INTO v_ename;
    exit when emp_cursor%notfound;
    v_Result := v_ename || ',' || v_Result;
  END LOOP;
  CLOSE emp_cursor;
  return v_Result;
end FUNC_C4_ORDER;

select FUNC_C4_ORDER from dual; 给予业务监控

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方-phantom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值