一、背景介绍
PL/SQL是一种程序语言,也叫做过程化SQL语言(Procedural Language/SQL),是对SQL语句的扩展。在普通SQL语句的使用上,增加了编程语言的特点,把数据查询和操作语句放在PL/SQL中,通过逻辑判断、循环等操作,可以实现复杂的功能或计算。
PL/SQL的基本单位叫做块(block),由三个部分组成:一个声明部分,主要是用来定义一些变量等信息;一个执行部分,这里就是我们控制结构所处的位置;最后是一个异常处理部分,如果程序报错,我们可以根据定义的报错做相应处理。
二、块(block)的语法结构
块(block)里面可以嵌套子块,类似SQL语句里面的子查询等嵌套;块组成结构,主要涉及四个关键词:
DECLARE --标记声明部分
…… --此处用来定义常量、变量、类型和游标等
BEGIN --标记程序体部分开始
…… --此处用来编写各种PL/SQL语句、函数和存储过程
EXCEPTION --标记异常处理部分开始
…… --此处用来编写异常处理代码
END; --标记程序体部分结束
语法格式如下:
DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2 THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........
WHEN others THEN
exception3-handling-statements
END;
下面写一个简单的示例:
首先是声明部分,我们定义一个变量msg;
然后是执行部分,我们设置变量msg等于“Hello world!”,然后直接打印msg信息;
再就是异常处理部分,我们设置如果出现其他情况,打印“It is not OK!”,该部分可有可无;
最后是结束部分,不需要做任何动作。
最终执行程序,打印出“Hello world!”。
三、PL/SQL的控制结构
在上面提到的示例中,执行部分,我们也可以用到控制结构。目前达梦数据库支持PL/SQL的控制结构主要由三种:选择结构、循环结构以及跳转结构。
1、选择结构
选择结构主要用的有IF语句、CASE语句;
选择结构之IF语句,基本语法如下:
IF condition1 THEN statements1;
[ELSEIF condition2 THEN statements2;]
……
[ELSE else_statements];
END IF;
IF语句中的条件是一个布尔型变量或表达式,取值只能是TRUE,FALSE,NULL,下面测试IF语句,TEST1里面有3条数据,然后定义两个变量比较大小,根据结果打印不同返回语句:
DECLARE
T_1 BYTE;
T_2 BYTE;
BEGIN
T_1 := 5;
SELECT COUNT(*) INTO T_2 FROM SYSDBA.TEST1;
IF T_1 > T_2 THEN
PRINT 'T_1 larger than T_2!';
ELSEIF T_1 = T_2 THEN
PRINT 'T_1 equal T_2!';
ELSE
PRINT 'T_1 less than T_2!';
END IF;
END;
选择结构之CASE语句,基本语法如下:
CASE test_value
WHEN value1 THEN statements1
WHEN value2 THEN statements2
……
WHEN valuen THEN statementsn
[ELSE else_ statements]
END CASE;
该选择结构,也是对应不同的条件,返回不同的结果,下面测试,定义两个变量,给定其中一个变量具体值,另一个变量根据不同的值返回不同的结果:
DECLARE
grade CHAR(1) := '1';
v_result VARCHAR2(20);
BEGIN
v_result :=
CASE grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
ELSE 'INPUT ERROR'
END;
print v_result;
END;
2、循环结构
循环结构主要用到的有LOOP基本循环、WHILE循环、FOR循环语句;
循环结构之LOOP基本循环,基本语法如下:
LOOP
sequence_of_statement;
EXIT [WHEN condition] ;
END LOOP;
在基本循环中,也使用 CONTINUE 和 CONTINUE-WHEN 语句;要防止无限循环,必须使用EXIT或EXIT-WHEN语句;下面我们测试给定一个变量初始值,然后让这个数值在循环体内不断自增,打印当前数值:
DECLARE
x NUMBER := 0;
BEGIN
LOOP
print 'Inside loop: x = ' || TO_CHAR(x);
x := x + 1;
IF x > 10 THEN
EXIT;
END IF;
END LOOP;
print 'After loop: x = ' || TO_CHAR(x);
END;
循环结构之WHILE循环,基本语法如下:
WHILE condition LOOP
sequence_of_statement;
END LOOP;
只要条件为真,WHILE-LOOP语句就执行循环体中的语句;下面我们给定一个变量初始值,然后定义WHILE循环条件,打印数值:
DECLARE
counter INTEGER;
BEGIN
counter := 0;
WHILE counter < 6 LOOP
counter := counter + 1;
print counter;
END LOOP;
END;
循环结构之FOR循环,基本语法如下:
FOR loop_counter IN [REVERSE] low_bound .. high_bound
LOOP
sequence_of_statement;
END LOOP;
在FOR循环中,LOOP到END LOOP关键字之间,必须要有可执行语句,下面我们可以测试给定一个循环条件,当变量遍历各个不同值的时候,打印数值:
DECLARE
i NUMBER := 5;
BEGIN
FOR i IN 1..3 LOOP
print 'Inside loop, i is ' || TO_CHAR(i);
END LOOP;
print 'Outside loop, i is ' || TO_CHAR(i);
END;
3、跳转结构
跳转结构使用的试GOTO语句;
跳转结构之GOTO跳转,基本语法如下:
LABEL_NAME
...
GOTO LABEL_NAME
GOTO跳转语句,有一定限制:
块(BLOCK)内可以跳转,内层块可以跳到外层块,但外层块不能跳到内层;
IF语句不能跳入。不能从循环体外跳入循环体内。不能从子程序外部跳到子程序中;
由于GOTO语句的缺点,建议尽量少用甚至不用GOTO语句。