oracle存储过程笔试题

 题目:将原表数据写存储过程生成处理结果表 

代码:

--创建原始数据表
create table original_tab (llrq varchar2(16 char),ygy varchar2(10 char),gsz number);
--插入原始数据
insert into original_tab  values('20230228','202303',310);
insert into original_tab  values('20230305','202303',500);
insert into original_tab  values('20230310','202303',400);

--创建数据处理结果记录表
create table result_tab (ny varchar2(10 char),nyr varchar2(10 char),sgdryg number,sgdyyg number);

--数据处理过程
CREATE OR REPLACE PROCEDURE P_DATA_PROCESSING AS
N_YFTS     NUMBER  := 0;
N_SGDRYG   NUMBER  := 0;
N_SGDYYG   NUMBER  := 0;
V_NYR      NUMBER  := 0;
N_CS       NUMBER;
N_XHCS     NUMBER  := 0;
N_KSSJ     NUMBER  := 0;
BEGIN
   FOR I IN (SELECT * FROM original_tab) LOOP
     N_YFTS   := to_number(to_char(last_day(TO_DATE(I.YGY,'YYYYMM')),'dd'));--  获取预估月最大天数 3月有31天即返回31
     N_SGDRYG := I.GSZ/N_YFTS; -- 第一条数据310/31 第二条数据 500/31 第三条 400/31
     V_NYR    := TO_CHAR((TO_DATE(I.YGY,'YYYYMM')),'YYYYMMDD'); -- 获取预估月的第一天日期 20230301
     N_CS     := 0;
     IF N_XHCS = 0 THEN 
       LOOP
         N_SGDYYG := N_SGDRYG + N_SGDYYG; -- 当月预估是当日预估累计
         INSERT INTO result_tab VALUES(I.YGY,V_NYR,N_SGDRYG,N_SGDYYG);
         COMMIT;
         V_NYR    := TO_CHAR(TO_NUMBER(V_NYR) + 1); -- 日期加1
         N_CS     := N_CS + 1; --数值加1
         EXIT WHEN N_CS >= N_YFTS ; -- 看日期有没有大于等于31天 符合条件跳出循环
       END LOOP;
      END IF;
      IF N_XHCS <> 0 THEN 
        SELECT NYR,SGDRYG,SGDYYG INTO V_NYR,N_SGDRYG,N_SGDYYG FROM result_tab WHERE NYR=I.LLRQ; -- 选取第一条数值产生后的数据 跟下一条的预估日期一样的数据 赋值
        N_KSSJ   := TO_NUMBER(SUBSTR(I.LLRQ,7,2)); --- 截取最后日期2位
        N_SGDRYG := (I.GSZ-N_SGDYYG)/(N_YFTS-N_KSSJ); -- (预估值-累计值)/(31-下一次出现日期的后两位)
          LOOP
             N_SGDYYG := N_SGDYYG + N_SGDRYG; -- 累计值
             V_NYR    := TO_CHAR(TO_NUMBER(V_NYR) + 1); -- 日期加一
             UPDATE result_tab SET NY=I.YGY,SGDRYG=N_SGDRYG,SGDYYG=N_SGDYYG WHERE NYR=V_NYR; -- 更新表 
           COMMIT;
             N_KSSJ   := N_KSSJ + 1;
             EXIT WHEN N_KSSJ >= N_YFTS ;
           END LOOP;
        end if;
     N_XHCS   := N_XHCS +1 ;-- 第1条数据执行完,然后第二条跳过第一个循环
   END LOOP;
END ;

--执行测试
exec P_DATA_PROCESSING ;
--处理数据展示
NY	NYR	SGDRYG	SGDYYG
202303	20230301	10	10
202303	20230302	10	20
202303	20230303	10	30
202303	20230304	10	40
202303	20230305	10	50
202303	20230306	17.3076923076923	67.3076923076923
202303	20230307	17.3076923076923	84.6153846153846
202303	20230308	17.3076923076923	101.923076923077
202303	20230309	17.3076923076923	119.230769230769
202303	20230310	17.3076923076923	136.538461538462
202303	20230311	12.5457875457875	149.084249084249
202303	20230312	12.5457875457875	161.630036630037
202303	20230313	12.5457875457875	174.175824175824
202303	20230314	12.5457875457875	186.721611721612
202303	20230315	12.5457875457875	199.267399267399
202303	20230316	12.5457875457875	211.813186813187
202303	20230317	12.5457875457875	224.358974358974
202303	20230318	12.5457875457875	236.904761904762
202303	20230319	12.5457875457875	249.450549450549
202303	20230320	12.5457875457875	261.996336996337
202303	20230321	12.5457875457875	274.542124542125
202303	20230322	12.5457875457875	287.087912087912
202303	20230323	12.5457875457875	299.6336996337
202303	20230324	12.5457875457875	312.179487179487
202303	20230325	12.5457875457875	324.725274725275
202303	20230326	12.5457875457875	337.271062271062
202303	20230327	12.5457875457875	349.81684981685
202303	20230328	12.5457875457875	362.362637362637
202303	20230329	12.5457875457875	374.908424908425
202303	20230330	12.5457875457875	387.454212454212
202303	20230331	12.5457875457875	400

处理思路:

第一条数据循环后直接产生所有的数据 按 310/31 直至31日跳出第一个内循环;

第二条数据循环 变量+1后 非0 执行第二个内循环 从 06号开始更新数据,根据(预估值-累计值)/(31-下一次出现日期的后两位) 这个公式一条一条更新到06-31的数据 按(500-累计值)/(31-(06-31)日期循环);

第三条数据循环 变量+1后 非0 还是执行第二个内循环 从 11号开始更新数据,累似第二条数据的循环 三条数据执行完成,跳出外循环。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值