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 ; / */DECLAREeno 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。 */DECLAREeno emp.empno%type;dn emp.deptno%type;sa emp.sal%type;BEGINeno:=&员工编号;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 THENUPDATE 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;?