如何仅使用 SQL 在 Oracle 中使用枚举?(无 PSQL)
在 MySQL 中,您可以执行以下操作:
CREATE TABLE sizes (
name ENUM('small', 'medium', 'large')
);
在 Oracle 中执行此操作的类似方法是什么?
阅读一些关于MySQL enum的信息,我猜最接近的等价物将是一个简单的检查约束
CREATE TABLE sizes (
name VARCHAR2(10) CHECK( name IN ('small','medium','large') )
);
但这不允许您通过索引引用该值。更复杂的外键关系也是可能的
CREATE TABLE valid_names (
name_id NUMBER PRIMARY KEY,
name_str VARCHAR2(10)
);
INSERT INTO valid_sizes VALUES( 1, 'small' );
INSERT INTO valid_sizes VALUES( 2, 'medium' );
INSERT INTO valid_sizes VALUES( 3, 'large' );
CREATE TABLE sizes (
name_id NUMBER REFERENCES valid_names( name_id )
);
CREATE VIEW vw_sizes
AS
SELECT a.name_id name, <<other columns from the sizes table>>
FROM valid_sizes a,
sizes b
WHERE a.name_id = b.name_id
只要您通过视图进行操作,您似乎就可以很好地复制该功能。
现在,如果您承认 PL/SQL 解决方案,您可以创建自定义对象类型,其中可能包含限制它们可以保存的值集的逻辑,并具有获取 ID 和获取值的方法等。
为什么不对列使用约束?它会做同样的事情:
ALTER TABLE x ADD CONSTRAINT size_constraint check (x_size in ('small', 'medium', 'large'))
在此链接中,您可以找到受 C 语言枚举启发的 Oracle 替代解决方案/解决方法:http ://www.petefinnigan.com/weblog/archives/00001246.htm
简而言之,Pete 建议定义一些整数常量并使用 SUBTYPE 来约束它们:
RED constant number(1):=1;
GREEN constant number(1):=2;
BLUE constant number(1):=3;
YELLOW constant number(1):=4;
subtype COLORS is binary_integer range 1..4;
之后,您可以使用 COLORS 类型声明变量、传递参数和从函数返回值等。