-------------------------------------练习
/*
问题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;
PL/SQL 经典总结(一)习题
最新推荐文章于 2022-07-27 15:04:41 发布