达梦数据库还可以自己定义类型, 用户使用 CREATE TYPE 语句可以定义对象类型, 数组类型, 嵌套表类型等, 如果在对象类型中声明了过程或方法, 可以使用 CREATE TYPE BODY 定义这些过程和方法.
1, 对象类型
-- 创建对象类型
- 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;
- /
-- 建立一张测试表, 表中的第二列的列类型为 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;
2, 数据类型
-- 创建数组类型
- 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;
- /
3, 嵌套表类型
-- 创建对象
- 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;
- /
- 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;
- /
4, 类型使用规则
1.作为表中列类型或其他类成员变量属性的类型不能被修改, 删除时需要指定 CASCADE 级联删除, 类型中定义的数据类型, 其名称只在类型的声明及实现中有效. 如果类型内的函数的参数或返回值是类型内的数据类型, 或是进行类型内成员变量的复制, 需要在 DMSQL 程序中定义一个结构与之相同的类型. 根据类型使用方式的不同, 对象可分为变量对象及列对象. 变量对象指的是在 DMSQL 程 序语句块中声明的类型的变量; 列对象指的是在表中类型的列. 变量对象可以修改其属性的值而列对象不能.
2.变量对象的实例化, 类型的实例化通过 NEW 表达式调用构造函数完成.
3.变量对象的引用, 通过'='进行的类型变量之间的赋值所进行的是对象的引用, 并没有复制一个新的对象.
4.变量对象属性访问, 可以通过如下方式进行属性的访问.< 对象名 >.< 属性名 >
5.变量对象成员方法调用, 成员方法的调用通过以下方式调用: < 对象名 >.< 成员方法名 >(< 参数 >{,< 参数 >}), 如果函数内修改了对象内属性的值, 则该修改生效.
6.列对象的插入, 列对象的创建是通过 INSERT 语句向表中插入数据完成, 插入语句中的值是变量对象, 插入后存储在表中的数据即为列对象.
7.列对象的复制, 存储在表中的对象不允许对对象中成员变量的修改, 通过 into 查询或'='进行的列到
变量的赋值所进行的是对象的赋值, 生成了一个与列对象数据一样的副本, 在该副本上进行
的修改不会影响表中列对象的值.
8.列对象的属性访问, 通过如下方式进行属性的访问: < 列名 >.< 属性名 >
9.列对象的方法调用:< 列名 >.< 成员方法名 >(< 参数 >{,< 参数 >}), 列对象方法调用过程中对类型内属性的修改, 都是在列对象的副本上进行的, 不会影响列对象的值.
创建的数组类型和嵌套类型, 可以直接在 DMSQL 程序语句块中使用, 不必在语句块中声明类型
用户自定义数据类型可以作为其他用户自定义数据类型的元素类型或成员变量类型;
只有对象类型可以直接作为表中列的数据类型; 其他类型只能作为对象类型中成员变量的类型或类型中嵌套使用的数据类型. 但含有索引表类型和游标类型的对象类型也不能作为表中列的数据类型.
5, 编译类型和删除类型
1) 编译类型: 重新对类型进行编译, 如果重新编译失败, 则将类型置为禁止状态.
alter type type_dxlx_test compile;
2) 删除类型: 类型的删除分为两种方式: 一是类型头的删除, 删除类型头则会顺带将类型体一起删除; 另外一种是类型体的删除, 这种方式只能删除类型体, 类型头依然存在.
- drop type body type_dxlx_test;
- drop type type_dxlx_test cascade;
来源: http://www.bubuko.com/infodetail-3519581.html