oracle数据库开发与应用 数据库编程 16

oracle数据库开发与应用 数据库编程 16

PL/SQL编程

PL/SQL编程的作用

1
2
3
也学过一些函数,如DECODE,具有简单的逻辑判断功能,但是,距离真正的结构化程序设计还相去甚远。于是提出这样一个问题:
SQL语言是否像基本的高级程序语言一样,具有变量、运算、判断、循环等基本功能呢?
本章学习的PL/SQL就解决这个问题。PL/SQL是一种程序语言,支持SQL语句的程序语言(ProgramLanguage)。PL/SQL在普通SQL语句的使用上增加了编程语言的特点,通过逻辑判断、循环等操作实现复杂的功能或者计算。
1
2
PL/SQL是Oracle数据库独有的一种程序语言,是Oracle 数据库对 SQL语言的扩展。
数据库不同,自有的PL/SQL语言语法可能有较大不同

PL/SQL 编程的优点

1
2
3
很明显,使用了PL/SQL编程之后,具有以下优点:能够使一组 SQL语句的功能更具模块化,便于维护,可以对程序中的错误进行自动处理,保证安全性。
集成在数据库中,调用更快。
通过多条SQL语句实现功能时,每条语句都需要在客户端和服务端传递,占用了大量的网络带宽,消耗了大量资源。如果使用了PL/SQL程序,程序的分析和执行完全在数据库内部进行,只需要发送一个执行命令,在数据内部即可完成整个PL/SQL程序的执行,并将最终的执行结果返回给用户。不占用额外的传输资源。

最简单的 PL/SQL 程序

1
PL/SQL程序块由4个基本部分组成:声明、执行体开始、异常处理、执行体结束下面是4个部分的基本结构:

image-20240524154158617

1
2
3
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello PL/SQL!');--打印,换行
END;
1
DBMS_OUTPUT.PUT_LINE函数是Oracle系统内部定义的函数,表示输出一个字符串并换行。如果不想换行,可以用DBMS_OUTPUT.PUT函数。

在 PL/SQL 中使用变量 DECLARE

1
2
3
4
5
6
7
8
在PL/SQL的声明部分声明变量、常量的基本语法如下:

DECLARE
变量名 [CONSTANT] 数据类型 [NOT NULL][:=|DEFAULT expr]
...
BEGIN
程序体
END;

image-20240524154744149

1
2
3
4
5
6
以上语法中:
变量名应该遵循基本的命名规则。
如果指定CONSTANT,则为声明常量,默认是变量。
如果指定NOT NULL,则为值不能为空,默认可以为空。
可以使用赋值运算符(:=)或DEFAULT保留字来初始化标识符,为变量或常量赋初始值。
如果没有特别说明,此处的变量指的是简单变量,数据类型可以对应 Oracle 的基本数据类型,如字符串、数值、日期等。

image-20240524155109414

变量的类型参考表中某个列的类型 %TYPE

1
2
3
4
5
6
7
如果要定义该变量的类型和TSTUDENT表中的STUNAME类型相同可以用“表名.列名%TYPE"来表示某表中某列的类型。例如:

DECLARE
stuname T_STUDENT.STUNAME%TYPE;
BEGIN
...
END;

将 SQL查询的结果存入变量

1
2
3
4
5
在PL/SQL语句中通过SELECT-INTO语句将内容存入变量:
SELECT 查询列表
INTO 变量列表
FROM 表名(连接等)
WHERE 条件;

image-20240524155706607

1
在SELECT-INTO中,对于简单变量,查询语句必须并且只能返回一行。如果返回多行或没有返回任何,则报错
1
2
3
在PL/SQL中,不允许SELECT语句单独运行,例如

系统会认为缺少 INTO语句但是,允许INSERT、DELETE、UPDATE语句单独运行。

image-20240524155920154

使用记录变量

image-20240524160254213

1
2
能否定义一个变量,既不是包含字符串数据,也不是包含日期数据,而是包含T_STUDENT表中的一整行内容组合在一起的数据呢?例如,一个变量,包含的内容有4个部分(类似Java中的一个对象),如图16-6所示记录变量可以完成这个功能。记录变量属于复合变量(组合变量),在复合变量中包含多个小变量(字段),每个小变量都可以单独存放值。

