SQLのみを使用してOracleで列挙型をどのように使用しますか? (PSQL なし)
MySQL では次のことができます。
CREATE TABLE sizes (
name ENUM('small', 'medium', 'large')
);
Oracleでこれを行う同様の方法は何ですか?
MySQL列挙型について少し読んで、最も近い同等のものは単純なチェック制約になると思います
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を取得したり値を取得したりするメソッドを持つロジックを含むカスタムオブジェクトタイプを作成できます。
このリンクでは、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 型を使用できます。