2015/8/19习题整理 第12章 PL/SQL编程简介(2)循环
1. 输入一个雇员的编号,如果其工资高于3500,则显示高工资,工资大于2000,则显示中等工资,工资小于2000的则认为是低等工资;
备注:使用PL/SQL中的if..then和case..when各实现一遍
2. 接收一个雇员名,判断他的job,根据job不同,为他增加相应的sal
备注:用if-elsif实现
3. 用loop循环结构,为dept表增加50-90这些部门;
备注:思考用哪种loop循环实现,用for可以实现吗,请给出原因。
4. 编写一个PL/SQL程序块以计算某个雇员的年度薪水总额;
备注:结合课堂上讲的高斯求和的类似方式进行
5. 编写一个PL/SQL程序块以向emp表添加10个新雇员编号(7901-7910)。
备注:要求使用for的loop循环实现
1.
SQL> declare
2 v_empno pls_integer;
3 v_sal number;
4 begin
5 v_empno := &雇员编号;
6 select sal into v_sal from emp where empno = v_empno;
7 if v_sal > 3500 then
8 DBMS_OUTPUT.PUT_LINE('高工资');
9 elsif v_sal > 2000 then
10 DBMS_OUTPUT.PUT_LINE('中工资');
11 else
12 DBMS_OUTPUT.PUT_LINE('低工资');
13 end if;
14 EXCEPTION
15 when no_data_found then
16 DBMS_OUTPUT.PUT_LINE('无此编号对应雇员');
17 end;
18 /
输入 雇员编号 的值: 7839
原值 5: v_empno := &雇员编号;
新值 5: v_empno := 7839;
高工资
PL/SQL 过程已成功完成。
输入 雇员编号 的值: 7839
高工资
PL/SQL 过程已成功完成。
SQL> /
输入 雇员编号 的值: 7934
低工资
PL/SQL 过程已成功完成。
SQL> declare
2 v_empno pls_integer;
3 v_sal number;
4 begin
5 v_empno := &雇员编号;
6 select sal into v_sal from emp where empno = v_empno;
7 case
8 when v_sal > 3500 then
9 DBMS_OUTPUT.PUT_LINE('高工资');
10 when v_sal > 2000 then
11 DBMS_OUTPUT.PUT_LINE('中工资');
12 else
13 DBMS_OUTPUT.PUT_LINE('低工资');
14 end case;
15 end;
16 /
输入 雇员编号 的值: 7839
高工资
PL/SQL 过程已成功完成。
SQL> /
输入 雇员编号 的值: 7934
低工资
PL/SQL 过程已成功完成。
2.
SQL> edit
已写入 file afiedt.buf
1 declare
2 v_ename emp.ename%TYPE;
3 v_job emp.job%TYPE;
4 v_sal emp.sal%TYPE;
5 begin
6 v_ename := &name;
7 select job ,sal into v_job,v_sal from emp where ename = v_ename;
8 if v_job = 'CLERK' then
9 DBMS_OUTPUT.PUT_LINE(v_ename||' '||v_job||' '||(v_sal+200));
10 elsif v_job = 'SALESMAN' then
11 DBMS_OUTPUT.PUT_LINE(v_ename||' '||v_job||' '||(v_sal+300));
12 elsif v_job = 'MANAGER' then
13 DBMS_OUTPUT.PUT_LINE(v_ename||' '||v_job||' '||(v_sal+400));
14 elsif v_job = 'ANALYST' then
15 DBMS_OUTPUT.PUT_LINE(v_ename||' '||v_job||' '||(v_sal+500));
16 else
17 DBMS_OUTPUT.PUT_LINE(v_ename||' '||v_job||' '||(v_sal+1000));
18 end if;
19 exception
20 when no_data_found then
21 DBMS_OUTPUT.PUT_LINE('This name is not in the table.');
22* end;
SQL> /
输入 name 的值: 'KING'
KING PRESIDENT 6000
PL/SQL 过程已成功完成。
SQL> /
输入 name 的值: 'SMITH'
SMITH CLERK 1000
PL/SQL 过程已成功完成。
SQL> /
输入 name 的值: 123
This name is not in the table.
PL/SQL 过程已成功完成。
3.
(1)loop简单循环:
SQL> edit
已写入 file afiedt.buf
1 declare
2 num pls_integer := 50;
3 begin
4 loop
5 insert into dept(deptno)values(num);
6 num := num+10;
7 exit when num >90;
8 end loop;
9* end;
SQL> /
PL/SQL 过程已成功完成。
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
50
60
70
80
90
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
已选择9行。
(2) while循环:
SQL> edit
已写入 file afiedt.buf
1 declare
2 num pls_integer := 50;
3 begin
4 while num <100 loop
5 insert into dept(deptno)values(num);
6 num := num+10;
7 end loop;
8* end;
SQL> /
PL/SQL 过程已成功完成。
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
50
60
70
80
90
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
已选择9行。
(3)for循环:
SQL> edit
已写入 file afiedt.buf
1 declare
2 num pls_integer := 50;
3 begin
4 for counter in 50..90 loop
5 if mod(counter,10)=0 then
6 insert into dept(deptno)values(counter);
7 end if;
8 end loop;
9* end;
SQL> /
PL/SQL 过程已成功完成。
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
50
60
70
80
90
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
已选择9行。
4.
SQL> declare
2 v_ename emp.ename%TYPE;
3 v_sal emp.sal%TYPE;
4 v_empno emp.empno%TYPE;
5 begin
6 v_empno := &no;
7 select ename,sal*12 into v_ename,v_sal
8 from emp where empno = v_empno;
9 DBMS_OUTPUT.PUT_LINE(v_sal);
10 end;
11 /
输入 no 的值: 7839
60000
PL/SQL 过程已成功完成。
SQL> /
输入 no 的值: 7934
15600
PL/SQL 过程已成功完成。
5.
SQL> edit
已写入 file afiedt.buf
1 declare
2 v_empno pls_integer := 7901;
3 begin
4 for counter in v_empno..7910 loop
5 if v_empno = 7902 then
6 v_empno := v_empno+1;
7 else
8 insert into emp(empno)values(counter);
9 v_empno := v_empno+1;
10 end if;
11 end loop;
12* end;
SQL> /
PL/SQL 过程已成功完成。
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7901
7903
7904
7905
7906
7907
7908
7909
7910
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择23行。