自行创建记录变量的类型
1
2
3
4
5
6
在使用记录变量时,必须先创建记录变量的类型。语法如下:
TYPE 记录变量类型 IS RECORD(
变量名 [CONSTANT] 数据类型 [NOT NULL][:=|DEFAULT expr]
变量名 [CONSTANT] 数据类型 [NOTNULL][:=|DEFAULT expr]
...
);
1
2
每个变量的定义后面是逗号,最后一个变量定义后面没有逗号。记录变量,在使用时和普通变量类似。例如,定义一个记录变量:
记录变量名 记录变量类型;
1
如果使用记录变量中的字段,只需要用“记录变量名,字段名”来实现。

image-20240524160707964

使用%ROWTYPE参照某表的记录类型
1
2
3
4
5
6
也可以让记录变量的类型参照某表中一条记录,方法如下
DECLARE
记录变量名 表名%ROWTYPE;
BEGIN
...
END;

image-20240524161117069

使用表变量

1
2
3
4
5
6
7
8
9
10
11
定义一个变量,像数组一样,包含多个类型相同的简单变量。表变量可以完成这个功能。表变量也属于复合变量。

在使用表变量时,首先必须创建表变量的类型。语法如下:
TYPE 表变量类型名称 IS TABLE OF 内部数据类型
[NOT NULL] INDEX BY BINARY_INTEGER;

表变量的容量可以是自动增长的。
表变量,在使用时和普通变量类似。例如,定义一个表变量:
表变量名 表变量类型;

如果使用表变量中的字段,只需要用“表变量名(下标)”来实现。下标一般从0开始。

image-20240524161638049

用PL/SQL实现判断逻辑

1
2
3
PL/SQL程序块中的判断逻辑可以通过下面的结构控制语句来实现:
IF语句。
CASE语句。

用IF 语句实现判断逻辑

1
2
3
4
5
6
7
8
9
10
IF 条件 THEN
代码;
[ ELSIF condition THEN
代码;]
[ ELSIF condition THEN
代码;]
...
[ ELSE
代码;]
END IF;
1
语法中的判断条件可以是1个条件或者是多个条件的组合,多个条件可以通过连接操作符(AND/OR/NOT)连接。

image-20240524162249892

1
2
3
对于空值的判断,使用ISNULL或者ISNOTNULL操作符。
任何包含空值的数学表达式,其计算结果为 NULL。
在字符表达式中出现的空值,会被作为空串处理。

用CASE 语句实现判断逻辑

1
2
3
4
5
6
7
CASE语句也是一种常见的条件判断语句。其基本语法为:
CASE 表达式
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
...
ELSE 结果 N
END;

image-20240524162728357

1
CASE的功能也可以用DECODE实现

image-20240524163357310

1
实际上,CASE的功能比DECODE强大一些,因为CASE还有另一种语法形式:

image-20240524163425837

image-20240524163729319

用PL/SQL 实现循环逻辑

1
2
3
4
PL/SQL程序块中的循环逻辑可以通过下面的结构控制语句来实现:
·LOOP 语句。
。WHILE 语句。
·FOR 语句。

用LOOP 语句实现循环逻辑

1
2
3
4
5
最简单的循环逻辑是LOOP循环。LOOP循环使程序不经过判断就进入循环,在循环体中判断条件是否满足,一旦满足条件,立刻退出循环。基本语法格式如下:
LOOP
代码;
EXIT[WHEN 条件];
END LOOP;
1
如果没有EXIT语句,将会无限循环下去。

image-20240524165624587

用 WHILE 语句实现循环逻辑

1
2
3
4
5
WHILE基本语法格式如下:
WHILE 条件
LOOP
代码;
END LOOP;

image-20240524165831089

用FOR语句实现循环逻辑

1
2
3
4
5
6
FOR循环也是经常使用的一种循环语句,使用FOR循环,循环将会执行指定的次数。下面是FOR循环的语法结构:

FOR 变量 IN [REVERSE] 下限..上限
LOOP
代码;
END LOOP;
1
2
3
REVERSE是反转的意思,正常的循环计数器从小到大递增,使用REVERSE,将使计数器从大到小递减。
在循环中使用的计数器变量不需要声明。
计数器变量只能在循环体内引用。

image-20240524170136323