PL/SQL笔记整理
来源:互联网 发布:软件社区 编辑:程序博客网 时间:2024/06/05 02:49
–1输出小于等于指定参数的所有斐波那契数列,比如输入参数为10Procedure名称:fibonacci_output
–参数:p_limit,0、1、1、2、3、5、8、13
–说明:参数为输出限制,最后数据不超过该参数,使用dbms_output.put_line来输出
procedure fibonacci_output(p_limit number) is i number := 0; t number := 1; temp number := 1; begin dbms_output.put_line(i); while temp < p_limit loop dbms_output.put_line(temp); temp := i + t; i := t; t := temp; end loop; end;
–2. 输入一个日期,计算该日期在该年内第几天
–Procedure名称:date_num
–参数:p_date,类型为字符,格式yyyy-mm-dd
–说明:使用dbms_output.put_line来输出(5分)
–失误,没有看清题意,参数传错了
Procedure date_num(p_date varchar2) is first_day date; n number := 0; begin first_day := TRUNC(to_date(p_date,'yyyy-mm-dd'), 'YEAR'); n := to_date(p_date,'yyyy-mm-dd') - first_day + 1; dbms_output.put_line('the date is the ' || n || 'th day of the year'); end;
–3. 个人所得税计算:个人所得税分段计算,具体分段如下:
/*0-3500 免征税
3501-4500 10%
4501-9000 20%
9000以上 25%
输入一个参数,计算应该缴纳的税收为多少
function名称:tax_calc
参数:p_salary
返回值:需要缴纳的税收*/
function tax_calc(p_salary number) return number is tax_sum number; begin if p_salary > 0 and p_salary < 3500 then tax_sum := 0; elsif p_salary > 3501 and p_salary < 4500 then tax_sum := (p_salary-3500) * 0.1; elsif p_salary > 4501 and p_salary < 9000 then tax_sum := 1000*0.1+(p_salary-4500) * 0.2; elsif p_salary >= 9000 then tax_sum := 1000*0.1+4500*0.2+(p_salary-9000) * 0.25; end if; dbms_output.put_line('the tax you should pay is : ' || tax_sum); return tax_sum; end;
- A/B/C三种物品的价格分别为p_a_price,p_b_price,p_c_price,总金额为p_total,计算A/B/C数量(整数)分别为多少,
使得A/B/C总金额加起来不超过p_total并且最接近p_total(如果有多个组合,只需要得出一个组合即可),
在包里写一个函数。
procedure名称:quantity_calc
参数:p_a_price
p_b_price
p_c_price
p_total
x_a_quantity
x_b_quantity
x_c_quantity
p开头的为输入类型参数,x开头为输出类型参数
(15分)
procedure quantity_calc(p_a_price in number,p_b_price in number,p_c_price in number,p_total in number, x_a_quantity out number,x_b_quantity out number, x_c_quantity out number ) is i number:=0; j number:=0; t number:=0; begin for i in 0..trunc(p_total/p_a_price,0) loop for j in 0..trunc(p_total/p_b_price,0) loop for t in 0..trunc(p_total/p_c_price,0) loop if(i*p_a_price+j*p_b_price+t*p_c_price)=p_total then x_a_quantity:=i; x_b_quantity:=j; x_c_quantity:=t; end if; end loop; end loop; end loop; end;
–1. 创建一个过程,给所有成绩低于该课程平均分的男生加2分,女生加3分,加完分后,如果超过100分,
–就更新为100分。如果加分后的学生成绩低于60分,则输出学生的信息(按学号顺序)。处理成功则提交事物;失败则回滚事物。(10分)
–Procedure名称:update_score
–说明:使用dbms_output.put_line输出,输出学生编号、学生姓名
Procedure update_score is CURSOR cur_core IS select hsc.student_no, hs.student_name, hs.student_gender, hsc.core from (SELECT hsc.course_no, avg(hsc.core) AVG_C FROM hand_student_core hsc group by (hsc.course_no)) H, hand_student hs, hand_student_core hsc where hsc.core < H.AVG_C and hsc.course_no = H.course_no AND hsc.student_no = hs.student_no FOR UPDATE OF hsc.core; --TYPE core_ind IS TABLE OF cur_core INDEX BY hand_student_core.student_no%TYPE; begin DBMS_OUTPUT.put_line('学生编号 学生姓名'); for rec_core in cur_core loop if (rec_core.core + 2) > 60 and rec_core.student_gender = '男' then UPDATE hand_student_core hsc SET hsc.core = rec_core.core + 2 WHERE CURRENT OF cur_core; elsif (rec_core.core + 3) > 60 and rec_core.student_gender = '女' then UPDATE hand_student_core hsc SET hsc.core = rec_core.core + 3 WHERE CURRENT OF cur_core; elsif ((rec_core.core + 2) > 100 and rec_core.student_gender = '男') OR ((rec_core.core + 3) < 100 and rec_core.student_gender = '女') then UPDATE hand_student_core hsc SET hsc.core = 100 WHERE CURRENT OF cur_core; elsif ((rec_core.core + 2) < 60 and rec_core.student_gender = '男') OR ((rec_core.core + 3) < 60 and rec_core.student_gender = '女') THEN --core_ind(rec_core.student_no).student_no=rec_core.student_no; --core_ind(rec_core.student_no).student_name= rec_core.student_name; DBMS_OUTPUT.put_line(rec_core.student_no || ' ' ||rec_core.student_name); --如何按学号顺序实现,没头绪。。 END IF; END LOOP; commit;--没提交上去,好奇怪。。 EXCEPTION WHEN OTHERS THEN ROLLBACK; END;
–2. 写一个procedure,对学分小于6分的补课程,
–成绩60-70分的1个学分,70-80的2个学分,80以上的3个学分。(10分)
–Procedure名称:student_score
–说明:补充的课程必须是该学生没选修过的课程,补的课程成绩默认85分,
–补课程的数量要使得这个学生的学分大于等6分,比如该学生之前学分2分,那就必须补2个课程,如果之前学分3分,则只需补一个课程。
写了好久才摸索出来,自己有点low,如果有大神有更好的算法,还请不吝赐教。。。
procedure student_score is cursor course_to_learn is select h.student_no, sum(h.c) sum_c from (select hsc.student_no, hsc.course_no, case when hsc.core between 60 and 69 then 1 when hsc.core between 70 and 79 then 2 when hsc.core > 80 then 3 when hsc.core < 60 then 0 end c from hand_student_core hsc) h group by (h.student_no); need_core number; cursor c_minus(s varchar2) is select TA.course_no from ((select hc.course_no from hand_course hc) minus (select hsc.course_no from hand_student_core hsc where hsc.student_no = s)) TA; i number; begin for rec in course_to_learn loop if rec.sum_c < 6 then need_core := 6 - rec.sum_c; need_core := ceil(need_core / 3); dbms_output.put_line('学生学号:' || rec.student_no); dbms_output.put_line('需要修的课程数:' || need_core); dbms_output.put_line('可选修课程如下:' || need_core); i := 0; FOR minu_c in c_minus(rec.student_no) loop i := i + 1; dbms_output.put_line(minu_c.course_no); exit when i = need_core; end loop; end if; end loop; end;
- PL/SQL笔记整理
- PL/SQL笔记整理
- 笔记--PL/SQL语句整理
- Oracle中的SQL * PLUS与PL/SQL笔记整理,SQL Plus输出结果格式化笔记整理
- PL/SQL详细整理
- pl/sql 整理
- pl sql整理
- PL/SQL学习笔记
- PL/SQL学习笔记
- pl/sql 笔记1
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- 笔记081120----PL/SQL
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- Spring系统学习第二篇
- TensotFlow 应用实例:08-使用tensorboard可视化神经网络结构和训练结果
- CSU-ACM2017暑期训练5-三分 E
- CT数据处理
- TensotFlow 应用实例:09-classification 分类器
- PL/SQL笔记整理
- CentOS+Jdk+Jboss+Dubbo配置教程
- Android实现二维码扫描功能(一)-ZXing插件接入
- 51nod 1596 搬货物 思路题
- TensotFlow 应用实例:10-Overfitting 过拟合介绍及解决过拟合的方法
- H5 学习笔记3
- 23、从上往下打印二叉树
- bzoj4745[USACO16DEC]Cow Checklist (DP)
- 【LeetCode】60. Permutation Sequence