> 文章列表 > Oracle之PL/SQL流程控制练习题(二)

Oracle之PL/SQL流程控制练习题(二)

Oracle之PL/SQL流程控制练习题(二)

          • 1、编写一个程序块,从emp表中显示名为“SMITH”的雇员的薪水和职位
          • 2、编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在位置
          • 3、编写一个程序块,利用%type属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(即,薪水加佣金)
          • 4、编写一个程序块,利用%rowtype属性,接受一个雇员号,从emp表中显示该雇员的整体薪水
          • 5、键盘接入两个值,打印比较大的值
          • 6、键盘介入三个值,并按照从大到小依次打印
          • 7、判断一个年份是不是闰年
          • 8、接受两个数相除并且显示结果,如果第二个数为0则显示消息“除数不能为0”
          • 9、体质指数(BMI)=体重(kg)÷身高^2(m) 偏瘦 <= 18.4 正常 18.5 ~ 23.9 过重 24.0 ~ 27.9 肥胖 >= 28.0 ,现要求输入体重和身高,求出体质指数所在范围
          • 10、输入一个数,判断是奇数还是偶数
          • 11、输入一个数,判断这个数的平方根是否大于这个数除以2的值 注:平方根函数为 sqrt
          • 12、某公司要根据雇员的职位来加薪,公司决定按下列加薪结构处理:
          • 13、编写一个程序块,将emp表中雇员名全部显示出来
          • 14、编写一个程序块,将emp表中前5人的名字显示出来
          • 15、计算下面级数当末项小于0.001时的部分和:1/(1 * 2)+1/(2 * 3)+1/(3 * 4)+…+1/(n*(n+1))+ ……
          • 16、计算s=1 * 2+2 * 3+…+N * (N+1),当N=50的值。(44200)
          • 17、编写一个PL/SQL程序块,从emp表中对名字以“A”或"S"开始的所有雇员按他们基本薪水的10%给他们加薪
          • 18、两重循环,计算S=1!+2!+…+10!。(4037913)
          • 19、编程序求满足不等式 1 + 3 ^ 2 + 5 ^ 2 +…+N ^ 2>2000的最小N值。(23)
          • 20、将雇员表中的所有工资小于3000增加400统计出增加工资的人数及增加的工资数量
          • 21、从雇员表中显示工资最高的前五个人的姓名,部门和工资
