Oracle plsql 题目

Posted by

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

1.编写一个PL/SQL程序块 接收一个雇员名,显示该雇员的所有内容,(用%rowtype实现),当没有这个雇员时,抛异常来显示错误提示;当雇员同名有多个时,抛异常来显示错误提示,如果没有异常,则显示该雇员的工资和奖金,没有奖金的用0替代。(用%type实现); 测试(Vargas,Zlotkey,Gietz,Hello)这几个名字 表用employees ,雇员名指的是last_name字段。
DECLARE
      V_emp_REC employees%ROWTYPE;
      com_pct employees.commission_pct%type;
      my_exception Exception;
BEGIN
      SELECT * INTO V_emp_REC  FROM employees emp
      WHERE emp.last_name=&lastname;
      dbms_output.put_line('员工姓名'||V_emp_REC.last_name||';员工Email'||V_emp_REC.email||';员工话'||V_emp_REC.phone_number||';入职日期'||V_emp_REC.hire_date||';员工工资'||V_emp_REC.salary||';员工奖金'||V_emp_REC.commission_pct);
      if V_emp_REC.commission_pct is null then
             com_pct :=0;
      else
             com_pct :=V_emp_REC.commission_pct;
      end if;
      raise my_exception;
      exception
            when too_many_rows then
                  dbms_output.put_line('员工同名');
            when no_data_found then
                 dbms_output.put_line('没有该员工');
            when others then
                 dbms_output.put_line('员工工资'||V_emp_REC.salary||';员工奖金'||com_pct);
END;
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% 其它部门上涨40%。
DECLARE

BEGIN
          for addsal in (select department_id from employees group by department_id) loop
          if addsal.department_id='10' then
               update employees t set t.salary=t.salary*1.1  ;
         elsif  addsal.department_id='20' then
               update employees t set t.salary=t.salary*1.2;
         elsif  addsal.department_id='30' then
               update employees t set t.salary=t.salary*1.3;
         else
               update employees t set t.salary=t.salary*1.4;
         end if;
         end loop;
COMMIT;
END;

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

3.编写一个REF游标, 提示用户输入要查看哪个表中的记录。如果用户输入‘E’,则显示emp表中的employee_id、last_name、job_id和salary列的值;如果用户输入‘D’,则显示departments表中的department_id、department_name和location_id列的值
declare
           type cur_tab is ref cursor;
           mycursor cur_tab;
           v_table varchar2(30):='&请输入要查看的表名';
           v_emp employees%rowtype;
           v_dept departments%rowtype;
begin
          v_table:=upper(v_table);
          if v_table='E' then
               open mycursor for select * from employees ;
               loop
               fetch mycursor into v_emp;
               exit when mycursor%notfound;
                dbms_output.put_line('员工编号:'||v_emp.employee_id||'员工姓名:'||v_emp.last_name||'员工jobid:'||v_emp.job_id||'员工工资:'||v_emp.salary);
               end loop;
          elsif v_table='D' then
                 open mycursor for select * from departments ;
                 loop
                 fetch mycursor into v_dept;
                 exit when mycursor%notfound;
                 dbms_output.put_line('部门编号:'||v_dept.department_id||'部门名:'||v_dept.department_name||'部门locationid:'||v_dept.location_id);
                 end loop;
          end if;
end;
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替代。

declare v_empno emp.empno%type; v_sal emp.sal%type; v_comm emp.comm%type; begin select empno,sal,NVL 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,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实现)

相关文章

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注