Pl/sql块
分为匿名块和命名块(函数、存储过程、包、触发器等)。
1.数据类型
数字类型:BINARY_INTEGER(二进制存储)、NUMBER(十进制)等。
字符类型:CHAR、VARCHAR、VARCHAR2等。
存储时,变长与定长,比较时,是否会自动缩减空格(也叫做填充比较和非填充比较)。
日期类型:DATE、TIMESTAMP等。
DATE不包含秒的小数部分,TIMESTAMP包含。
布尔类型:BOOLEAN。
True、false、null。
记录类型:RECORD。
集合类型:TABLE。
等等其他类型。
2.控制结构
①if语句
If 条件 Then 执行语句;
Elsif 条件 then 执行语句;
Else 执行语句 ;
End if;
②case语句
Case 变量
When 值1 then 执行语句;
When 值2 then 执行语句;
。。。
End case;
或者是:
Case
When 条件1 then 执行语句;
When 条件2 then 执行语句;
....
End case;
同corejava中的switch,虽然没有break语句,但是当满足一个when的条件而执行其后的操作后,直接结束case语句块。
3.循环结构
①简单循环
Loop
...
Exit when 条件;
End loop;
②while循环
While 条件
Loop
....
End loop;
③for循环(普通for循环)
For 变量 in [reverse] 下界..上界
loop
....
End loop;
4.记录类型、集合类型的定义
记录类型record和集合类型table
表名persons
id |
name |
age |
1 |
Mimi |
16 |
2 |
Nini |
19 |
3 |
Coco |
18 |
记录类型即为表中所放的记录的类型,集合类型可以看成放有n条记录的一张表。这里person是记录类型,而persons这张表是集合类型。
不能理解的可以从corejava编程中进行联想:
记录类型就可看成是一个没有方法只有属性的自定义的类。
定义记录类型:
Type record_type is record{
——————————————————
id number(6) default 100;
Name varchar2(20):= null;
——————————————————
};
而集合类型,顾名思义,将其看成是装有n个基本类型变量或者是引用类型record_type的实例集合。
定义集合类型:
Type table_name is table of element_type
Index by binary_integer;
4.游标
可当成 一个带有指针的临时性的表,而fetch出来的是以记录为单位的。联想corejava,可以把游标当成迭代器。
所以不要以为定义游标的时候select出来的仅有一个字段(如varchar2类的),fetch出来的类型就是该字段类型的,事实上fetch出来的是一个记录、包含了select出来字段的一条记录类型。
①定义游标
Cursor 名字 is select语句;
②打开游标
Open 名字;
③检索游标
Fetch 名字 into 变量;
④关闭游标
Close 名字;
5.异常
Declare
声明异常(自定义异常、非预定义异常)
Begin
(执行体。条件判断后,执行语句抛出自定义异常,同try)
Exception
When判断异常(相当于corejava中的catch)
End;
PL/SQL中的异常,三类:
预定义异常、非预定义异常和用户自定义异常。
非预定义异常:当pl/sql块执行出现错误时,报错一个错误号,为了捕捉该错误,将错误号与异常关联,即成非预定义异常。
异常名 exception;
Pragma exception_init(异常名,错误号);
6.存储过程和函数
存储过程:
Create [ or replace ] Procedure 名(参数列表)
As|is
声明部分
Begin
。。。。
[exception] End [名];
函数:
Create [ or replace ] function 名(参数列表)
Return 类型
As|is
声明部分
Begin
。。。。
[exception] End [名];
参数列表中参数的声明:
参数名 参数模式 参数类型
Id in | out | in out number
默认时,为in,参数可为变量或者常量。
另外两种,必须为变量。
存储过程和函数的区别主要在返回值上。存储过程并非是没有返回,可以通过参数返回返回值的,自身不具有返回,即没有显示的返回。而函数除了参数列表的参数有返回能力以外,还有一个显式的返回值,即自身返回值。
7.包
包分为包规范和包体。包即是将相关的pl/sql元素组织在一起,打包。
包体的实现一定要先定义包规范。
包可以只有规范,而没有包体。
包规范:
Create or replace package 名字
Is|as
...(元素声明)
如:Procedure 名字(参数列表);
End [名字];
包体:
Create or replace package body名字
Is|as
...(元素)
End [名字];