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;