1、编写一个程序块,从emp表中显示名为“SMITH”的雇员的薪水和职位
declare v_sal number(10);v_job varchar2(20);
beginselect sal,job into v_sal,v_job from emp where ename='SMITH';dbms_output.put_line(v_sal||','||v_job);
end;
2、编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在位置
declarev_dname varchar2(20);v_loc varchar2(20);
beginselect dname,loc into v_dname,v_loc from dept where deptno='&部门号';dbms_output.put_line(v_dname||','||v_loc);
end;
3、编写一个程序块,利用%type属性,接受一个雇员号,从emp表中显示该雇员的整体薪水(即,薪水加佣金)
declarev_sal emp.sal%type;v_comm emp.comm%type;
beginselect sal,comm into v_sal,v_comm from emp where empno='&雇员号';dbms_output.put_line(v_sal+nvl(v_comm,0));
end;
4、编写一个程序块,利用%rowtype属性,接受一个雇员号,从emp表中显示该雇员的整体薪水
declarev_emp emp%rowtype;
beginselect * into v_emp from emp where empno='&雇员号';dbms_output.put_line(v_emp.sal+nvl(v_emp.comm,0));
end;
5、键盘接入两个值,打印比较大的值
declarev_n1 number(5);v_n2 number(5);
beginv_n1:=&请输入第一个数字;v_n2:=&请输入第二个数字;if v_n1>v_n2then dbms_output.put_line(v_n1);elsedbms_output.put_line(v_n2);end if;
end;
6、键盘介入三个值,并按照从大到小依次打印
declarev_n1 number(5);v_n2 number(5);v_n3 number(5);
beginv_n1:=&请输入第一个数字;v_n2:=&请输入第二个数字;v_n3:=&请输入第三个数字;if v_n1>v_n2 and v_n1>v_n3then if v_n2>v_n3 thendbms_output.put_line(v_n1||' '||v_n2||' '||v_n3);elsedbms_output.put_line(v_n1||' '||v_n3||' '||v_n2);end if;elsif v_n2>v_n1 and v_n2>v_n3then if v_n1>v_n3 thendbms_output.put_line(v_n2||' '||v_n1||' '||v_n3);elsedbms_output.put_line(v_n2||' '||v_n3||' '||v_n1);end if;elsif v_n3>v_n2 and v_n3>v_n1then if v_n2>v_n1 thendbms_output.put_line(v_n3||' '||v_n2||' '||v_n1);elsedbms_output.put_line(v_n3||' '||v_n1||' '||v_n2);end if;end if;
end;
7、判断一个年份是不是闰年
declarev_year number(5);
beginv_year:=&请输入年份;if (v_year mod 4 =0 and v_year mod 100 !=0) or v_year mod 400=0then dbms_output.put_line(v_year||'是闰年');elsedbms_output.put_line(v_year||'不是闰年');end if;
end;
8、接受两个数相除并且显示结果,如果第二个数为0则显示消息“除数不能为0”
declarev_n1 number(10);v_n2 number(10);
beginv_n1:=&请输入第一个数;v_n2:=&请输入第二个数;if v_n2=0then dbms_output.put_line('除数不能为0');elsedbms_output.put_line(v_n1/v_n2);end if;
end;
9、体质指数(BMI)=体重(kg)÷身高^2(m) 偏瘦 <= 18.4 正常 18.5 ~ 23.9 过重 24.0 ~ 27.9 肥胖 >= 28.0 ,现要求输入体重和身高,求出体质指数所在范围
declarev_w number(5);v_h number(5);v_bmi number(5);
beginv_w:=&体重;v_h:=&身高;v_bmi:=v_w/(power(v_h,2));if v_bmi<=18.4then dbms_output.put_line('偏瘦	<= 18.4');elsif v_bmi>=18.5 and v_bmi<=23.9then dbms_output.put_line('正常	18.5 ~ 23.9');elsif v_bmi>=24.0 and v_bmi<=27.9then dbms_output.put_line('过重	24.0 ~ 27.9');elsedbms_output.put_line('肥胖	>= 28.0');end if;
end;
10、输入一个数,判断是奇数还是偶数
declarev_n number(5);
beginv_n:=&请输入一个数;if v_n mod 2=0 thendbms_output.put_line(v_n||'是偶数');elsedbms_output.put_line(v_n||'是奇数');end if;
end;
11、输入一个数,判断这个数的平方根是否大于这个数除以2的值 注:平方根函数为 sqrt
declarev_n number(5);
beginv_n:=&请输入一个数;if sqrt(v_n)>(v_n/2) thendbms_output.put_line(v_n||'的平方根大于'||v_n||'除以2的值');elsif sqrt(v_n)=(v_n/2) thendbms_output.put_line(v_n||'的平方根等于'||v_n||'除以2的值');elsedbms_output.put_line(v_n||'的平方根小于'||v_n||'除以2的值');end if;
end;
12、某公司要根据雇员的职位来加薪,公司决定按下列加薪结构处理:

Designation Raise


clerk 500
salseman 1000
analyst 1500
otherwise 2000
编写一个程序块,接受一个雇员名,从emp表中实现上述加薪处理
法一:

declarev_name varchar2(10):='&请输入一个雇员名';v_job varchar2(10);v_sal number(5);
beginselect job into v_job from emp where ename=v_name;case v_jobwhen 'CLERK' then v_sal:=500;when 'SALESMAN' then v_sal:=1000;when 'ANALYST' then v_sal:=1500;else v_sal:=2000;end case;update emp set sal=sal+v_sal where ename=v_name;
end;

法二:

declarev_name emp.ename%type:='&name';v_sal emp.sal%type;v_job emp.job%type;
beginselect lower(job) into v_job from emp where ename=upper(v_name);if v_job='clerk' then v_sal:=500;elsif v_job='salesman' then v_sal:=1000;elsif v_job='analyst' then v_sal:=1500;else v_sal:=2000;end if;update emp set sal=sal+v_sal where ename=upper(v_name);
end;
13、编写一个程序块,将emp表中雇员名全部显示出来
beginfor i in (select ename from emp) loopdbms_output.put_line(i.ename);end loop;
end;
14、编写一个程序块,将emp表中前5人的名字显示出来

