数据库复习10――PL/SQL(一)

2015-07-24 06:34:58 · 作者: · 浏览: 6
CH10 PL/SQL
?
10.1 PL/SQL简介
?
PL/SQL是Oracle对SQL的过程化的扩展,PL/SQL可以实现SQL相关的过程化程序,并且能够以存储过程和函数的方式让一段SQL业务逻辑驻留在SQL服务器中,以便减少客户机计算任务并减少网络I/O
?
10.2 PL/SQL 编程基础
?
(1)简介
?
PL/SQL编程框架为:
DECLARE 
    
BEGIN
    
EXCEPTION
    
END

?

?
若是存储过程或函数,首部换成Create Procedure/Function ... IS (见后例)
?
先看一个完整的PL/SQL程序例子:
?
?DECLARE
    name varchar2(20);
BEGIN
    Select sname Into name From Student Where s#='001';     DBMS_OUTPUT.PUT_LINE('学号001的学生姓名是:' || sname)
EXCEPTION
    When NO_DATA_FOUND Then
        DBMS_OUTPUT.PUT_LINE('学号为001的学生不存在');
    When others Then
        DBMS_OUTPUT.PUT_LINE('发生了其它错误');
END;

?

?
其中:
?
name varchar2(20)声明一个类型为varchar2长度为20的变量name
select S into V是扩展的select语句,把表的字段S赋值给变量V
DBMS_OUTPUT.PUT_LINE()是PL/SQL标准输出语句
when then 是PL/SQL异常处理的分支判断
(2)变量声明
?
变量声明分成普通声明、表字段类型声明和记录类型声明
?
普通声明name varchar2(20);等价于表字段类型声明name Student.sname%TYPE,后者利用了某表的某字段的类型来声明变量的类型
?
记录类型相当于结构体,提高程序可读性,如定义stu记录类型:
TYPE stu IS RECORD (
    S# varchar2(10),
    name varchar2(20),
    age number
);

val stu;

?

?
引用时用点运算:val.name
?
(3)分支与循环
?
1.if分支
?
If  Then
    
Elseif  Then
    
Else
    
End If;

?

?
注意=是相等,:=是赋值
?
2.while循环
While  Loop
    
End LOOP;

?

3.for循环
For  In [Reverse] .. Loop
    
End LOOP;

?

?
4.loop循环
?
无条件的Loop,必须在循环体内部加入退出语句Exit;或Exit When 才能退出该循环
?
(4)异常处理
?
标准格式:
?
Exception
    When  Or  Then
        
    ...
    When Others Then
        

?

?
系统定义的exception_name包括:
?
NO_DATA_FOUND:select into语句未找到匹配元组
TOO_MANY_ROWS:select into返回多行数据
VALUE_ERROR:赋值错误(类型不匹配、长度过长)
ZERO_DIVIDE:除零
TIMEOUT_ON_RESOURCE:等待资源超时
可以通过Raise 生成一个自定义的异常,然后在Exception段捕捉它;也可以raise_application_error生成一个程序错误,由外部捕捉
?
10.3 游标
?
PL/SQL每次只能处理单个元组,为了使其和SQL**多元组处理的特性保持一致,引入游标**
?
游标是客户机上用来存放SQL语句返回中间结果的一块内存,目的是为了协调PL/SQL和SQL间数据处理数目的矛盾
?
(1)声明与打开关闭
?
PL/SQL中游标只能存储select语句的中间结果,其声明如下:
?
Declare
? ? Cursor IS