我正在查看是否有任何NUMBER类型的数据类型可用于存储数字层次结构,如
1.0
1.0.1
1.0.2
2.0
Oracle表中的2.0.1等
varchar2是唯一的选择吗?
答案 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
属性,可以使此解决方案更加用户友好,可以通过触发器从其他属性生成。当你没有所有三个版本组件时,你也可以实现空值处理。