达梦数据库还能够本身定义类型,用户使用 CREATE TYPE 语句能够定义对象类型、数组类型、嵌套表类型等,若是在对象类型中声明了过程或方法,可使用 CREATE TYPE BODY 定义这些过程和方法。数据库
一、对象类型
--建立对象类型
create type type_dxlx_test as object(
rpart real,
ipart real,
function plus(x type_dxlx_test) return type_dxlx_test,
function les(x type_dxlx_test) return type_dxlx_test
);
/数组
--建立对象类型体
create type body type_dxlx_test as
function plus(x type_dxlx_test) return type_dxlx_test is
begin
return type_dxlx_test (rpart+x.rpart, ipart+x.ipart);
end;
function les(x type_dxlx_test) return type_dxlx_test is
begin
return type_dxlx_test (rpart-x.rpart, ipart-x.ipart);
end;
end;
/ide
--创建一张测试表,表中的第二列的列类型为type_dxlx_test对象类型,而后插入表测试
create table tab_dxlx_test (c1 int, c2 type_dxlx_test);
--向表中插入数据
insert into tab_dxlx_test values(1, type_dxlx_test (2,3));
insert into tab_dxlx_test values(2, type_dxlx_test (4,2).plus(type_dxlx_test (2,3)));
--查询表数据
select c2 from tab_dxlx_test;函数
二、数据类型
--建立数组类型
create or replace type type_szlx_test as object(
id varchar(20),
incount int,
providerid varchar(20)
);
/测试
create or replace type arr_type_szlx_test as varray(100) of type_szlx_test;
/对象
三、嵌套表类型
--建立对象
create or replace type type_qtblx_test
as object
(
aaz257 number(18),
bic230 varchar2(5),
constructor function type_qtblx_test return self as result
)
not final;
/blog
create or replace type body type_qtblx_test
is
constructor function type_qtblx_test return self as result is
begin
return;
end;
end;
/索引
--建立嵌套表
create or replace type qtb_type_qtblx_test as table of type_qtblx_test;
/ip
四、类型使用规则
1.做为表中列类型或其余类成员变量属性的类型不能被修改,删除时须要指定 CASCADE级联删除,类型中定义的数据类型,其名称只在类型的声明及实现中有效。若是类型内的函数的参数或返回值是类型内的数据类型,或是进行类型内成员变量的复制,须要在 DMSQL 程序中定义一个结构与之相同的类型。根据类型使用方式的不一样,对象可分为变量对象及列对象。变量对象指的是在 DMSQL 程 序语句块中声明的类型的变量;列对象指的是在表中类型的列。变量对象能够修改其属性的值而列对象不能。
2.变量对象的实例化,类型的实例化经过 NEW 表达式调用构造函数完成。
3.变量对象的引用,经过‘=’进行的类型变量之间的赋值所进行的是对象的引用,并无复制一个新的对象。
4.变量对象属性访问,能够经过以下方式进行属性的访问。<对象名>.<属性名>
5.变量对象成员方法调用,成员方法的调用经过如下方式调用: <对象名>.<成员方法名>(<参数>{,<参数>}),若是函数内修改了对象内属性的值,则该修改生效。
6.列对象的插入,列对象的建立是经过 INSERT 语句向表中插入数据完成,插入语句中的值是变量对象,插入后存储在表中的数据即为列对象。
7.列对象的复制,存储在表中的对象不容许对对象中成员变量的修改,经过 into 查询或’=’进行的列到
变量的赋值所进行的是对象的赋值,生成了一个与列对象数据同样的副本,在该副本上进行
的修改不会影响表中列对象的值。
8.列对象的属性访问,经过以下方式进行属性的访问: <列名>.<属性名>
9.列对象的方法调用:<列名>.<成员方法名>(<参数>{,<参数>}),列对象方法调用过程当中对类型内属性的修改,都是在列对象的副本上进行的,不会影响列对象的值。qt
五、编译类型和删除类型
1)编译类型:从新对类型进行编译,若是从新编译失败,则将类型置为禁止状态。
alter type type_dxlx_test compile;
2)删除类型:类型的删除分为两种方式:一是类型头的删除,删除类型头则会顺带将类型体一块儿删除;另一种是类型体的删除,这种方式只能删除类型体,类型头依然存在。
drop type body type_dxlx_test;
drop type type_dxlx_test cascade;