问题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;
网友评论