Plsql 用于多个期间的oracle数据类型(数字)

Plsql 用于多个期间的oracle数据类型(数字),plsql,Plsql,我在查看是否有任何数字类型数据类型可用于存储数字层次结构,如 1.0 1.0.1 1.0.2 2.0 Oracle表中的2.0.1等。 varchar2是唯一的选择吗?这个问题有点老了,但我的看法是: 由于您希望将多个数据位的存储(版本号的组成部分)与行为(知道如何排序)结合起来,因此用户定义的类型可能就是您所需要的: CREATE OR REPLACE TYPE version_num AS OBJECT ( major_version INTEGER, minor_version I

我在查看是否有任何数字类型数据类型可用于存储数字层次结构,如
1.0
1.0.1
1.0.2
2.0
Oracle表中的2.0.1等。

varchar2是唯一的选择吗?

这个问题有点老了,但我的看法是:

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

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;
/
因为我们已经创建了一个用户定义的类型,所以我们可以像其他任何东西一样将其用作表定义的数据类型


通过在
version\u num
对象上添加一个
display\u name
属性,可以使此解决方案更加用户友好,该属性可以通过触发器从其他属性生成。当您没有全部三个版本组件时,您还可以为实现空处理。

Varchar2的问题是您无法正确排序。您是否对这些数字有任何限制(例如最多5个级别,最多3位)?然后您可以将其编码为单个整数(如002000001000000)或多个列。此外,人们有时喜欢在版本号中包含“-RC1”、“beta5”之类的内容。数字的数量没有限制,但它总是数字的,不会有像-RC1或beta5这样的结尾。我试过使用varchar2,它排序正确,但我认为我们不能总是相信它。Re:排序:尝试排序
9.8、9.9、9.9.5、9.10、9.11、10.0
是的,我理解这个问题。它一个字符接一个字符并进行排序。基于期间的拆分是唯一剩下的选项吗?
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;