多个句点的oracle数据类型

时间:2014-06-26 07:12:55

标签: plsql

我正在查看是否有任何NUMBER类型的数据类型可用于存储数字层次结构,如
1.0
1.0.1
1.0.2
2.0
Oracle表中的2.0.1等 varchar2是唯一的选择吗?

1 个答案:

答案 0 :(得分:1)

这个问题有点陈旧,但这是我的看法:

由于您希望将多位数据的存储(版本号的组成部分)与行为结合起来(知道如何sort),然后用户定义的类型可能是你需要的:

CREATE OR REPLACE TYPE version_num AS OBJECT (
  major_version INTEGER,
  minor_version INTEGER,
  fix_version   INTEGER,
  ORDER MEMBER FUNCTION compare (other version_num) RETURN INTEGER
);
/

CREATE OR REPLACE TYPE BODY version_num AS 
  ORDER MEMBER FUNCTION compare (other version_num) RETURN INTEGER IS
  BEGIN
    IF (self.major_version > other.major_version) THEN
      RETURN 1;
    ELSIF (self.major_version < other.major_version) THEN
      RETURN -1;
    ELSE
      IF (self.minor_version > other.minor_version) THEN
        RETURN 1;
      ELSIF (self.minor_version < other.minor_version) THEN
        RETURN -1;
      ELSE
        IF (self.fix_version > other.fix_version) THEN
          RETURN 1;
        ELSIF (self.fix_version < other.fix_version) THEN
          RETURN -1;
        ELSE
          RETURN 0;
        END IF;
      END IF;
    END IF;
  END compare;
END;
/

首先,这会创建您的类型规范,包含(在此示例中)版本号的三个组件。需要注意的重要事项是ORDER MEMBER FUNCTION,它为Oracle提供了一种方法,用于对version_num个对象进行排序。

第二部分告诉Oracle 如何执行排序。这只是比较从最高订单开始的每个组件,如果-1较低则返回self+1如果self更高则返回0,或self如果{ {1}}等于other

有关Oracle用户定义函数here的文档。


出于演示目的,这是一个简单的用例和我们version_num对象的测试:

CREATE TABLE version_control (
  sys_name VARCHAR2(30),
  version  version_num
);

INSERT INTO version_control (sys_name, version)
VALUES ('System One', version_num (9,8,0));
INSERT INTO version_control (sys_name, version)
VALUES ('System Two', version_num (9,9,0));
INSERT INTO version_control (sys_name, version)
VALUES ('System Three', version_num (9,9,5));
INSERT INTO version_control (sys_name, version)
VALUES ('System Four', version_num (9,10,0));
INSERT INTO version_control (sys_name, version)
VALUES ('System Five', version_num (9,11,0));
INSERT INTO version_control (sys_name, version)
VALUES ('System Six', version_num (10,0,0));
COMMIT;

SELECT * FROM version_control v ORDER BY v.version;

由于我们已经创建了一个用户定义的类型,我们可以将它用作表定义的数据类型,就像其他任何类型一样。

通过在display_name对象上添加version_num属性,可以使此解决方案更加用户友好,可以通过触发器从其他属性生成。当你没有所有三个版本组件时,你也可以实现空值处理。