法一:

beginfor i in (select ename from (select ename,rownum from emp where rownum<=5)) loopdbms_output.put_line(i.ename);end loop;
end;

法二:

declaren number(5):=1;
beginfor i in (select ename from emp) loopdbms_output.put_line(i.ename);exit when n=5;n:=n+1;end loop;
end;

法三:

beginfor i in (select ename,rownum r from emp) loopif i.r<=5 thendbms_output.put_line(i.ename);end if;end loop;
end;
15、计算下面级数当末项小于0.001时的部分和:1/(1 * 2)+1/(2 * 3)+1/(3 * 4)+…+1/(n*(n+1))+ ……

法一:

declarev_n number(20,10):=&请输入一个数;v_sum number(20,10):=0;
beginfor i in 1..v_n loopv_sum:=v_sum+1/(i*(i+1));exit when 1/(i*(i+1))<0.001;end loop;dbms_output.put_line(v_sum); 
end;

法二:

declarev_sum number(20,10):=0;i number(5):=1;
beginloopv_sum:=v_sum+1/(i*(i+1));exit when 1/(i*(i+1))<0.001;i:=i+1;end loop;dbms_output.put_line(v_sum); 
end;
16、计算s=1 * 2+2 * 3+…+N * (N+1),当N=50的值。(44200)
declarev_n number(10):=&请输入一个数;v_sum number(10):=0;
beginfor i in 1..v_n loopv_sum:=v_sum+i*(i+1);end loop;dbms_output.put_line(v_sum);
end;
17、编写一个PL/SQL程序块,从emp表中对名字以“A”或"S"开始的所有雇员按他们基本薪水的10%给他们加薪

法一:

declarev_sal emp.sal%type;
beginfor v_sal in (select sal from emp where ename like 'A%' or ename like 'S%') loopv_sal.sal:=v_sal.sal*1.1;dbms_output.put_line(v_sal.sal);end loop;
end;

法二:

declarev_name varchar2(10);
beginfor v_name in (select ename from emp where ename like 'A%' or ename like 'S%') loopupdate emp set sal=sal*1.1 where ename=v_name.ename;dbms_output.put_line(v_name.ename);end loop;
end;
18、两重循环,计算S=1!+2!+…+10!。(4037913)
declarev_n1 number(10):=2;  v_n2 number(10);v_n3 number(10);  v_sum number(10):=1;
beginfor v_n1 in 1..9 loopv_n3:=1;for v_n2 in 2..(v_n1+1) loopv_n3:=v_n3*v_n2;end loop;v_sum:=v_sum++v_n3;end loop; dbms_output.put_line(v_sum);
end;
19、编程序求满足不等式 1 + 3 ^ 2 + 5 ^ 2 +…+N ^ 2>2000的最小N值。(23)
declare v_n number(10);v_i number(10):=1;v_sum number(10):=0;
beginwhile v_sum<2000 loopv_sum:=v_sum+power(v_i,2);v_i:=v_i+2;end loop;dbms_output.put_line(v_i-2);
end;
20、将雇员表中的所有工资小于3000增加400统计出增加工资的人数及增加的工资数量
declaren number(10):=0;
beginfor i in (select empno from emp where sal<3000) loopupdate emp set sal=sal+400 where empno=i.empno;n:=n+1;end loop;dbms_output.put_line('增加工资人数:'||n);dbms_output.put_line('增加工资数量:'||n*400);
end;
21、从雇员表中显示工资最高的前五个人的姓名,部门和工资

法一:

beginfor i in(select * from(select ename,deptno,sal,row_number() over(order by sal desc) as r from emp)where r<=5)loopdbms_output.put_line(i.ename||','||i.deptno||','||i.sal);end loop;   
end;

法二:

beginfor i in (select e.*,row_number() over(order by sal desc) r from emp e) loopif i.r<=5 thendbms_output.put_line(i.ename||','||i.deptno||','||i.sal);end if;end loop;
end;