今天主要学习PL/SQL块的大致理念,后续将会针对这块进行详细学习。
基本结构:
首先PL/SQL是一种模块式结构的语言:
DECLARE
声明一些变量,常量,用户定义的数据类型以及游标等 所以,我们也可以 begin 执行部分
可选,可以不写 这么写 end;
BEGIN
主程序体,程序就是执行这里的东西,可以加入各种合法语句
EXCEPTION
异常处理,当程序出现错的时候执行这里的内容
END; (这里的分号是必须的)
主程序体结束
PL/SQL注释
单行数值 --注释的内容
比如 DECLARE --程序变量定义
多行注释:由/*开头,*/结尾和C语言一样
比如:begin /* 插入一条记录
这么写*/
insert into classes (department,course)
values(V_Department ,V_Course);
End;
type 定义的数据类型
Oracle提供自定义类型功能,用户可以根据自己的情况定义记录数据类型(Record)和记录表类型(Table),其中记录数据类型Record存储是一条记录,记录表类型Table用来存储多条记录。如果记录数据类型Record是一维数组的话,记录表类型Table就是二维数组。
自定义类型有两种写法:TYPE...IS和CREATE TYPE,两种定义方式的区别是:前者一般在存储过程和函数中定义,使用范围也限于所在过程或函数,而后者方式声明对象类型,对象类型则是作为一个方案对象(像表、索引、视图、触发器一样,是一个方案对象),可以过程或函数中使用,还可以在定义表时,作为字段的类型。
1. 定义数据记录类型语法:
TYPE type_name IS RECORD (
字段1 类型1,
字段2 类型2,
...
字段n 类型n
);
说明:
1) type_name:类型名称。
比如 type teacher_record is RECORD
( TID NUMBER(5)
name varchar(50),
title varchar2(50),
sex char(1)
);
定义一个teacher_record类型的记录变量ateacher
ateacher teacher_record
引用记录变量的时候要指明内部变量,如ateacher teacher_record;
2.定义表记录
语法:
TYPE type_name IS TABLE OF element_type
INDEX BY[BINARY_INTEGER | PLS_INTEGER | VARRAY2];
说明:
1) type_name:类型名称。
2) element_type:可以是基本类型(如varchar2, Ingeger, number等)、记录数据类型(即TYPEtype_nameIS RECORD定义的类型)、%ROWTYPE。
3) INDEX BY:该语句的作用是使Number类型的下标自增长,自动初始化,并分配空间,有了该语句,向表记录插入元素时,不需要显示初始化,也不需要通过extend分配空间。Binary_Integer 与 Pls_Integer 都是整型类型。
Binary_Integer类型变量值计算是由Oracle来执行,不会出现溢出,但是执行速度较慢,因为它是由Oracle模拟执行。而Pls_Integer的执行是由硬件即直接由CPU来运算,因而会出现溢出,但其执行速度较前者快许多。
如果没有使用这个语句,又没有使用extend就会报错:ORA-06531:Reference touninitialized collection。相关解决办法
比如,tid teachers.tid%type 表示定义一个tid的变量,他的类型是teachers.tid
对于整张表的例子:teacher_record Teachers%rowtype 定义一个名为teacher_record与teachers结构类型一样的记录变量。
PL/SQL变量和常量
定义常量
常量名 constant 数据类型:=值
pass constant integer:=60
定义变量
变量名 数据类型 【宽度:=初始值】 初始值可以定义也可以不定义,这点和java不一样,但是oracle中其实是给变量赋予了初始值,值为null
控制语句:
case 结构 类似switch语句
case 表达式
when 表达式1 then 语句序列1
when 表达式2 then 语句序列1
。
。
。
when 表达式n then 语句序列n
end;
null:
关于这个,当变量没有赋初始值的时候,如果不知道系统默认是null还是一个实数,我们要在if判断的时候加一条null判断语句
if a is null or b is null then
dbms_output.put_line(判断为null)
循环结构
loop...exit...end(其中exit代表退出循环)
control:=0;
loop
if control>5 then
exit;
end if;
control:=control+1
end loop;
Loop...exit when ...end
control:=0;
loop
exit when control>5 -- 如果control>5则退出循环
control:=control + 1;
end loop;
while 。。。loop。。。end 先判断后循环
while control<5 loop
control:=control + 1;
end loop;
for...in...loop...end 可预知循环次数的语句
for control in 0...5 loop 从0到5进行循环,共循环6次
end loop;
goto 这个原理很简单,就是强制跳转,但是轻易不要使用。容易把代码复杂化。