入门精通5-PLSQL基础

这是关于PL/SQL语言基础结构、类型、控制结构的学习笔记

完整的基本结构包含三个部分:声明部分、执行部分、和异常处理部分。其中只有执行部分是必须的。

1
2
3
4
5
6
7
8
9
10
11
DECLARE
--声明变量、常量、用户定义数据类型以及游标等
--这部分声明可以不写

BEGIN
--程序主体,写各种合法语句

EXCEPTION
--异常处理程序,当程序出现错误时执行这一部分

END;--主程序结束

一些变体

1
2
3
4
5
BEGIN

EXCEPTION

END;
1
2
3
BEGIN

END;

数据类型

数值型

数值型变量类型有NUMBERPLS_INTEGERBINARY_INTEGER。其中PLS_INTEGERBINARY_INTEGER只能存储整型,NUMBER能存储整型和浮点型数。
NUMBER(P,S)是一种声明数据类型的方法,其中P是精度、S是刻度范围。精度是数值中所有有效数字的个数,而范围是小数点右边数字的各位。

字符型

字符类型用来存储字符或字符串。类型有VAQRCHAR2CHARLONGvarchar存储可变长字符,声明语法为:VARCHAR2(MaxLength)CHAR类型表示定长字符串,声明语法为:CHAR(MacLength)LONG类型变量是一个可变的字符串,与VARCHAR2类似。

日期类型

日期类型的变量类型只有一种——DATE,存储时间和日期信息,包括世纪、年、月、日、时、分、秒。DATE变量的存储空间是七个字节,每个部分占用一个字节。

布尔类型

布尔类型的变量类型只有BOOLEAN,取值范围为:true、false、null

type定义的数据类型

语法type <数据类型名称> is <数据类型>,系统允许用户定义数据类型有两种,它们是RECORDTABLE

常量与变量

常量

常量定义语法格式:

1
2
3
4
<常量名> constant <数据类型> :=<>

/*例如*/
Pass_score constant INTEGER:=60;

变量

定义变量语句格式

1
2
3
4
<变量名> <数据类型>[(宽度):=<初始值>]

/*为初始化的变量*/
address VARCHAR2(30);
- 控制语句 说明
01 if … then 判断if正确执行then
02 if … then…else 判断if正确执行then,否则执行else
03 if … then…elsif 嵌套判断
04 case 有逻辑的从数值中做出选择
05 loop…exit…end 循环控制,用判断语句执行exit
06 loop…exit when…end 循环控制,when为真执行exit
07 while…loop…end 当while为真时循环
08 for…in…loop…END 已知循环次数的循环
09 goto 无条件转向控制

选择结构

if

1
2
3
4
5
6
7
8
9
10
IF(条件表达式1) THEN
{执行语句;}
[ELSIF (条件表达式2) THEN
{执行语句;}
...
]
[ELSE
{执行语句;}
]
END IF;

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
declare
str1 constant varchar2(20):='R';

BEGIN
IF str1 IN('R','G','B') then
DBMS_OUTPUT.put_line('RGB模式');
elsif STR1 IN('Y','K','M') THEN
DBMS_OUTPUT.put_line('YKMB模式');
else
DBMS_OUTPUT.put_line('其他模式');
END IF;

END;

case

1
2
3
4
5
6
case 检测表达式
when 表达式1 then 语句1
when 表达式2 then 语句2
...
when 表达式n then 语句n
[else 其它语句]

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
declare
v_gr VARCHAR2(20) :='S'; --记录评级
v_sc VARCHAR2(20); --记录分数范围

BEGIN
v_sc:=CASE v_gr
when 'B' then '分数<60'
when 'A' then '60<分数<80'
when 'S' then '80<分数'
else 'power!!!'
END;

DBMS_OUTPUT.put_line('XX同学的评级是'||v_gr||',对于分数范围为:'||v_sc);

END;

循环结构

LOOP…EXIT…END

关键字loopend表示循环执行的语句范围,exit关键字表示退出循环,一般在if判断中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DECLARE
control_var NUMBER;
BEGIN
control_var:=0;

LOOP
IF control_var>5 THEN
EXIT;
END IF;

DBMS_OUTPUT.put_line('control_var IS '||control_var);
control_var:=control_var+1;
END LOOP;

DBMS_OUTPUT.put_line('过程结束');
END;

LOOP…EXIT WHEN…END

WHEN后面接退出循环体的条件,先循环再判断退出条件。

1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE
control_var NUMBER;
BEGIN
control_var:=0;

LOOP
EXIT WHEN control_var>2;
DBMS_OUTPUT.put_line('control_var = '||control_var);
control_var:=control_var+1;
END LOOP;

DBMS_OUTPUT.put_line('过程结束');
END;

WHILE…LOOP…END

WHILE后面为进入循环体的条件,该语句先判断退出条件再进入循环体。

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE
control_var NUMBER;
BEGIN
control_var:=8;

WHILE control_var>5 LOOP
DBMS_OUTPUT.put_line('control_var '||control_var);
control_var:=control_var-1;
END LOOP;

DBMS_OUTPUT.put_line('“WHILE...LOOP...END”演示介绍');
END;

FOR…IN…LOOP…END

1
2
3
4
5
6
7
8
9
10
DECLARE
control_var NUMBER;
BEGIN

FOR control_var IN -1..2 LOOP
DBMS_OUTPUT.put_line('var '||control_var);
END LOOP;

DBMS_OUTPUT.put_line('“FOR...IN...LOOP...END”演示介绍');
END;

表达式

按照操作对象的不同,表达式的分为字符表达式、布尔表达式两种,所以运算符也分为两类

  • 字符运算符:字符连接符||
  • 布尔运算符:ANDORNOT
  • 布尔表达式中算数运算符:等于=,不等于!=,大于>,大于等于>=,小于<,小于等于<=
  • 布尔表达式中其他运算符:BETWEEN ... AND ...划定范围,例如7 BETWEEN 3 AND 99为真;IN判断某一元素是否属于某个集合,例如'Scott' IN ('SYS','John','Mary')为假