web-dev-qa-db-ja.com

Oracleで列挙型を使用する方法は?

SQLのみを使用してOracleで列挙型を使用するにはどうすればよいですか? (PSQLなし)

MySQLでは次のことができます。

CREATE TABLE sizes (
   name ENUM('small', 'medium', 'large')
);

Oracleでこれを行うための同様の方法は何ですか?

35
Robert Gould

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を取得したり値を取得するためのメソッドを作成したりできます。

44
Justin Cave

このリンクでは、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型)。

1
giacomino

列に制約を使用しないのはなぜですか?同じことを行います:

ALTER TABLE x ADD CONSTRAINT size_constraint check(x_size in( 'small'、 'medium'、 'large'))

0
ezzadeen