PL/SQL笔记(二)

数据类型

  1. 标量类型
  2. 复合类型
  3. 引用类型
  4. LOB类型

标量类型

 

	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表的大小是没有限制的。

 

你可能感兴趣的:(oracle,sql)