数据类型
标量类型
1.numeric:存放整数,实数,浮点数 包括: 1.binary_integer 存储带符号整数,pls_integer和binary_interger值比nuber值占用较少存储空间,但binary_integer操作比pls_integer慢。 子类: 1.natural:存储非负整数 2.naturaln:存储非负整数,不能为空 3.positive:存储正整数 4.positive:存储正整数,不能为空 5.signtype:存储-1,0,1 2.number存储定点数,浮点数 1.定点数:nubmer(precision,scale) 2.整型数:number(precision) 3.浮点数:number 数度为38为的十进制浮点数 3.pls_integer 存储带符号整数,范围同binary_integer,两者不完全兼容。比nubmer和binary_integer类型快。 2.character:存放字符串 包括: 1.char 存放固定长度字符数据。 char[(max_length)] 最大长度(字节单位),缺省为1,最大32767。 如果char(n)类型的变量用于存储多字节字符,则最大长度小于n个字符,如果不满n个字符,则末尾用空格填充。数据库char类型列的最大长度为2000字符,所以不能把长度大于2000的char类型值插入到数据库中,但可插入到类型为varchar2或long的表列中。 2.varchar2 变长字符类型,数据内部表示取决于当前数据库的字符集 varchar2(max_length) 1<=max_length=<32767 如存储多字节字符,则最大长度小于n个字符。varchar2类型列的最大长度为4000字符,所以 不能把长度大于 4000的varchar类型值插入到数据库中,可插入到long的表列中。 3.long 存储变长字符数据。最大长度2G 4.nchar 存储固定长度的nls字符数据 nchar(max_length) 1<=max_length<=32767 5.nvarchar2 存储可变长度的nls字符数据。 nvarchar2(max_length) 1<=max_length<32767 3.raw类 包括: 1.raw 存放固定长度的二进制数据 raw(max_length) 1<=max_length<32767 2.long raw 4.rowid类 rowid伪列,用于存储行标识符(rowid),行标识符是固定长度的16进制字符串,用来表示 一条记录的存储地址。行标识符不能由PLSQL生成,可以从一个表的rowid伪列中得到 。 5.date类 日期缺省值为当月的第一天,时间的缺省值为午夜12:00。 PLSQL中的date变量与数据库中的date类型列相同。包括世纪、年、月、日、小时、分钟、秒。一个date变量占七个字节,分别表示世纪、年、月、日、小时、分钟、秒。 缺省的日期格式由oracle初始化参数NLS_DATA_FOMRAT决定。使用to_date内嵌函数可以将characte类型的值转换成date类型。使用to_char将date转换成character。 6.boolean类 用于存储逻辑值。true,false,null null用来表示一个错误的,不合适 的或不确定的值。 boolean类型的变量只能用在逻辑操作中,且只能将true,false,null赋给该类型的变量。不能将boolean类型的值插入到数据库中,也不能将数据库中的数据赋给boolean类型的变量。 7.trusted类 mlslabel类型的变量被用来在trusted oracle中存储变长 的二进制标签。
数据类型之间的转换
1.强制类型转换 通过使用函数来完成不同类型之间的转换。这些函数也可以是标准SQL中的数据类型转换函数 to_char:numeric|date ->varchar2 to_date:character -> date to_number: character -> number rawtohex: raw ->16进制 hextoraw: 将用character类型描述的16进制转换成二进制数 chartorowid:用character类型描述的rowid转换成二进制数 rowidtochar:将二进制形式的rowid转换成18个字符的行标识符 如: declare v_birthdate date; v_show varchar2(20); begin select birthdate into v_birthdate form auths where name='王达琳'; v_show := to_char(v_birthdate); DBMS_OUTPUT.PUT_LINE('王达琳的出生日期为'||v_show); end; 2.自动类型转换 declare v_salary varchar2(15); begin select salary into v_salary from auths where author_code='A00003'; end; 数据库中salary列为number(8,2),但是v_salary类型为varchar2(15)。PLSQL能将numeric类数据自动转换成字符串并赋给character类的变量。
复合类型
具有内部成员的类型。该成员可以被单独操作。通常该类型的变量由一个或多个标量类型组成
1.记录:与预定义的标量类型不同,在使用复合类型之前用户 必须先定义该复合类型。
type record_type is record( field1 type1 [not null] [:=expr1], field2 type2 [not null] [:=expr2], ... fieldn typen [not null] [:=exprn] ); record_type表示记录类型的名字。 field表示记录里域的名字。 域的声明与记录外的变量声明类似,可以有not null约束和初始值。如果没有被赋值,则系统自动赋值为null。在赋初值时":="可以用DEFAULT代替。 type表示记录里域的类型。 expr表示为域赋的初始值。
例如:
type record_type is record( field1 type1 [not null] [:=expr1], field2 type2 [not null] [:=expr2], ... fieldn typen [not null] [:=exprn] ); record_type表示记录类型的名字。 field表示记录里域的名字。 域的声明与记录外的变量声明类似,可以有not null约束和初始值。如果没有被赋值,则系统自动赋值为null。在赋初值时":="可以用DEFAULT代替。 type表示记录里域的类型。 expr表示为域赋的初始值。
也可以用select语句来为记录赋值,记录中域的类型一定要和select列表中域的类型一致。
declare --定义一个记录,他的域和auths表中的一些域类型相同。 type t_AuthRec is record( AuthorCode auths.author_code%type, Name auths.name%type, Birthdate auths.birthdate%type, EntryDateTime auths.entry_date_time%type ); --声明一个记录类型来接收数据 v_Author t_AuthRec; begin select author_code,name,birthdate,entry_date_time into v_Author from auths where author_code='A00009'; end;
在PLSQL中声明一个与数据库表中各列类型相同的记录,可以用%rowtype操作符。类似于%type,%rowtype返回一个记录类型。
declare v_Article article%rowtype;
使用%rowtype声明的记录不包括数据库表中的not null约束,但包括varchar2列和char列的长度,number列的精度和标度。当表定义 发生改变时,由%rowtype声明 的记录也发生相应的改变。
2.表
定义表:
Type tabletype_name is table of type index by binary_integer Tabletype_name:表类型名 type:预定义的标量类型或通过%type引用的标量类型。表的索引是binary_integer类型。当定义了表类型后,就可以声明该类型的变量
例如:
declare --定义表类型t_NameTable,其元素类型是auths数据库表中的name列的类型。 type t_NameTalbe is talbe of auths.name%type index by binary_integer; --定义表类型t_address,其元素类型是auths表中的address列的类型。 type t_AddressTable is talbe of auths.address%type index by binary_integer; --声明两个表类型变量 v_name t_NameTable; v_Address t_AddressTable; begin --引用PLSQL表中的元素 --tablename(index) --index是表的索引,用binary_integer类型的变量或是能转换成binary_integer类型的表达式表示。 v_Name(2) := 'Wang'; v_Address(-3) :='street 1'; end;
例如:
declare type t_AuthorRecord is table of auths%rowtype index by binary_integer; --每一个元素 都是一条记录 v_auths t_authorRecord; begin --检索作家代码是A00009的作家,并存放到v_Auths(00009)中。 select * into v_auths(00009) from auths where authors_code='A00009'; --v_Auths表中的每个元素都是记录,可以通过如下语法引用记录 --table(index).field v_Auths(00009).name := 'Join'; DBMS_OUTPUT.PUT_LINE(v_Auths(00009).name); end;
PLSQL表中元素无特定顺序,因为表中元素 不像数组一样被连续地存储在一个空间内。
PLSQL表中的KEY不必是连续的,任意binary_integer类型的值或是表达式都可用作表的索引(KEY列)。
当向一个PLSQL表中插入一个元素时,就为该表分配 了用以存放该元素存储空间,PLSQL表的大小是没有限制的。