PLSQL编程语言的使用与程序设计 下载本文

实验五 PL/SQL编程语言的使用与程序设计

【开发语言及实现平台或实验环境】

Oracle10g

【实验目的】

(1)了解PL/SQL在Oracle中的基本概念; (2)掌握PL/SQL的各组成部分; (3)PL/SQL的运用。

【实验原理】 1.PL/SQL字符集

和所有其他程序设计语言一样,PL/SQL也有一字符集。读者能从键盘上输入的字符集是PL/SQL的字符。此外,在某些场合,还有使用某些字符的规定。我们将要详细介绍:

? 用PL/SQL编程时可能使用的字符 ? 算术运算符 ? 关系运算符 ? 杂符号 1)合法字符

用PL/SQL程序时,允许使用下列字符: ? 所有大、小写字母 ? 数字0到9 ? 符号:()+-*/〈 〉=!~;:.‘@ %,“# $ ^ & _ | { } ? [ ] 2)算术运算符

下面列出了PL/SQL中常用的算术运算符。如果读者使用过其他高级程序设计语言,想必不会陌生:

表6 算术运算符 运算符 意义 + 加法 - 减法 * 乘法 / 除法 ** 幂

关系运算符

下面列出了PL/SQL中常用的关系运算符。如果读者有使用其他程序设计语言的经验,一定见过这些符号:

表7 关系运算符 运算符 意义 <> 不等于 != 不等于 ^= 不等于 < 小于 > 大于 = 等于

3)杂符号

PL/SQL为支持编程,还使用下述符号。下面列出了部分符号,它们是最常用的,也是使用PL/SQL的所有读者都必须了解的。

表8 杂符号 符号 ( ) ; . , := || -- /*与*/ 列表分隔 语句结束 项分隔(在例子中,用分隔account与table_name) 字符串界定符 赋值 并置 注释符 注释定界符 意义 样例 (‘Jones’,’Roy’,’Abramson’) Procedure_name(arg1,arg2) Select * from account.table_name; if var1 = ‘SANDRA’ Rec_read := rec_read+1 Full_name:=’Nahtan’||’’||’Yebba’ --This is a comment /*This too is a comment */ 4)变量

变量是PL/SQL中用来处理数据项所用的名字。读者根据下列规则选择变量名称: ? 变量必须以字母(A~Z)开头。

? 其后跟可选的一个或多个字母,数字(0~9)或特殊字符$、# 或_。 ? 变量长度不超过30个字符。 ? 变量名中不能有空格。 5)保留字

保留字可视为PL/SQL版权所有的字符串。在定义变量名时,读者不能使用这些保留字。例如,词“loop”在PL/SQL中有特殊含义,因此下列代码是非法的:

declare employee varchar2(30); loop number;

保留字不能用作变量名。尽管我们不推荐,但如果读者坚持,也可以连接两个保留字形成变量名(如loop_varchar2)。完整的PL/SQL保留字表可以在Oracle8文档中找到。

2、常用数据类型

到目前为止,我们讨论了在PL/SQL中编程时允许使用的字符,变量的命名和保留字。下面着重讨论数据类型。PL/SQL程序用于处理和显示多种类型的数据。和所有计算机软件一样,Oracle也将数据类型分成大量的子类。例如:数可分为整型(不允许有小数)和小数(有一位小数或多位小数)类。PL/SQL支持多种数据类型,此处讨论代码中最常用并且最实用的数据类型。 ? Varchar2 ? Number ? Date ? Boolean

3.PL/SQL的组件

1)块结构(Block structure)

PL/SQL程序是由独立的变量声明、执行代码和异常处理等部分代码块写成的。PL/SQL可以作为一个命名的子程序存放在数据库中,或直接在SQL*Plus窗口中作为一个匿名的块

编码。当在数据库中存储PL/SQL时,子程序包括存储单元命名的头部分,程序类型的声明;以及可选的in, out 和in out参数的定义。只是可执行部分定义为begin 和end语句是固定的。Declare 和exception部分是可选的。

下面在一个无名块上和一个存储过程的例子。 --无名块 declare … begin … end;

--存储过程

create or replace precodure_name as --声明部分自动跟着语句而不需要编码。 … begin … exception … end;

2)声明部分(Declare section)

此PL/SQL块用于定义变量。在declare段中,我们可找到前面讲过的常用数据类型,以及下一节要介绍的cursor(光标)变量类型。下面的程序是一个过程的declare段例子。 当存储对象(命名块)产生时,declare 段自动跟着as关键字。在SQL*Plus编写一个PL/SQL代码块(匿名块)时,用户必须指定DECLARE。 Create or replace procedure samp(I_salary in number, I_city in number) as

--这是DECLARE段;因为我们正在进行命名存储对象的编码,declare是隐含的,不需写---出。

Accum1 number; Accum2 number;

H_date date := sysdate; -变量能在此初始化 Status_flag varchar2(1); Mess_text varchar2(80); Temp_buffer varchar2(1); 3)控制结构 A)if逻辑结构

在编写计算机程序时,有各种各样的情况需要处理。这时必须测试条件,如果测试值为TRUE,做某事,为FALSE,做另一件不同的事。PL/SQL提供三种if逻辑结构供用户测试TRUE/FALSE以完成相应的工作。 b1)if-then

这个结构用于测试一个简单条件。如果该条件为TRUE,则执行一行或多行代码;如果条件

测试为FALSE,则程序控制转到后面的代码。 在PL/SQL中实现if逻辑有两条规则: 规则1

每个if语句都有自己的then,以if开始的语句行不跟语句结束符(;)。 规则2

每个if语句块以相应的end if结束。 b2)if-then-else

这种结构与if语句非常相似,唯一不同的是在条件为FALSE时,执行跟在else后的一条或多条语句。

下面是PL/SQL中if逻辑的另外两条规则: 规则3

每个if语句有且只有一个else。 规则4

else语句行不跟语句结束符。

if-then-elsif这种结构用于替代嵌套if-then-else结构。 PL/SQL中有关if逻辑的最后一条规则: 规则5

elsif无匹配的end if。

实际上,该end if术语本语句块开始的if,而不属于elsif关键字。注意上列各清单的代码缩进部分是如何表示它们属于那一条件的。

前些例子只说明了一个elsif的语句;但是,在任何if语句中可以有许多elsif语句。值得注意的是else语句是不需要的。

关于前面举过的执照管理部门(DMV)的例子,用PL/SQL编程表示其逻辑如下。根据“the_act”的值,过程 12a,12b,12g将被调用:

create or replace procedure license_transaction(the_act in varchar2 as begin if the_act = ‘DCT’ then 12a;

elseif the_act = ‘DT’ then 12b; else 12g; end if; end; B)循环

下面几节介绍PL/SQL中使用的几种循环形式。 LOOP-EXIT-END循环:

此循环结构由三部分组成,其用法参见下面示例中的注释: cnt:=1; --在循环开始前,初始化循环计数器

loop --第一部分:以循环关键字loop开始循环 cnt:=cnt+1; --第二部分:增加循环计数器的值 if cnt>=100 then -- 测试cnt是否符合退出条件 exit; -- 满足退出条件,退出循环 end if; -- End if与前面的if匹配 …