对于自定义类型,通常也会分为两类,一类是子类型,一类是普通类型。
子类型
这种类型最简单,类似类型的一个别名,主要是为了对常用的一些类型简单化,它基于原始的某个类型,如:number(16,2)。
子类型实现定义的全局化:subtype gn_num is number(16,2);
普通类型
普通类型的定义很多,这里主要对Record & Table两种类型做一些入门讲解。
Record类型
首先,需要创建一个简单的Record类型:
TYPE gr_test_rec IS RECORD(test_id NUMBER,test_name VARCHAR2(10));--全局类型
它的使用也很简单,只需在具体方法中使用这个全局类型去定义字段就好了,如下:
PROCEDURE test_pro(x_out_str OUT VARCHAR2) ISlr_test_rec gr_test_rec;BEGIN--初始化类型lr_test_rec.test_id := 1;lr_test_rec.test_name := 'Test';--使用类型值BEGINSELECT lr_test_rec.test_id || '-' || lr_test_rec.test_nameINTO x_out_strFROM dualWHERE 1 = 1;EXCEPTIONWHEN OTHERS THENx_out_str := NULL;END;END;
清空类型数据
lr_test_rec := null;
Table类型
这里创建的Table类型与上面说的内容相关联,就是利用Record类型来创建。
TYPE gt_test_rec_tbl IS TABLE OF gr_test_rec INDEX BY BINARY_INTEGER;--全局类型
用法:
PROCEDURE test_pro(x_out_str OUT VARCHAR2) ISlr_test_rec gr_test_rec;lt_test_rec_tbl gt_test_rec_tbl;BEGIN--初始化类型lr_test_rec.test_id := 1;lr_test_rec.test_name := 'Test';--赋值lt_test_rec_tbl(1) := lr_test_rec;--Table类型使用FOR i IN 1 .. lt_test_rec_tbl.count LOOPx_out_str := lt_test_rec_tbl(i).test_id || '-' || lt_test_rec_tbl(i).test_name;EXIT;END LOOP;--清空数据lt_test_rec_tbl.delete;END;
补充
通过对象创建Table
首先创建一个对象类型
CREATE OR REPLACE TYPE type_obj AS OBJECT(id NUMBER, obj_name VARCHAR2(8));
然后创建一张表
create table obj_table of type_obj;
用法:
--插入数据
INSERT INTO obj_table SELECT type_obj(1, 'test') FROM dual;--查询数据
SELECT * FROM obj_table;--更新数据
UPDATE obj_table SET obj_name = 'test1' WHERE id = 1;--删除数据
DELETE FROM obj_table;
注意:这里需要注意的是插入的数据需要用type_obj进行转换,其他操作与普通表类似。