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;
          输出结果:

 zhansan
 1
 12


       2.定义表记录

     语法:

     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 uninitialized 

            collection,具体请参考《ORA-06531:Reference to uninitialized collection 问题解决

      4). first属性、last属性和count属性分别获得表记录(或称为数组)的首元素、末元素和总数。如有一个表

          记录变量v_student_tbl,那么v_student_tbl.first获得是表记录的首元素。在进行FOR或FORALL循环

          时比较常用。

     举例:

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);
  
  v_tbl_rowtype(4).gid := 11;
  v_tbl_rowtype(4).name := 'HELONG';
  v_tbl_rowtype(4).sex := 1;
  v_tbl_rowtype(4).grade := 657;
  insert into t_student values v_tbl_rowtype(4);--表记录类型插入
  commit;
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


  • CREATE TYPE定义类型

          1. 定义对象类型

           语法:

      CREATE OR REPLACE TYPE type_name AS OBJECT(
              字段1     类型1,
              字段2     类型2,
              ...
              字段n     类型n
      );

      说明:

      1)type_name:类型名称。

               举例:

              在SQL Window窗口中执行如下脚本创建NAMETYPE对象类型。

CREATE OR REPLACE TYPE NAMETYPE AS OBJECT(
    firstname      varchar2(100),
    lastname       varchar2(100)
);
               执行脚本之后,在PL/SQL Developer的Objects窗口查看TYPE方案对象,将看到有一个名称为type_student的TYPE方案对象,如下图所示:


        对象类型的内容请参考《Oracle面向对象编程OOP》             

          2.定义表记录

           语法:

      CREATE OR REPLACE TYPE type_name AS TABLE OF element_type;

      说明:

      1)type_name:类型名称。

      2) element_type:可以是基本类型(如varchar2, Ingeger, number等)、记录数据类型(即CREATE OR REPLACE TYPE type_name AS OBJECT定义的类型)、%ROWTYPE。

      请参考《Oracle面向对象编程OOP》         

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值