CH01_02练习

作者: 小小蒜头 | 来源:发表于2017-08-28 21:36 被阅读294次

问题1: 输入一个雇员的编号,如果其工资高于3500,则显示高工资,
工资大于2000,则显示中等工资,
工资小于2000的则认为是低等工资。

declare 
  v_empno emp.empno%type :=&v_empno;
  v_sal emp.sal%type;
begin
  select sal into v_sal from emp where empno=v_empno;
  if v_sal>3500 then
  dbms_output .put_line('高工资');
  elsif v_sal>2000 and v_sal<=3500 then
  dbms_output.put_line('中工资');
  elsif v_sal<=2000 then
  dbms_output.put_line('低工资');
  end if;
end;

问题2:输入一个雇员编号,根据它所在的部门涨工资,
  规则: • 10部门上涨10%
      • 20部门上涨20%
      • 30部门上涨30%
所有部门的上涨工资,最不能超过5000,如果超过5000,则工资就为5000。

declare
  v_empno emp.empno%type :=&v_empno;
  v_sal emp.sal%type;
  v_deptno emp.deptno%type;
begin
  select deptno,sal into v_deptno,v_sal from emp where empno=v_empno;
  if v_deptno=10 then v_sal:=v_sal*1.1;
  elsif v_deptno=20 then v_sal:=v_sal*1.2;
  elsif v_deptno=30 then v_sal:=v_sal*1.3;
  end if;

  if v_sal>5000 then v_sal:=5000;
  end if;

  dbms_output.put_line('部门编号:'||v_deptno||'  涨工资:'||v_sal);
  update emp set sal=v_sal where empno=v_empno;
  commit;
end;

问题3:接收部门编号,显示部门名和地理位置

declare 
  v_dno dept.deptno%type := &dno;
  v_dname dept.dname%type;
  v_loc dept.loc%type;
begin
  select dname,loc into v_dname,v_loc from dept where deptno=v_dno;
  dbms_output.put_line('部门名:'||v_dname||'  地理位置:'||v_loc);
end;

问题4:接收雇员号,显示 该雇员的工资和提成,没有提成的用0替代。(用%type实现)

declare 
   v_empno emp.empno%type;
   v_sal emp.sal%type;
   v_comm emp.comm%type;
  begin
  select empno,sal,NVL(comm,0) into v_empno,v_sal,v_comm from emp where 
empno=&v_empno;
  dbms_output.put_line('工资:'||v_sal||',提成'||v_comm);
end;

问题5:接收雇员号,显示 该雇员的所有信息,没有提成的用0替代。(用%rowtype实现)

declare
  v_eno emp.empno%type := &v_eno;
  e1 emp%rowtype;
begin
  select empno,ename,job,mgr,hiredate,sal,NVL(comm,0) comm,deptno into e1 from emp where empno=v_eno;
  dbms_output.put_line('部门编号:'||e1.empno||',部门名称:'||e1.ename||'工作:'||e1.job||',经理编号'||e1.mgr||'日期:'||e1.hiredate||'工资:'||e1.sal||',提成:'||e1.comm||',部门编号:'||e1.deptno);
exception 
  when no_data_found then dbms_output.put_line('no data');
end;

问题6:接收一个雇员名,判断他的job,根据job不同,为他增加相应的sal(用if-elsif实现)

declare
  v_ename emp.ename%type := '&v_ename';
  v_job emp.job%type;
  v_sal emp.sal%type;
begin
  select job,sal into v_job,v_sal from emp where ename = v_ename;
  if v_job = 'CLERK' then v_sal := v_sal + v_sal * 0.1;
  elsif v_job = 'SALESMAN' then v_sal := v_sal + v_sal * 0.2;
  elsif v_job = 'MANAGER' then v_sal := v_sal + v_sal * 0.3;
  elsif v_job = 'ANALYST' then v_sal := v_sal + v_sal * 0.4;
  elsif v_job = 'PRESIDENT' then v_sal := v_sal + v_sal * 0.5;
  end if;
  
  update emp set sal = v_sal;
end;

问题7:用loop循环结构,为dept表增加50-90这些部门

declare
  num number(3) := 50;
begin
  loop insert into dept(deptno) values(num);
  num := num+10;
  exit when num>90;
  end loop;
end;

select Deptno from dept;

问题8:接收一个雇员名,显示该雇员的所有内容,(用%rowtype实现),当没有这个雇员时(no_data_found),用异常来显示错误提示

declare
  v_ename emp.ename%type := '&v_ename';
  e1 emp%rowtype;
begin
  select *  into e1 from emp where ename = v_ename;
exception 
  when no_data_found then dbms_output.put_line('no data find');
end;

问题9:编写一个PL/SQL程序块以计算某个雇员的年度薪水总额

declare
  v_ename emp.ename%type := '&v_ename';
  sum_sal number;
begin
  select sal*12+NVL(comm,0) into sum_sal from emp where ename = v_ename;
  dbms_output.put_line('年度薪水总额:'||sum_sal);
end;

问题10:编写一个PL/SQL程序块以向emp表添加10新雇员编号(7901-7910)

declare
  no number := 0;
begin
  loop insert into emp(empno) values(no);
  no := no + 1;
  exit when no > 11;
  end loop;
end;
select empno from emp;

问题11:接受2个数相除,并显示结果,如果除数为0,则显示错误提示;

declare
  a int := &a;  
  b int := &b;
  c number;
begin
  c := a/b;
  dbms_output.put_line(c);
exception
  when zero_divide then dbms_output.put_line('除数不能为零');
end;

相关文章

网友评论

    本文标题:CH01_02练习

    本文链接:https://www.haomeiwen.com/subject/zrqndxtx.html