PL/SQL课堂练习(匿名块)
1、普通变量声明
1)、声明3个变量:full_name varchar2(20),salary number(9,2),fdate date
2)、用Select into语句从employees表为上面3个变量赋值,条件是rownum <= &_rownum
3)、用DBMS_OUTPUT.PUT_LINE()打印三个变量值,结果如:Mickel.Jordon 's salary is $4680, Joined in 1987-07-12
4)、另外声明常量PI,NUMBER(2,7)=3.1415926,声明变量flag BOOLEAN,默认值=FALSE,声明变量age NUMBER,无默认值
5)、打印上述变量
2、游标使用
2.1 静态游标定义
1)、声明3个变量full_name varchar2(20),salary number(9,2),fdate date
2)、声明一个静态游标,取出3个对应上面变量的值
3)、打开游标
4)、循环取值打印,格式如上题(可用for循环 和 loop exit循环分别实现)
5)、关闭游标
2.2 动态游标定义
1)、声明3个变量full_name varchar2(20),salary number(9,2),fdate date
2)、声明一个动态游标变量
3)、动态游标赋值并打开,指向select first_name ||'.'||last_name,salary,fire_date from employees
4)、循环取值,打印,格式如上题
5)、关闭游标
3、控制结构
3.1 IF..ELSIF ..ELSE..END IF
编程统计Employees表的各个薪水等级的人数,输出:
<3000: ***人
[3000,6000]: ***人
[6000,9000]: ***人
[9000,12000]: ***人
>12000 : ***人
3.2 CASE..WHEN..END CASE
为全球各个区域的每个员工调整薪水,考虑各区域的通货膨胀率不同,拟:
1 Europe +10%
2 Americas +13%
3 Asia +18%
4 Middle East and Africa +5%
请逐行按以下格式打印:
序号 员工全名 所在区域 原薪水 调整后薪水
1 M*.J* Europe 1000 1100
2 .......
-
no NUMBER := 0 ;
-
-
region regions.region_name%TYPE,
-
salary NUMBER
-
);
-
emp employee;
-
-
salary_new NUMBER;
-
-
mycur cur_type;
-
-
-
FROM employees emp, departments dept, locations loc, countries cty, regions re
-
-
-
-
no := no + 1;
-
-
CASE emp.region
-
-
salary_new := emp.salary * 1.1;
-
salary_new := emp.salary * 1.13;
-
salary_new := emp.salary * 1.18;
-
salary_new := emp.salary * 1.05;
-
-
-
DBMS_OUTPUT.PUT_LINE(RPAD( no, 6, ' ')||rpad(emp.full_name, 11, ' ')||rpad(emp.region,14,' ')||rpad(emp.salary,6,' ')||salary_new);
-
-
-
CLOSE mycur;
-
-
END;
4、异常处理
4.1 内置异常处理
1)、 由外部输入值作为 select * from departments where department_id = &_depid的条件
2)、 捕获NO_DATA_FOUND异常,并在控制台输出SQLCODE 和 SQLERRM,
并打印出“您指定的ID为?的部门不存在!”,其中问号为你在控制台上输入的数值
3)、若输入的部门号存在,应打印出部门的具体信息
4.2 自定义异常处理
1)、自定义一个异常MY_EXCEPTION 【可考虑用pragma exception_init对异常进行正式包装(EMP_NO_DEPT,-20080801)】
2)、遍历employees 表,打印出“ 员工ID,姓名,部门名字”
3)、如果发现一个员工没有从属部门,raise上面的自定义的异常
4)、在Exception段处理自定义的MY_EXCEPTION,输出“****属于无组织无纪律员工!”
5)、在Exception段处理OTHERS,输出SQLCODE 和 SQLERRM
-
-
emp_no_dept EXCEPTION;
-
-
-
eno employees.employee_id%TYPE,
-
deptname departments.department_name%TYPE
-
);
-
emp employee;
-
-
SELECT employee_id, first_name||'.'||last_name, department_name
-
FROM employees, departments
-
WHERE employees.department_id = departments.department_id;
-
-
-
-
OPEN mycur;
-
-
-
-
RAISE emp_no_dept;
-
-
-
-
-
CLOSE mycur;
-
-
-
-
-
END;
5、复合变量类型使用
5.1 Record类型
1)、定义一个Record类型(id,fullname,jobtitle,salary),并用其声明一个变量
2)、定义游标,SQL对应上述4个值
3)、循环取值、打印Record变量的值
5.2 TABLE类型
1)、定义一个BINARY_INTEGER TABLE类型(ID,VARCHAR2(20)),并用其声明一个变量
2)、定义游标,Select first_name|| ''.'' ||last_name name from employees
3)、循环取值,并为Table增加元素
4)、输出Table的几个属性:first,last,Count、Limit
5)、遍历Table,并输出Table的所有元素
6)、删除Table的所有元素
7)、再次输出Table的count
5.3 使用%ROWTYPE
1)、用%ROWTYPE类型声明一个变量
2)、用select * into 为该变量赋值(注意返回值应是单条记录)
3)、输出这个变量的若干列的值