实验五 PL/SQL程序设计基础

一、实验目的

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开始,EXCEPTIONEND结束(如果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程序设计基础知识,及其数据类型、变量和常量的声明。同时思考了游标与变量的区别。只要掌握的基本的语法,数据库操作大致相同。

你可能感兴趣的:(oracle)