PL/SQL 经典总结(一)习题

-------------------------------------练习
/*

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

工资小于2000 的则认为是低等工资。 

DECLARE 

 eno emp.empno%TYPE ; 

 sal emp.sal%TYPE ; 

BEGIN 

 eno := &en ; 

 SELECT sal INTO sal FROM emp WHERE empno=eno ; 

 IF sal>3500 THEN 

 DBMS_OUTPUT.put_line('高工资。。。') ; 

 ELSIF sal>2000 THEN 

 DBMS_OUTPUT.put_line('中等工资。。') ; 

 ELSE 

 DBMS_OUTPUT.put_line('底工资。。。') ; 

 END IF ; 

END ; 

/ 
*/
DECLARE
eno emp.empno%type;
sa emp.sal%type;

BEGIN
 eno:=&员工编号;
 SELECT sal INTO sa FROM emp WHERE emp.empno=eno;
 IF sa>3500 THEN
 DBMS_OUTPUT.put_line('.....高工资');
 ELSIF sa>2000 THEN
 DBMS_OUTPUT.put_line('.....中工资');
 ELSE
 DBMS_OUTPUT.put_line('.....低工资');
 
 END IF;
 END;

/*
问题2:输入一个雇员编号,根据它所在的部门涨工资,规则: 

 • 10 部门上涨10% 

 • 20 部门上涨20% 

 • 30 部门上涨30% 
 
 • 其他部门上涨18%

 所有部门的上涨工资,最多不能超过5000,如果超过5000,则工资就为5000。 
*/
DECLARE
eno emp.empno%type;
dn emp.deptno%type;
sa emp.sal%type;
BEGIN
eno:=&员工编号;
SELECT emp.deptno INTO dn FROM emp WHERE emp.empno=eno;
UPDATE emp3 SET sal = decode(dn,'10',sal*(1+0.1),'20',sal*(1+0.15),'30',sal*(1+0.2),sal*(1+0.18))
 WHERE emp3.empno=eno;
SELECT emp.sal INTO sa FROM emp WHERE emp.empno=eno;
IF sa>5000 THEN
UPDATE emp3 SET sal=5000 WHERE emp3.empno=eno;
END IF;
END;

declare 
   eno emp3.empno%TYPE; 
   dno emp3.deptno%TYPE; 
   esal emp3.sal%TYPE; 
begin 
     eno:=&no; 
     select deptno,sal into dno,esal from emp3 where empno=eno; 
     if dno=10 then 
           esal := esal + esal*0.1; 
     elsif dno=20 then 
           esal := esal + esal*0.2; 
     elsif dno=30 then 
           esal := esal + esal*0.3; 
     end if; 
     if esal>5000 then 
         esal:=5000; 
     end if; 
    update emp3 set sal=esal where empno=eno; 
end; 

/*
 问题3 接受部门编号,显示部门名和地理位置
*/
DECLARE
   dno dept.deptno%type;
   dna dept.dname%type;
   lo dept.loc%type;
 BEGIN
   dno:=&部门编号:;
   SELECT dept.dname,dept.loc INTO dna,lo FROM dept WHERE dept.deptno=dno;
   DBMS_OUTPUT.put_line(dno||'部门名称是'||dna||'位于'||lo);
   EXCEPTION
   WHEN no_data_found THEN
   DBMS_OUTPUT.put_line('你输入的部门号可能有误!');
END;
/*
 问题4 接受雇员编号,显示该雇员的工资和提成,没有提成的用0代替
 为应付检查 没有奖金的统一显示奖金为100 不准用if语句
*/
DECLARE
 eno emp3.empno%type;
 sa emp3.sal%type;
 co emp3.comm%type;
 BEGIN
    eno:=&请输入雇员编号;
    SELECT emp3.sal,nvl(emp3.comm,100) INTO sa,co FROM emp3 WHERE emp3.empno=eno;
    DBMS_OUTPUT.put_line('编号为'||eno||'的雇员工资是'||sa||'提成是'||co);
    EXCEPTION
    WHEN no_data_found THEN
    Dbms_Output.put_line('你输入的雇员编号不存在!~');
END;

declare 
sno emp.empno%type; 
e1 emp%rowtype; 
begin 
sno:=&no; 
select * into e1 from emp where empno=sno; 
dbms_output.put_line(e1.empno||'       '||e1.ename||'  '||e1.job||'  '||e1.mgr||'  '||e1.hiredate||'  '||e1.sal||' 
'||nvl(e1.comm,0)||' '||e1.deptno); 
exception 
when no_data_found then 
dbms_output.put_line('not find date'); 
end;
 
/*
  问题5 用Loop为dept表增加50-90这些部门
*/
DECLARE
  no NUMBER;
  BEGIN
  no:=50;
  WHILE (no<=90) LOOP
  INSERT INTO dept1(dept_id) values(no);
  no:=no+10;
  END LOOP;
END;

/*
 问题6 接受一个雇员名,显示该雇员的所有内容,当没有该雇员的时候用异常显示
 */
DECLARE
 ena emp.ename%type;
 e1 emp%rowtype;
 BEGIN
    ena:=&雇员名;
    SELECT *  INTO e1 FROM emp where emp.ename = ena; 
    dbms_output.put_line(e1.empno||'       '||e1.ename||'  '||e1.job||'  '||e1.mgr||'  '||e1.hiredate||'  '||e1.sal||' 
'||nvl(e1.comm,0)||' '||e1.deptno);
   EXCEPTION
   WHEN no_data_found THEN
   DBMS_OUTPUT.put_line('该雇员名有误!');
 END;
/*
 问题7 接受两个数相除,并显示结果,如果除数为0,则显示错误提示
*/
DECLARE
 a NUMBER;
 b NUMBER;
   BEGIN
   a:=&a;
   b:=&b;
   DBMS_OUTPUT.put_line(a||'/'||b||'='||a/b);
   EXCEPTION
   WHEN zero_divide THEN
   DBMS_OUTPUT.put_line('被除数不能为0!');
   END;
   
 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值