一、块
1.块结构
PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL
程序包含了一个或多个逻辑块,每个块都可以划分为三个部分。
1)块的三个部分
①声明部分(Declaration section)
声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分。
②执行部分(Executable section)
执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。
③异常处理部分(Exception section)
这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论在后面进行。
2)块语法
PL/SQL块语法结构如下:
[DECLARE]
Declaration
Statements
BEGIN
Executable
Statements
[EXCEPTION
Exception Handlers]
END
PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以多行,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。每一个PL/SQL块由BEGIN或DECLARE开始,以END结束。注释由--标示。
2.块的命名和匿名
PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序块,匿名程序块可以用在服务器端也可以用在客户端。
执行部分包含了所有的语句和表达式,执行部分以关键字BEGIN开始,以关键字EXCEPTION结束,如果EXCEPTION不存在,那么将以关键字END结束。分号分隔每一条语句,使用赋值操作符:=或SELECT
INTO或FETCH
INTO给每个变量赋值,执行部分的错误将在异常处理部分解决,在执行部分中可以使用另一个PL/SQL程序块,这种程序块被称为嵌套块。
所有的SQL数据操作语句都可以用于执行部分,PL/SQL块不能在屏幕上显示SELECT语句的输出。SELECT语句必须包括一个INTO子串或者是游标的一部分,执行部分使用的变量和常量必须首先在声明部分声明,执行部分必须至少包括一条可执行语句,NULL是一条合法的可执行语句,事物控制语句COMMIT和ROLLBACK可以在执行部分使用,数据定义语言(Data
Definition language)不能在执行部分中使用,DDL语句与EXECUTE
IMMEDIATE一起使用或者是DBMS_SQL调用。
3.块的执行
SQL*PLUS中匿名的PL/SQL块的执行是在PL/SQL块后输入/来执行。
命名的程序与匿名程序的执行不同,执行命名的程序块必须使用EXECUTE关键字。
如果在另一个命名程序块或匿名程序块中执行这个程序,那么就不需要EXECUTE关键字。
注意:如果在PL/SQL
Developer中执行需在EXECUTE前后加上BEGIN和END关键字。
二、变量、常量与字符集
1.变量
1)声明变量
声明变量的语句格式如下:
Variable_Name [CONSTANT] databyte [NOT NULL] [:=DEFAULT
EXPRESSION]
注意:可以在声明变量的同时给变量强制性的加上NOT
NULL约束条件,此时变量在初始化时必须赋值。
2)给变量赋值
给变量赋值有两种方式:
①直接给变量赋值
eno := 7369;
myname := 'SCOTT';
②用户交互赋值
eno := &empno;
运行时系统会提示用户输入empno,用户输入的值将存入eno变量。
③通过SQL
SELECT INTO 或FETCH INTO给变量赋值
SELECT EMP_NAME INTO MyName FROM EMPLOYEES WHERE EMPID =
eno;
注意:只有在该查询返回一行的时候该语句才可以成功否则就会抛出异常。
2.常量
常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,声明方式与变量相似,但必须包括关键字CONSTANT。常量和变量都可被定义为SQL和用户定义的数据类型。
为了减少这部分程序的修改,编程时使用%TYPE、%ROWTYPE方式声明变量,使变量声明的类型与表中的保持同步,随表的变化而变化,这样的程序在一定程度上具有更强的通用性。
3.有效字符集
① 所有的大写和小写英文字母;
② 数字0-9;
③ 符号:0+一*/<>=!一;:.‘@%,“‘#“&_}{}?[];
PL/SQL标识符的最大长度是30个字符,并且不区分字母的大小写。但是适当地使用大小写,可以提高程序的可读性。
例如:定义如下若干类型变量,常量。
DECLARE
ORDER_NO NUMBER(3);
CUST_NAME VARCHAR2(20);
ORDER_DATE
DATE;
EMP_NO INTEGER
:= 25;
PI CONSTANT NUMBER :=
3.1416;
BEGIN
NULL;
END;
<!--[if
!supportLists]-->①<!--[endif]-->算术操作符
<!--[if
!supportLists]-->②<!--[endif]-->关系操作符
<
|
小于
|
<=
|
小于等于
|
>
|
大于
|
>=
|
大于等于
|
=
|
等于
|
!=
|
不等于
|
<>
|
不等于
|
:=
|
赋值
|
<!--[if
!supportLists]-->③<!--[endif]-->比较操作符
IS NULL
|
如果操作数为NULL返回TRUE
|
LIKE
|
比较字符串值
|
BETWEEN
|
验证值是否在范围之内
|
IN
|
验证操作数在设定的一系列值中
|
<!--[if
!supportLists]-->④<!--[endif]-->逻辑操作符
AND
|
两个条件都必须满足
|
OR
|
只要满足两个条件中的一个
|
NOT
|
取反
|
<!--[if !supportLists]-->
三、分支语语句
1.条件
1)IF条件判断逻辑结构
If条件判断逻辑结构有三种表达方式。
①表达式一:
IF Condition THEN
Statement;
END
IF;
该表达式的功能为:若条件为真,执行then后的语句;否则,跳出条件语句执行end if后的语句。
②表达式二:
IF Condition THEN
Statements_1;
ELSE
Statements_2;
END
IF;
该表达式的功能为:如果条件为真执行then后的语句,否则执行else后的语句。
③表达式三:
IF Condition1 THEN
Statements_1;
ELSEIF Condition2 THEN
Statements_2;
ELSE
Statements_3;
END
IF;
该表达式的功能为:如果if后的条件成立,执行then后面的语句,否则判断elseif后面的条件,条件成立执行第二个then后面的语句,否则执行else后的语句。这是条件语句嵌套。IF
可以嵌套,可以在IF 或IF ..ELSE语句中使用IF或IF…ELSE语句。
2)CASE表达式
CASE语句的基本格式如下:
CASE Grade
WHEN 'A'
THEN DBMS_OUTPUT.PUT_LINE ('Excellent');
WHEN 'B'
THEN DBMS_OUTPUT.PUT_LINE ('Very
Good');
WHEN 'C'
THEN DBMS_OUTPUT.PUT_LINE ('Good');
WHEN 'D'
THEN DBMS_OUTPUT.PUT_LINE ('Fair');
WHEN 'F'
THEN DBMS_OUTPUT.PUT_LINE ('Poor');
ELSE DBMS_OUTPUT.PUT_LINE ('No such
grade');
END CASE;
CASE语句的功能:首先设定变量的值作为条件,然后顺序检查表达式,一旦从中找到与条件匹配的表达式值,就停止CASE语句的处理。
2.循环
1)LOOP…EXIT…END循环控制语句
LOOP循环语句是其中最基本的一种,格式如下:
LOOP
Statements;
END
LOOP;
这种循环语句是没有终止的,如果不人为控制的话,其中的Statements将会无限地执行。一般可以通过加入EXIT语句来终结该循环。
2)WHILE…LOOP循环控制语句
WHILE…LOOP循环控制语句的格式如下:
WHILE Condition
LOOP
Statements;
END
LOOP;
WHILE…LOOP有一个条件与循环相联系,如果条件为TRUE,则执行循环体内的语句,如果结果为FALSE,则结束循环。
3)FOR…LOOP循环控制语句
FOR…LOOP循环控制语句的格式如下:
FOR Counter IN [REVERSE] Start_Range…End_Range
LOOP
Statements;
END
LOOP;
LOOP和WHILE循环的循环次数都是不确定的,FOR循环的循环次数是固定的,Counter是一个隐式声明的变量,初始值是Start_Range,第二个值是Start_Range
+ 1,直到End_Range,如果Start_Range等于End
_Range,那么循环将执行一次。如果使用了REVERSE关键字,那么范围将是一个降序。
3.跳转
GOTO语句的格式如下:
GOTO LABEL;
执行GOTO语句时,控制会立即转到由标签标记的语句(使用<<>>声明)。PL/SQL中对GOTO语句有一些限制,对于块、循环、IF语句而言,从外层跳转到内层是非法的。
DECLARE
X NUMBER(3);
Y NUMBER(3);
V_COUNTER NUMBER(2);
BEGIN
X
:= 100;
FOR V_COUNTER IN 1 .. 10 LOOP
IF
V_COUNTER = 4 THEN
GOTO
end_of_loop;
END
IF;
X := X +
10;
END LOOP;
<<end_of_loop>>
Y
:= X;
dbms_output.put_line('Y:'||Y);
END;
输出结果为“Y:130”。
4.嵌套
程序块的内部可以有另一个程序块这种情况称为嵌套。嵌套要注意的是变量,定义在最外部程序块中的变量可以在所有子块中使用,如果在子块中定义了与外部程序块变量相同的变量名,在执行子块时将使用子块中定义的变量。子块中定义的变量不能被父块引用。同样GOTO语句不能由父块跳转道子块中,反之则是合法的。