日期:2014-05-16  浏览次数:20478 次

oracle自定义字段类型
目标:
  • 定义一个类型
  • 编写类型的方法
  • 使用自定义的类型为字段创建表
  • 添加数据的方法
  • 查询数据的方法
  • 其它


定义一个类型
CREATE OR REPLACE TYPE PropertyValue AS OBJECT (
  number_value  number,
  string_value varchar2(2000),
  date_value date,
  
  MEMBER FUNCTION getNumberValue RETURN number,
  MEMBER FUNCTION getStringValue RETURN varchar2,
  MEMBER FUNCTION getDateValue RETURN date
);


编写类型的方法
CREATE OR REPLACE TYPE BODY PropertyValue AS
  MEMBER FUNCTION getNumberValue RETURN number AS
  BEGIN
    RETURN number_value;
  END getNumberValue;
  
  MEMBER FUNCTION getStringValue RETURN varchar2 AS
  BEGIN
    RETURN string_value;
  END getStringValue;
  
  MEMBER FUNCTION getDateValue RETURN date AS
  BEGIN
    RETURN date_value;
  END getDateValue;
END;


使用自定义类型为字段创建表
create table IGRP_SYS_PROPERTIES (
nid				number primary key,
propertyKey		varchar2(2000),
propertyValue	PropertyValue,
propertyType		varchar2(2000),
description		varchar2(2000),
createUserId		number,
modifyUserId		number,
createDate		date,
modifyDate		date);

CREATE SEQUENCE SQ_IGRP_PROPERTYID
  START WITH 1
  INCREMENT BY 1
  MAXVALUE 1E27
  MINVALUE 1
  NOCYCLE
  CACHE 20
  NOORDER;

-- Add comments to the columns
comment on column IGRP_SYS_PROPERTIES.nid
  is 'PK唯一值';
comment on column IGRP_SYS_PROPERTIES.propertyKey
  is '属性键';
comment on column IGRP_SYS_PROPERTIES.propertyValue
  is '属性值';
comment on column IGRP_SYS_PROPERTIES.propertyType
  is '属性类型';
comment on column IGRP_SYS_PROPERTIES.description
  is '描述';
comment on column IGRP_SYS_PROPERTIES.createUserId
  is '创建用户ID';  
comment on column IGRP_SYS_PROPERTIES.modifyUserId
  is '修改用户ID';    
comment on column IGRP_SYS_PROPERTIES.createDate
  is '创建日期';      
comment on column IGRP_SYS_PROPERTIES.modifyDate
  is '修改日期';        


添加数据
insert into IGRP_SYS_PROPERTIES VALUES
(SQ_IGRP_PROPERTYID.nextval, 
'xxx',
PropertyValue(10, null,null),
'number',
'xxx',
101,
101,
sysdate,
sysdate);
commit;


查询数据
select isp.propertyValue.getNumberValue() as myValues
  from 
    IGRP_SYS_PROPERTIES isp 
  where 
    isp.propertyKey = 'xxx' 
    and isp.propertyType = 'number'; 


其它
1. 数据类型使用在数据表后,其BODY是不能改变的。 因此,要先DROP和类型有关的表,才能修改其BODY。
2. EXPORT和IMPORT会有问题。
3. SQL*Plus 的COPY命令不能使用在自定义的数据类型中。