Welcome 微信登录

首页 / 数据库 / MySQL / Oracle定义数据类型Type

Oracle提供自定义类型功能,用户可以根据自己的情况定义记录数据类型(Record)和记录表类型(Table),其中记录数据类型Record存储是一条记录,记录表类型Table用来存储多条记录。如果记录数据类型Record是一维数组的话,记录表类型Table就是二维数组。自定义类型有两种写法:TYPE...IS和CREATE TYPE,两种定义方式的区别是:前者一般在存储过程和函数中定义,使用范围也限于所在过程或函数,而后者方式声明对象类型,对象类型则是作为一个方案对象(像表、索引、视图、触发器一样,是一个方案对象),可以过程或函数中使用,还可以在定义表时,作为字段的类型。下面分别介绍:TYPE IS定义类型1. 定义数据记录类型语法: TYPE type_name IS RECORD (字段1 类型1,字段2 类型2,...字段n 类型n);说明:1) type_name:类型名称。举例:declare
  TYPE type_student IS RECORD(
          name VARCHAR2(100),
          age  NUMBER(3),
          sex  VARCHAR2(1)
  );
 
  r_student type_student;
  v_name VARCHAR2(100);
  i_age  NUMBER(3);
  v_sex  VARCHAR(1);
  i integer;
begin
  select name, age, sex into r_student from t_student where gid = 1;
  v_name := r_student.name;
  i_age := r_student.age;
  v_sex := r_student.sex;
  dbms_output.put_line(v_name);
  dbms_output.put_line(v_sex);
  dbms_output.put_line(i_age);
end;输出结果:zhansan1122.定义表记录语法: TYPE type_name IS TABLE OF element_type INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARRAY2];说明:1) type_name:类型名称。2) element_type:可以是基本类型(如varchar2, Ingeger, number等)、记录数据类型(即TYPEtype_nameIS RECORD定义的类型)、%ROWTYPE。3) INDEX BY:该语句的作用是使Number类型的下标自增长,自动初始化,并分配空间,有了该语句,向表记录插入元素时,不需要显示初始化,也不需要通过extend分配空间。Binary_Integer 与 Pls_Integer 都是整型类型.Binary_Integer类型变量值计算是由Oracle来执行,不会出现溢出,但是执行速度较慢,因为它是由Oracle模拟执行。而Pls_Integer的执行是由硬件即直接由CPU来运算,因而会出现溢出,但其执行速度较前者快许多。如果没有使用这个语句,又没有使用extend就会报错:ORA-06531:Reference to uninitializedcollection,具体请参考《ORA-06531:Reference to uninitialized collection 问题解决》 http://www.linuxidc.com/Linux/2014-01/94784.htm举例:declare
  TYPE type_student IS RECORD(
          name VARCHAR2(100),
          age  NUMBER(3),
          sex  VARCHAR2(1)
  );
 
  TYPE t_student_var IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
 
  TYPE t_student_rec IS TABLE OF type_student INDEX BY BINARY_INTEGER;
 
  TYPE t_student_rowtype IS TABLE OF t_student%ROWTYPE INDEX BY BINARY_INTEGER;
 
  v_tbl_name t_student_var;
  v_tbl_record t_student_rec;
  v_tbl_rowtype t_student_rowtype;
begin
  dbms_output.put_line("------------基本类型VARCHAR2表记录------------");
  select name into v_tbl_name(1) from t_student where gid = 1;
  select name into v_tbl_name(2) from t_student where gid = 2;
  select name into v_tbl_name(3) from t_student where gid = 3;
  dbms_output.put_line(v_tbl_name(1));
  dbms_output.put_line(v_tbl_name(2));
  dbms_output.put_line(v_tbl_name(3));
 
  dbms_output.put_line("------------自定义RECORD类型表记录------------");
  select name, age, sex into v_tbl_record(1) from t_student where gid = 1;
  select name, age, sex into v_tbl_record(2) from t_student where gid = 2;
  select name, age, sex into v_tbl_record(3) from t_student where gid = 3;
  dbms_output.put_line("name:"||v_tbl_record(1).name||", "||"age:"||v_tbl_record(1).age||", "||"sex:"||v_tbl_record(1).sex);
  dbms_output.put_line("name:"||v_tbl_record(2).name||", "||"age:"||v_tbl_record(2).age||", "||"sex:"||v_tbl_record(2).sex);
  dbms_output.put_line("name:"||v_tbl_record(3).name||", "||"age:"||v_tbl_record(3).age||", "||"sex:"||v_tbl_record(3).sex);
 
  dbms_output.put_line("------------表记录类型表记录------------");
  select * into v_tbl_rowtype(1) from t_student where gid = 1;
  select * into v_tbl_rowtype(2) from t_student where gid = 2;
  select * into v_tbl_rowtype(3) from t_student where gid = 3;
  dbms_output.put_line("name:"||v_tbl_rowtype(1).name||", "||"age:"||v_tbl_rowtype(1).age||", "||"sex:"||v_tbl_rowtype(1).sex||", "||"grade:"||v_tbl_rowtype(1).grade);
  dbms_output.put_line("name:"||v_tbl_rowtype(2).name||", "||"age:"||v_tbl_rowtype(2).age||", "||"sex:"||v_tbl_rowtype(2).sex||", "||"grade:"||v_tbl_rowtype(2).grade);
  dbms_output.put_line("name:"||v_tbl_rowtype(3).name||", "||"age:"||v_tbl_rowtype(3).age||", "||"sex:"||v_tbl_rowtype(3).sex||", "||"grade:"||v_tbl_rowtype(3).grade);
 
end;输出结果:------------基本类型VARCHAR2表记录------------
zhansan
lisi
wanwu
------------自定义RECORD类型表记录------------
name:zhansan, age:12, sex:1
name:lisi, age:23, sex:1
name:wanwu, age:32, sex:1
------------表记录类型表记录------------------
name:zhansan, age:12, sex:1, grade:643
name:lisi, age:23, sex:1, grade:445
name:wanwu, age:32, sex:1, grade:545
  • 1
  • 2
  • 下一页
Oracle面向对象编程OOPPLSQL无法连Oracle 11g接数据库--问题解决相关资讯      Oracle数据类型  Oracle Type 
  • Oracle的特殊数据类型  (今 08:39)
  • 关于Oracle中的sql数据类型  (11/24/2014 13:59:22)
  • Oracle DB 隐式和显式数据类型转换  (10/17/2013 10:36:14)
  • Oracle数据库中NUMBER(x,y)数据类  (05/21/2015 20:29:31)
  • Oracle数据类型学习笔记  (07/23/2014 07:17:54)
  • Oracle常用数据类型和完整性约束  (08/29/2013 06:04:45)
本文评论 查看全部评论 (0)
表情: 姓名: 字数