Rumah >pangkalan data >tutorial mysql >oracle数据类型分析
oracle数据库的数据类型主要是以下三种: 标量 (sclare)、复合(composite)、引用(reference)。 一、标量(char ,number,varchar2,long,clob,blob,nclob,bfile,date) char(num) 定长,最长为2000个字符,运用char的查询效率特高,但是用char的话,不会自动识
oracle数据库的数据类型主要是以下三种:标量 (sclare)、复合(composite)、引用(reference)。
char(num) 定长,最长为2000个字符,运用char的查询效率特高,但是用char的话,不会自动识别字符长度,定义了多少个字符,它就会占用几个字符,即使存储的字符只有2个,而定义的char为4个字符的话,它会用空格把后两个字符填充。
number 只定义number的话,就表示整形,而如果定义number(7,2)的话,就表示7个有效数字,小数位为两位,例如12345.67这个数字就符合number(7,2)的定义。number的范围是-(10的38次方)到10的38次方。
varchar2(num) 算是varchar的升级版,Oracle对varchar2进行优化过,varchar2与varchar的区别是varchar2把空串等同于null处理,最大长度是4000个字符,varchar2可以节省字符,跟char有个鲜明的区别就是,varchar2会识别存储的字符长度,不会占用多余的空间。但是查询效率没有char高。至于一个varchar2字符要用几个字节存储,要看数据库使用的字符集,比如GBK,汉字就会占两个字节,英文1个,如果是UTF-8,汉字一般占3个字节,英文还是1个。
long 可以用来保存高达2G的数据,作为变量,可以表示一个最大长度为32760字节的可变字符串。
clob 存储单字节字符数据,常用于大文本的存储,可以存放4G的容量。
blob 用于存储无结构的二进制数据,可以存放图片,视频等资源,最大为4G。
nclob 用于存储数据库中的固定宽度单字节或多字节字符的大型数据块,不支持宽度不等的字符集。可存储的最大大小为4G字节。
bfile 当大型二进制对象的大小大于4G字节时,bfile数据类型用于将其存储在数据库外的操作系统文件中;当其大小不足4G字节时,则将其存储在数据库内部的操作系统文件中,bfile列存储文件定位程序,此定位程序指向服务器上的大型二进制文件。
date 时间数据类型,包含年月日时分秒。
标量类型是经过预定义的,利用这些类型可以衍生出一些复合类型。主要有记录、 表。
记录,可以看作是一组标量的组合结构,它的声明方式如下:
declare
type record_type_name is record(
参数1 参数类型
参数2 参数类型
......);
其中,record_type_name是记录类型的名字。
例子:
declare
--声明一个record类型的记录myrecord
type myrecord is record(
--定义参数
id varchar2(10);
name varchar2(10));
--声明一个myrecord类型的变量real_record
real_record myrecord;
begin
--将所取数据存放在real_record中
select eid,ename into real_record from emp where eid='001';
--通过real_record.变量的方式输出
dbms_output.put_line(real_record.id||','||real_record.name);
end;
表,不是物理存储数据的表,在这里是一种变量类型,也称为PL/SQL表,它 类似于C语言中的数组,在处理方式上也相似。它的声明方式如下:
declare
type table_type_name is table of scalar_type index by binary_integer;
其中,table_type_name是类型的名字,scalar_type 是一种标量类型的类型声明,index by binary_integer指明下标为整数。引用时也必须定义相关的变量。表和数组不同,表有两列,key和value,key就是定义时声明的binary_integer,value就是定义时声明的scalar_type。
例子:
declare
--声明一个table类型的表sp_table_type
type sp_table_type is table of student.id%type index by binary_integer;
--声明一个sp_table_type类型的变量sp_table
sp_table sp_table_type;
begin
--将查询到的数据保存在sp_table(0)中
select id into sp_table(0) from student where id=4;
dbms_output.put_line(sp_table(0));
end;
在PL/SQL8.0之前,只有一种类型--REF CURSOR,也就是游标。它的定义较为简单,
declare
type cursor_type_name is ref cursor;
在PL/SQL8.0之后,引入了REF类型,它指向一个对象。
例子:
declare
--声明一个cursor类型的游标sp_emp_cursor
type sp_emp_cursor is ref cursor;
--声明一个sp_emp_cursor类型的变量test_cursor
test_cursor sp_emp_cursor;
--声明两个%type类型的变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--打开游标
open test_cursor for select ename,sal from emp where depart=&no;
loop
--提取游标
fetch test_cursor into v_ename,v_sal;
exit when test_cursor%notfound;
dbms_output.put_line(v_ename||' '||v_sal);
end loop;
--关闭游标
close test_cursor;
end;