笔试题"/>
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;
BEGINFOR I IN (SELECT * FROM original_tab) LOOPN_YFTS := to_number(to_char(last_day(TO_DATE(I.YGY,'YYYYMM')),'dd'));-- 获取预估月最大天数 3月有31天即返回31N_SGDRYG := I.GSZ/N_YFTS; -- 第一条数据310/31 第二条数据 500/31 第三条 400/31V_NYR := TO_CHAR((TO_DATE(I.YGY,'YYYYMM')),'YYYYMMDD'); -- 获取预估月的第一天日期 20230301N_CS := 0;IF N_XHCS = 0 THEN LOOPN_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); -- 日期加1N_CS := N_CS + 1; --数值加1EXIT 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-下一次出现日期的后两位)LOOPN_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号开始更新数据,累似第二条数据的循环 三条数据执行完成,跳出外循环。
更多推荐
oracle存储过程笔试题
发布评论