oracle存储过程笔试题

编程入门 行业动态 更新时间:2024-10-13 02:21:16

oracle存储过程<a href=https://www.elefans.com/category/jswz/34/1769509.html style=笔试题"/>

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存储过程笔试题

本文发布于:2024-03-12 21:31:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1732462.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:笔试   存储过程   oracle

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!