PL/SQL是ORACLE支持的编程语言,就像SQLSever的TSQL,我们可以通过它来实现更多更加灵活的功能。
特别的是,PL/SQL中有异常处理,即可以抛出异常以及相关说明,这将在下一篇博客中再做说明。
介绍PL/SQL基本语法及使用样例的系列BLOG主要由两篇,本篇将介绍PL/SQL的一些特性、变量赋值与数据类型的知识,下一篇再对PL/SQL的基本操作:游标、存储过程等进行说明。
数据库新手,如有问题,欢迎交流~
PL — Procedural Language(过程性)
强类型语言(变量在使用之前一定要先声明)
下面我们来看一下,如何使用 PL/SQL进行简单的变量声明、定义与赋值:
变量赋值
直接赋值:v_1 := 200
通过SQL语言查询结果赋值:
select number_seats
into v_NumberSeats /*表示查询结果赋值给into后的对象*/
from rooms
where room_id = '99999'
数据类型
PL/SQL中的数据类型主要分为三类:
- 标量数据类型
- 大型对象数据类型
- 复合数据类型
标量数据类型
标量类型,指内部没有任何组件的数据类型,包括有:
数字(number)、字符(character)、日期(date)、布尔(boolean)、行标识符(rowid)、原族(raw)
这些基础类型内涵子类型,可通过子类型限制变量的取值范围。
基本的类型同一般关系型数据库一致,比较少闻的原族类型用来存储二进制数据,包含两种类型:RAW(定长、2000Bytes)和LONG RAW(2GB,LOB)
大型对象数据类型(LOB)
大型对象数据类型用来存储类似图像、声音这样的大型数据对象
LOB对象可以是二进制也可以是字符数据、最大长度不超过4G
可分为:BFILE(二进制文件)、BLOB(二进制)、CLOB(字符型)、NCLOB(长度可变的字符型)四类
复合类型
Oracle中有两种复合类型,分别为记录类型RECORD和表类型
-
记录类型
相当于数据库表中的一行,不同的字段相当于数据库表中的不同列,不同字段具有不同的数据类型定义:
TYPE <recordetypename> IS RECORD (<fileldname> <datatype> [[NOT NULL] {DEFAULT|:} <expression>], <fileldname>... /*定义记录中需要的字段*/ )
通常的应用场景下,如单表查询整行的结果存储在一个记录元素内,可以采用***%ROWTYPE***属性,避免一个一个字段地去定义RECORD结构,使用如下:
/*sourcetable即所查询表的name*/ DECLARE recordname sourcetable%ROWTYPE SELECT * INTO recordname FROM sourcetable WHERE ...
-
表类型(集合类型)
表类型类似于一个数据库的表,表中有两类:Key和ValueKey的类型是BINARY_INTERGER,Value的类型是在定义中指定的类型
可以将key理解为PK,充当Value的索引
定义:
TYPE tablename IS TABLE OF type INDEX BY BINART_INTEGER
值得注意的是:
- 在表中存储的元素个数只收到BINARY_INTEGER的取值范围限制;(只要 还有值域内key值未分配,就可以继续插入数据)
- Key值是自定义的,只需要满足PRIMERY KEY的约束
- Value的类型是完全自由的,可以是普通的Oracle数据类型,也可以是记录类型
- 只有当数据被插入时,表才实际分配所需的内存空间,即永远不会有多余的空间