SQL的4GL,对流程控制的支持不够,Oracle的PL/SQL是3GL,添加了流程控制、变量等支持可以在数据库层面上进行程序的设计。
PL/SQL的特点
1.支持事务控制和SQL.
2.数据类型在SQL的基础上进行了扩展。
3.PL/SQL可存储在Oracle数据库上。
4.可以对PL/SQL进行权限控制。
PL/SQL的优势
1.可以提高横向的运行性能。
2.可以使程序模块化。
3.可以采用逻辑控制语句来控制程序的结构。
4.利用运行时的错误信息,做日志记录。
5.良好的移植性。
PL/SQL的结构
pl/sql的基本单位是块,分为三部分:声明部分,执行部分和异常处理部分。
以declare作为开始标记,执行部分用begin作为标志,异常处理部分以exception作为标志,其中执行部分是必须有的。
[declare]
....
begin
...
[exception]
...
end;
例如:
只包含执行体
begin dbms.output.put_lin('执行体...');
end;
注意,在使用dbms_output之前要打开控制器输出开关:set serveroutput on;
包含声明和执行体两部分:
declare
v_result number(8,2);
begin v_result = 100 / 6;
dbms_output.put_line('结果是:'||v_result);
end;
包含声明、执行体和异常处理三部分
declare
v_ename varchar2(20);
begin
select ename into v_ename from emp where empno=7369;
dbms_output.put_line('姓名:'||v_ename);
exception
when no_data_found then
dbms_output.put_line('没有该员工');
when too_many_rows_exeption then
dbms_output.put_line('数据过多');
end;
variable_name datatype[ [not null] {:=|default} expression];
2.常量声明
constant_name constant datatype
[not null]
{:=default} expression;
常量的datatype有以下三种:
1)标量类型:单一类型,不存在组合
2)复合类型:由几种单一类型组成
3)引用类型:使用其他数据项的引用
标量类型:
数值
number(pression,scade)
binary_integer
pls_integer
simple_integer
字符
char
varchar2
nvarchar
long
布尔类型
true/false/null
日期类型
date/datestamp
复合类型(先定义后声明变量)
记录类型声明语法
type type_name is recode
(
field_name datatype
[ [not null] {:=|default} expression]
[,field_name datatype
[not null]
{:=|default} expression
]
);
VARRAY变长数组:它是一个存储有序元素的集合,适合较少的数据使用。
声明语法:
type type_name is {varray} (size_limit) of element_type [not null]
1.IF条件语句
①
IF condition THEN
statement;
END IF;
②
IF condition THEN
statement;
ELSE
statement;
ENDF IF;
③
IF condition THEN
statement;
ELSE IF condition THEN
statement;
ELSE
statement;
END IF;
2.CASE语句
①简单case
[<<label_name>>]
CASE case_operate
WHEN condition THEN
statement;
[WHEN condition THEN
statement;]
[ELSE
statement;]
END CASE[<<label_name>>]
②搜索case
[<<label_name>>]
CASE
WHEN boolean_exp THEN statement;
[WHEN boolean_exp THEN statement;]
...
[ELSE statement;]
END CASE[<<label_name>>]
[<<label_name>>]
LOOP
statement;
END LOOP [<<label_name>>];
基本loop语句通常和exit连用,否则会出现死循环
[<<label_name>>]
loop
....
exit when ...
| if ... exit;
2.WHILE..LOOP
[<<label_name>>]
when boolean_exp
loop
statement;
end loop[<<label_name>>]
3.FOR…LOOP
[<<label_name>>]
for index_name in
[REVERSE] //反向
lower_bound, upper_bound
loop
statement;
end loop[<<label_name>>]