plsql用loop循环带日期参数的存储过程


自己写了 个查询数据收入的前200名,建个新表dppaim200,然后逐条往表里插入数据,过程如下:

create or replace procedure p_xunhuan(qsrq dppaim200.dqrq%type,jsrq dppaim200.dqrq%type) is   --日期参数格式取表里的日期格式,默认是输入
v_sum number :=1;                                                                                                                                 --定义数字类型的变量,初始值1,用做排名循环
begin
  delete from dppaim200;                                                                                                                        --插入之前先清空表数据,一天执行一次就不必要
  commit;
  loop                                                                                                                                                       --进入loop循环
    insert into dppaim200                                                                                                                        
    select to_char(sysdate, 'yyyy/mm/dd') dqrq,
                   t.jglgdid,
                   t.jglbarcode,
                   t.jglcname,
                   t.jglcatid,
                   w.catcname,
                   t.sl,
                   t.sr,
                   t.ml,
                   round(decode(t.sr, 0, null, t.ml / t.sr), 4) * 100 || '%' mll,
                   round(decode(t.sl, 0, null, t.sr / t.sl), 1) sj,
                   t.e paim
              from (SELECT round(sum(sglxssr / 0.81)) sr,
                           jglgdid,
                           jglbarcode,
                           jglcname,
                           jglcatid,
                           round(sum(sglsl)) sl,
                           round(sum(hsml / 0.81)) ml,
                           row_number() OVER(ORDER BY round(sum(sglxssr / 0.81)) desc) e
                      FROM jxcgoodslist_day
                     where to_char(jgldate, 'yyyymmdd') >= qsrq                                                                --定义起始日期输入参数
                       and to_char(jgldate, 'yyyymmdd') <= jsrq                                                                   --定义结束日期输入参数
                       and substr(jglcatid, 1, 6) not in
                           (022003, 011608, 011391)
                       and jglcname not like '%联营%'         
                     group by jglgdid, jglbarcode, jglcname, jglcatid) t,
                   goodscat w
             where t.e = v_sum                                                                                                                --排名等于变量为1的记录插入表
               and t.jglcatid = w.catcode
             order by t.e;
    v_sum := v_sum + 1;                                                                                                                     --变量自增1,进入下个循环插入排名为2 的记录                                                                                                       
    exit when v_sum > 200;                                                                                                                 --当变量大于200时,退出循环
  end loop;                                                                                                                                          --结束循环
  commit;                                                                                                                                            --提交更新记录
end p_xunhuan;

在命令窗口执行:

 

 执行成功。

查询结果:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM