一、实验目的
1) 掌握PL/SQL程序设计基础知识
2) 掌握PL/SQL数据类型、变量和常量的声明
3) 掌握PL/SQL程序的控制结构
4) 掌握PL/SQL程序中游标、异常处理的方法
二、预习内容
1) PL/SQL语言的特点及功能特性是什么?
与SQL语言紧密集成,所有的SQL语句在PL/SQL中都可以得到支持。 2. 减小网络流量,提高应用程序的运行性能。 3. 模块化的程序设计功能,提高了系统的可靠性。 4. 服务器端程序设计的可移植性好。
2) PL/SQL程序结构及各个部分的作用是什么?
声明部分:以关键字DECLARE开始,BEGIN结束。主要用于声明变量、常量、数据类型、游标、异常处理名称以及本地(局部)子程序定义等。
执行部分:是PL/SQL块的功能实现部分,以关键字BEGIN开始,EXCEPTION或END结束(如果PL/SQL块中没有异常处理部分,则以END结束)。该部分通过变量赋值、流程控制、数据查询、数据操纵、数据定义、事务控制、游标处理等实现块的功能。
异常处理部分:以关键字EXCEPTION开始,END结束。该部分用于处理该块执行过程中产生的异常。
3) 什么是游标?显式游标的操作包括哪几个步骤?
游标(CURSOR)是指向Oracle系统内存一个工作区的指针,在其中存放SELECT语句返回的查询结果。
4) 说明PL/SQL程序中的异常处理机制。
Oracle中对运行时错误的处理采用了异常处理机制。一个错误对应一个异常,当错误产生时就抛出相应的异常,并被异常处理器捕获,程序控制权传递给异常处理器,由异常处理器来处理运行时错误。
三、实验环境
32位Windows XP/WindowsServer2000/Windows Server2003 +Oracle10g环境
四、实验内容
根据Oracle数据库scott模式下的emp表和dept表,完成下列操作。
1) 编写一个PL/SQL块,输出所有员工的员工姓名、员工号、工资和部门号。
DECLARE
CURSOR c_emp IS select * from emp; BEGIN
FOR v_emp IN c_emp LOOP
DBMS_OUTPUT.PUT_LINE(v_emp.ename||' '||v_emp.empno||' '||v_emp.deptno||' '||v_emp.sal); END LOOP; END;
2) 编写一个PL/SQL块,输出所有比本部门平均工资高的员工信息。
declare
cursor c_emp is select * from emp where sal>(select avg(sal) from scott.emp); v_emp c_emp%rowtype; begin
open c_emp;
loop fetch c_emp into v_emp; exit when c_emp%notfound;
dbms_output.put_line(v_emp.ename||' '||v_emp.sal); end loop; close c_emp; end;
3) 编写一个PL/SQL块,输出所有员工及其部门领导的姓名、员工号及部门号。
declare
cursor c_emp is select * from emp where sal>(select avg(sal) from scott.emp); v_emp c_emp%rowtype; begin
open c_emp;
loop fetch c_emp into v_emp; exit when c_emp%notfound;
dbms_output.put_line(v_emp.ename||' '||v_emp.sal); end loop; close c_emp; end;
4) 查询姓名为“Smith”的员工信息,并输出其员工号、姓名、工资、部门号。如果该员工不存在,则插入一条新记录,员工号为2012,员工姓名为“Smith”,工资为7500元,入职日期为“2002-03-05”,部门号为50;如果存在多个名为Smith的员工,则输出所有名为“Smith”的员工号、姓名、工资、入职日期、部门号。
Declare
v_emp emp%rowtype; begin select * into v_emp from scott.emp where ename='SMITH'; dbms_output.put_line(v_emp.empno||''||v_emp.ename||''||v_emp.sal||' '||v_emp.hiredate||''||v_emp.deptno); exception when no_data_found then
insert into scott.emp(empno,ename,sal,hiredate,deptno) values(2012,'SMITH',7500,'5-3 月-2002',50);
when too_many_rows then
for v_emp in (select * from scott.emp where ename='SMITH')LOOP dbms_output.put_line(v_emp.empno||''||v_emp.ename||''||v_emp.sal||' '||v_emp.hiredate||' '||v_emp.deptno); end loop; end;
五、实验步骤
写出每一项实验内容对应的SQL语句。
六、思考题
游标与游标变量有什么区别?
oracle游标是数据库中一个命名的工作区,当游标被声明后,他就与一个固定的SQL想关联,在编译时刻是已知的,是静态的.它永远指向一个相同的查询工作区.
游标变量可以在运行时刻与不同的SQL语句关联,在运行时可以取不同的SQL语句.它可以引用不同的工作区.
oracle游标和游标变量是不能相互代替的. 如何定义游标类型
TYPE ref_type_name IS REF CURSOR [RETURN return_type]; 声明游标变量
cursor_name ref_type_name;
ref_type_name 是后面声明游标变量时要用到游标类型(自定义游标类型,即CURSOR是系统默认的,ref_type_name是我们定义的 );return_type代表数据库表中的一行,或一个记录类型TYPE ref_type_name IS REF CURSOR RETURN employee%TYPE
RETURN 是可选的,如果有是强类型,可以减少错误,如果没有return是弱引用,有较好的灵活性. 不能在包头里面声明游标变量,注意,但可以定义游标类型,要注意这二者的区别. 可以声明游标变量作为函数或过程的形式参数. 6) 说明PL/SQL程序中的异常处理机制。
Oracle中对运行时错误的处理采用了异常处理机制。一个错误对应一个异常,当错误产生时就抛出相应的异常,并被异常处理器捕获,程序控制权传递给异常处理器,由异常处理器来处理运行时错误
七、实验总结
通过本次实验我掌握PL/SQL程序设计基础知识,及其数据类型、变量和常量的声明。同时思考了游标与变量的区别。只要掌握的基本的语法,数据库操作大致相同。