10 データベースへのアプリケーション・データ使用状況の登録

この章では、データ・ユースケース・ドメインおよびスキーマ注釈と呼ばれる集中管理型のデータベース中心エンティティを使用して、アプリケーション・データの用途に関する情報を登録する方法について説明します。

Oracle Database 23aiでは、データの用途情報を処理するためにデータ・ユースケース・ドメインとスキーマ注釈を使用する、集中管理型のデータベース中心アプローチが導入されています。データ・ユースケース・ドメインとスキーマ注釈を一元的にデータベースに追加して、データの用途が登録されていると、様々なアプリケーションとツールからアクセスできるようになります。

関連項目:

  • データ・ユースケース・ドメインスキーマ注釈の詳細は、『Oracle Database概要』を参照してください。

  • データ・ユースケース・ドメインとスキーマ注釈に関する構文およびセマンティックの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

10.1 データ・ユースケース・ドメイン

この項では、アプリケーションでアプリケーションでデータ・ユースケース・ドメイン(以下、「ユースケース・ドメイン」)を使用する方法について説明します。

10.1.1 ユースケース・ドメインの概要

ユースケース・ドメインは、軽量な使用状況指定子で、オプションでデータベース側に適用されます。この指定子は、アプリケーションが対象データの使用状況を一元的に文書化するために使用できます。高レベルのディクショナリ・オブジェクトとして、ユースケース・ドメインには、表列に関連付けられた組込みの使用状況プロパティ(デフォルト値、チェック制約、照合、表示書式や順序書式、注釈など)が含まれています。一元化したドメイン情報により、アプリケーションはアプリケーションレベルのメタデータに依存することなく操作を標準化できます。たとえば、ユースケース・ドメインは、クレジット・カード番号のマスクや、電話番号と通貨値の書式設定に使用できます。

データベース・オブジェクトとして、ユースケース・ドメインはスキーマに属し、基礎となる列データ型を変更することなく共通の列定義を提供します。ユースケース・ドメインは、表列のいくつかの共通する特性を再利用可能なオブジェクトにカプセル化します。このオブジェクトは、そうした特性を繰り返すことなく別の表列で再利用できます。

たとえば、スキーマには請求Eメール、伝票Eメール、顧客担当者EメールなどのEメール・アドレスを保持する列がある多数の表が含まれていることがあります。電子メール・アドレスは、"@"記号を必要とする特別な形式を持ちます。電子メール・アドレス用のユースケース・ドメインは、regexp_like (email_dom, '^(\S+)\@(\S+)\.(\S+)$')などのチェック制約を使用して定義できます。このドメインを別の電子メールの列に関連付けることで、アプリケーションは関連付けられた列の電子メール・アドレスをドメイン名の前に"@"記号が付いた標準形式で表示できます。同様に、自動車のライセンス・プレートの表示形式を標準化することもできます。この形式には、番号とその他の情報を分離するハイフンが必要になることがあります。ユースケース・ドメインを使用すると、このライセンス情報は、ライセンス列のデータ型がvarchar2(6)の場合でも"ABC-123"の形式で表示できます。

ユースケース・ドメイン使用には、アプリケーション間で一貫して値を処理できることによるデータ品質の向上、列のプロパティと制約をアプリケーション全体で再利用できることによるコーディングの軽減、アプリケーションでこれらのユースケース・ドメインを照会し、操作対象のデータを理解できることによる操作の一貫性と明確さなどのメリットがあります。

関連項目:

ユースケース・ドメインの詳細は、『Oracle Database概要』を参照してください。

10.1.2 ユースケース・ドメインのタイプと使用する局面

ドメインのタイプには、単一列ドメイン、複数列ドメインおよびフレキシブル・ドメインの3種類があります。

単一列ユースケース・ドメイン

単一列ユースケース・ドメインは1つの列に対して作成され、アプリケーション全体で列の使用状況定義を一貫させる場合に使用します。たとえば、単一列ドメインは電子メール・アドレス用、郵便番号用、または車両番号用に作成できます。

複数列またはフレキシブルという接頭辞が付いていない場合、このドキュメントでは、「ユースケース・ドメイン」または「ドメイン」は単一列ユースケース・ドメインを意味します。

複数列ユースケース・ドメイン

複数列ユースケース・ドメインでは、1つのドメインで複数の列の列使用状況定義を作成します。複数列ユースケース・ドメインは、複数の表列にまたがる論理エンティティがある場合に理想的です。たとえば、複数列ユースケース・ドメインは、住所を表すために使用できます。

フレキシブル・ユースケース・ドメイン

フレキシブル・ユースケース・ドメインは、判別式の列の値に基づいて単一列または複数列ユースケース・ドメインのセットから動的に選択するドメインです。フレキシブル・ドメインは、1つ以上の判別式列で構成されるマッピング式に基づいて、特定のドメイン(構成要素ドメインとも呼ばれる)を値列のセットに割り当てます。

これらのユースケース・ドメインのタイプに加えて、表列に対する組込みのユースケース・ドメインを直接使用することもできます。例として、email_dssn_dおよびcredit_card_number_dが挙げられます。

関連項目:

10.1.3 ユースケース・ドメインに必要な権限

ユースケース・ドメインを操作するには、次の権限が必要です:

ノート:

データベース管理者(DBA)ロールには、次のすべての権限が含まれています。

DDL権限 アクション

CREATE DOMAIN

自分のスキーマ内にドメインを作成できます。

RESOURCEロールとDB_DEVELOPER_ROLEロールには、CREATE DOMAIN権限が含まれています。

CREATE ANY DOMAIN

任意のスキーマ内にドメインを作成できます。

ALTER ANY DOMAIN

任意のスキーマ内のドメインを変更できます。

DROP ANY DOMAIN

任意のスキーマ内のドメインを削除できます。

EXECUTE ANY DOMAIN

任意のスキーマ内のドメインを使用および参照できます。

ユーザーに任意のスキーマ内のドメイン対する実行権限を明示的に付与するには、次のコードを使用します。

GRANT EXECUTE ON <schemaName.domainName> TO <user>;

10.1.4 単一列ユースケース・ドメインの使用

この項では、単一列ユースケース・ドメイン(これ以降、「ユースケース・ドメイン」または「ドメイン」と表記)を作成、関連付け、変更、関連付け解除および削除する方法について説明します。

10.1.4.1 ユースケース・ドメインの作成

電子メール・アドレスやクレジット・カード番号など、共通の値を表すオプションのプロパティと制約のセットをカプセル化するために、ユースケース・ドメインを定義できます。

次に、いくつかのユースケース・ドメインの作成例を示します。この例のドメインは、表列のプロパティ(デフォルト値、制約、注釈、表示と順序の式など)に基づいています。

例10-1 時給用のユースケース・ドメインの作成

人材管理アプリケーション(HRA)では、それぞれの会社ごとに多数の表を作成します。ほとんどの会社には、時給を格納する列があります。HRAでは、次のようにして時給列用のユースケース・ドメインを作成できます:

CREATE DOMAIN HourlyWages AS NUMBER
  DEFAULT ON NULL 15
  CONSTRAINT MinimalWage CHECK (HourlyWages > = 7 AND HourlyWages <=1000) ENABLE
  DISPLAY TO_CHAR(HourlyWages, '$999.99')  ORDER ( -1*HourlyWages )
  ANNOTATIONS (properties '{"Purpose": "Wages", "Applicability": "USA", "Industry": {"Sales", "Manufacturing"} }');

例10-2 サロゲート・キー用のユースケース・ドメインの作成

データベース・アプリケーションでサロゲート・キー列に注釈を付けて、該当する列の標準メタデータを維持する場合は、次のようなドメインを作成します。

CREATE DOMAIN surrogate_id AS INTEGER
  STRICT
  NOT NULL
  ANNOTATIONS ( primary_key, mandatory, operations '["insert", "delete"]' );

例10-3 生年月日用のユースケース・ドメインの作成

次のユースケース・ドメインでは、生年月日のすべての列が「日付のみ」であることを確実にして、年齢が年数で表示されるようにします。

CREATE DOMAIN birth_date AS DATE
  CONSTRAINT birth_date_only_c check ( birth_date = trunc ( birth_date ) )
  DISPLAY FLOOR ( months_between ( sysdate, birth_date ) / 12 ) || ' years'
  ANNOTATIONS ( sensitive 'PII Data', operations '["insert", "update"]' );

例10-4 デフォルトの日時値用のユースケース・ドメインの作成

日時値用のユースケース・ドメインを作成することで、挿入が標準形式であることを確実にします。

CREATE DOMAIN insert_timestamp AS
  TIMESTAMP WITH LOCAL TIME ZONE
  DEFAULT ON NULL systimestamp;

例10-5 正の身長用のユースケース・ドメインの作成

次のユースケース・ドメインでは、個人の身長が正であることを確実にして、身長が降順にソートされます。

CREATE DOMAIN height AS NUMBER
  CONSTRAINT positive_height_c CHECK ( value > 0 )
  ORDER value * -1
  ANNOTATIONS ( operations '["insert", "update"]' );

例10-6 正の体重用のユースケース・ドメインの作成

次のユースケース・ドメインでは、個人の体重が正であることを確実にします。

CREATE DOMAIN weight AS NUMBER
  CONSTRAINT positive_weight_c CHECK ( value > 0 )
  ANNOTATIONS ( operations '["insert", "update"]' );

例10-7 チェック制約が複数あるドメインの定義

次の例のように、複数のCHECK制約がある電子メール・アドレス用のユースケース・ドメインを定義できます。

CREATE SEQUENCE IF NOT EXISTS email_seq;

CREATE DOMAIN email AS VARCHAR2(100) 
  DEFAULT ON NULL email_seq.NEXTVAL || '@domain.com' 
  CONSTRAINT email_c CHECK (REGEXP_LIKE (email, '^(\S+)\@(\S+)\.(\S+)$')) 
  CONSTRAINT email_max_len_c CHECK (LENGTH(email) <=100) DEFERRABLE INITIALLY DEFERRED
  DISPLAY '---' || SUBSTR(email, INSTR(email, '@') + 1);

両方の制約を満たすVARCHAR2(L [BYTE|CHAR])データ型の任意の列をドメインに関連付けできます。INITIALLY DEFERRED句により、制約email_max_len_cの値の検証をコミット時まで延期します。

例10-8 JSONスキーマの検証

次の例のように、再利用可能なJSONスキーマ検証にもドメインが使用できます。

CREATE DOMAIN department_json_doc AS JSON 
  CONSTRAINT CHECK ( 
    department_json_doc IS JSON VALIDATE USING '{
      "type": "object",
      "properties": {
        "departmentName": { "type": "string" },
        "employees": { "type": "array" }
      },
      "required" : [ "departmentName", "employees" ],
      "additionalProperties": false
    }' );

関連項目:

10.1.4.2 表作成時のユースケース・ドメインと列の関連付け

ユースケース・ドメインの定義後に、そのドメインは表の作成時に新しい表列に関連付けることも、既存の表の既存の列に関連付けることもできます。ユースケース・ドメインを列に関連付けると、そのドメインのオプションのプロパティと制約が列に明示的に適用されます。

CREATE TABLE DDLを使用すると、新しく作成した列にユースケース・ドメインを関連付けることができます。次の例は、新しい表列にユースケース・ドメインを関連付ける方法を示しています。次に示す各例は、前述の例で作成したユースケース・ドメインを使用しています。

例10-9 表作成時のHourlyWagesユースケース・ドメインの関連付け

HourlyWagesドメインを使用すると、HRAは賃金列のドメイン特性が同じになる複数の表を作成できます。

CREATE TABLE employee (
  name VARCHAR2(100),
  id NUMBER,
  wage NUMBER DOMAIN HourlyWages);
CREATE TABLE wage (
  name VARCHAR2(100),
  id NUMBER,
  wage NUMBER DOMAIN HourlyWages,
  gross_pay NUMBER,
  deductions NUMBER,
  net_pay NUMBER);

例10-10 表作成時のsurrogate_idユースケース・ドメインの関連付け

列にsurrogate_idなどの厳密なユースケース・ドメインを関連付ける場合は、関連付けられる列のデータ型がドメインと同じであることを確認してください。厳密なドメインでは、列の長さ、スケールおよび精度がドメインと一致することも必要です。

次のコードは、NUMBERデータ型の列をINTEGER/NUMBER(*,0)データ型のドメインにリンクしようとしているため、ORA-11517: the column data type does not match the domain columnで失敗します。

CREATE TABLE orders (
  order_id NUMBER DOMAIN surrogate_id,
  customer_id NUMBER,
  order_datetime TIMESTAMP WITH LOCAL TIME ZONE
    DEFAULT SYSTIMESTAMP);

この関連付けが機能するように、NUMBER(*,0)列データ型を使用して、surrogate_idユースケース・ドメイン(INTEGER == NUMBER(*,0))に関連付けできます。

CREATE TABLE orders (
  order_id NUMBER(*,0) DOMAIN surrogate_id,
  customer_id NUMBER,
  order_datetime TIMESTAMP WITH LOCAL TIME ZONE
    DEFAULT SYSTIMESTAMP); 

例10-11 表作成時のsurrogate_idbirth_dateheightおよびweightユースケース・ドメインの関連付け

DOMAINキーワードはオプションです。次の例では、DOMAINキーワードなしで、birth_dateドメインがdate_of_birth列に関連付けられていることがわかります。この例は、精度とスケールに関して、ドメイン内のものよりも正確なデータ型を定義できることも示しています。height_in_cm列とweight_in_kg列には、NUMBERとしてのドメイン・データ型が関連付けられていますが、列データ型にはNUMBER(4,1)などの精度およびスケール値があります。

CREATE TABLE people (
  person_id     DOMAIN surrogate_id
    GENERATED BY DEFAULT AS IDENTITY
    PRIMARY KEY,
  full_name     VARCHAR2(256),
  date_of_birth birth_date,
  height_in_cm  NUMBER(4, 1) DOMAIN height,
  weight_in_kg  NUMBER(6, 3) DOMAIN weight);

例10-12 表作成時のdepartment_json_docユースケース・ドメインの関連付け

CREATE TABLE departments (
  department_id  INTEGER PRIMARY KEY,
  department_doc JSON DOMAIN department_json_doc);

ガイドライン

  • ドメインを列に関連付けるときには、列のデータ型に加えてドメイン名も指定できます。この場合は、ドメインのデータ型が列のデータ型と互換性があるときには、列のデータ型が使用されます。

  • ドメインを列に関連付けるときには、列のデータ型のかわりにドメイン名を指定できます。この場合は、ドメイン・データ型が列に使用されます。そのときには、DOMAINキーワードがオプションになります。

  • ドメインがSTRICTとして定義されているときには、ドメインのデータ型、スケールおよび精度が列のデータ型、スケールおよび精度と一致する必要があります。

  • ドメインがSTRICTとして定義されていないときには、任意の長さの列に任意の長さのドメインを関連付けできます。たとえば、VARCHAR2(10)のドメインは任意のVARCHAR2列に関連付けできます。

関連項目:

  • ユースケース・ドメインの作成に対する構文とセマンティックの詳細は、『Oracle Database SQL言語リファレンス』: CREATE DOMAINを参照してください

  • 列とドメインのデータ型に関する詳細は、「ドメインのデータ型の指定」を参照してください

10.1.4.2.1 ユースケース・ドメインに関連付けられた列に対するDMLの使用

次に、ユースケース・ドメインが関連付けられた新しく作成する表列に使用できるDML文の例をいくつか示します。

例10-13 people表に対するDML文の使用

次のINSERTコマンドは、people表の列にデータを挿入します。そのときに、関連付けられたドメインで指定されたチェック制約に違反していないことを確認します。

INSERT INTO people
  VALUES ( 1, 'Sally Squirell', date'1981-01-01', 180.1, 61 );

INSERT INTO people
  VALUES ( 2, 'Brian Badger', date'2016-12-31', 120.4, 27.181 );
 

次のINSERTコマンドは、heightが負の数として指定されていることから、関連するチェック制約に違反するために失敗します。

INSERT INTO people
  VALUES ( 3, 'Fergal Fox', date'2023-04-12', -99, 1 );

出力は次のとおりです。

ORA-11534: check constraint (HR.SYS_C009232) due to domain constraint HR.POSITIVE_HEIGHT_C of domain HR.HEIGHT violated

関連付けられたドメインを使用することで、身長が降順でソートされたデータを表示し、それに対応する年齢と体重も表示できます。

SELECT full_name, DOMAIN_DISPLAY ( date_of_birth ) age,
       height_in_cm, weight_in_kg
  FROM people
  ORDER BY DOMAIN_ORDER ( height_in_cm );

関連項目:

DOMAIN_DISPLAYDOMAIN_ORDERなどのドメイン関数の詳細は、「ユースケース・ドメイン用のSQL関数」を参照してください。

出力は次のとおりです。


FULL_NAME            AGE        HEIGHT_IN_CM WEIGHT_IN_KG
-------------------- ---------- ------------ ------------
Sally Squirell       42 years          180.1           61
Brian Badger         6 years           120.4       27.181

people表は、データ型定義と参照先ドメイン情報を確認するように記述できます。

DESC people;

出力は次のとおりです。


 Name                   Null?    Type
 ---------------------- -------- ----------------------------------------
 PERSON_ID              NOT NULL NUMBER(38) HR.SURROGATE_ID
 FULL_NAME                       VARCHAR2(256)
 DATE_OF_BIRTH                   DATE HR.BIRTH_DATE
 HEIGHT_IN_CM                    NUMBER(4,1) HR.HEIGHT
 WEIGHT_IN_KG                    NUMBER(6,3) HR.WEIGHT

次のSELECTコマンドを使用すると、関連付けられたドメインから継承されている列の注釈を表示できます。


SELECT column_name, annotation_name, annotation_value 
  FROM user_annotations_usage
  WHERE object_name = 'PEOPLE';

出力は次のとおりです。


COLUMN_NAME          ANNOTATION_NAME      ANNOTATION_VALUE    
-------------------- -------------------- --------------------
PERSON_ID            PRIMARY_KEY          <null>              
PERSON_ID            MANDATORY            <null>              
PERSON_ID            OPERATIONS           ["insert", "delete"]
DATE_OF_BIRTH        OPERATIONS           ["insert", "update"]
DATE_OF_BIRTH        SENSITIVE            PII Data            
HEIGHT_IN_CM         OPERATIONS           ["insert", "update"]
WEIGHT_IN_KG         OPERATIONS           ["insert", "update"]

例10-14 JSONデータを使用したdepartments表に対するDML文の使用

次のdepartments表に対するINSERTコマンドは、department_json_docドメイン内のすべてのJSON属性が含まれているために成功します。

INSERT INTO departments 
  VALUES ( 1, '{
    "departmentName" : "Accounting", 
    "employees" : [
      {"empName":"William"},
      {"empName":"Shelley"}
    ]
  }');

次のINSERTコマンドは、employees属性がないために、ORA-40875: JSON schema validation error - missing employees attributeで失敗します。

INSERT INTO departments 
  VALUES ( 2, '{
    "departmentName" : "Finance"
  }');

次のINSERTコマンドは、関連付けられたdepartment_json_docユースケース・ドメイン内にmanager属性が見つからないために、ORA-40875: JSON schema validation error - extra manager attributeで失敗します。

INSERT INTO departments
  VALUES ( 3, '{
    "departmentName" : "Executive", 
    "employees" : [
      {"empName":"Lex"},
      {"empName":"Neena"}
    ],
    "manager" : {"empName":"Lex"}
  }');
10.1.4.3 ユースケース・ドメインと既存または新規の列の関連付け

ALTER TABLE DDLは、MODIFY句またはADD句とともに使用することで、既存の列または新規に追加された列にユースケース・ドメインを関連付けることができます。

例10-15 新規作成された列へのユースケース・ドメインの関連付け

新規作成されたcustomers表の場合:

CREATE TABLE customers (
  cust_id NUMBER,
  cust_email VARCHAR2(100));

ADDを使用することで、新しい列のcust_new_emailを追加して、その列にemailドメインを関連付けできます。

ALTER TABLE customers
  ADD (cust_new_email VARCHAR2(100) DOMAIN email);

例10-16 emailユースケース・ドメインと既存の列の関連付け

MODIFYを使用することで、既存の列のcust_emailを変更して、その列にemailドメインを関連付けできます。

ALTER TABLE customers
  MODIFY (cust_email  VARCHAR2(100) DOMAIN email);

また、ALTER TABLE ... MODIFY文を使用して、列にユースケース・ドメインを追加することもできます。次の例では、orders表の列であるorder_datetimeと、insert_timestampドメインのデフォルトが異なっています。insert_timestampドメインには、DEFAULTがありON NULL句が指定されていますが、order_datetime列にはありません。そのため、列にドメインを関連付けようとすると、エラーORA-11501: The column default does not match the domain default of the columnが発生します。

ALTER TABLE orders
  MODIFY order_datetime DOMAIN insert_timestamp;

このデフォルトの不一致を解決するために、ドメインのデフォルトと一致する列のdefault句を指定します。

ALTER TABLE orders
  MODIFY order_datetime DOMAIN insert_timestamp
    DEFAULT ON NULL systimestamp;

例10-17 関連付けられているドメインを表示するための問合せ

SELECT constraint_name, search_condition_vc, domain_constraint_name
  FROM  user_constraints
  JOIN  user_cons_columns
  USING ( constraint_name, table_name )
  WHERE  table_name = 'PEOPLE'
    AND  constraint_type = 'C'
    AND  column_name = 'WEIGHT_IN_KG';

出力は次のとおりです。


CONSTRAINT_NAME      SEARCH_CONDITION_VC            DOMAIN_CONSTRAINT_NAME   
-------------------- ------------------------------ --------------------------
SYS_C008493          "WEIGHT_IN_KG">0               POSITIVE_WEIGHT_C  

ガイドライン

  • ALTER TABLE .. ADD文のDOMAINキーワードは、新しく追加した列にドメインのみを指定する際のオプションです。

  • ALTER TABLE .. MODIFY文には、DOMAINキーワードが必須になります。

  • 列のデータ型には、ドメインのデータ型との互換性があることが必要です。

  • ドメインにデフォルトの式または照合がある場合は、関連付けられた列のデフォルトの式および照合と一致している必要があります。

  • 関連付けられる列にすでにドメインが関連付けられている場合は、エラーが返されます。

10.1.4.4 ユースケース・ドメインの変更

ユースケース・ドメインの表示式、順序式および注釈は変更可能です。サポートされているALTER DOMAIN DDL文は、次のとおりです。

例10-18 ドメインからの順序式の削除

heightユースケース・ドメイン定義にはVALUEという順序式があるため、順序式を削除するために、順序式をドロップする必要があります。

ALTER DOMAIN height DROP ORDER;

例10-19 ユースケース・ドメインへの表示式の追加

heightユースケース・ドメインに表示式を追加するには、次のALTERコマンドを使用します。

ALTER DOMAIN height 
  ADD DISPLAY round ( value ) || ' cm';

例10-20 birth_dateドメインの表示式の変更

birth_dateドメインの表示式を年数と月数に変更するには、次のALTERコマンドを使用します。

ALTER DOMAIN birth_date 
  MODIFY DISPLAY 
    FLOOR ( months_between ( sysdate, birth_date ) / 12 ) || ' years ' ||
    MOD ( FLOOR ( months_between ( sysdate, birth_date ) ), 12 ) || ' months';

例10-21 変更したbirth_dateheightおよびweightドメインについてのpeople表の問合せ

COLUMN age FORMAT A20

SELECT full_name, DOMAIN_DISPLAY ( date_of_birth ) age,
       DOMAIN_DISPLAY ( height_in_cm ) height_in_cm, weight_in_kg
  FROM  people
  ORDER  BY DOMAIN_ORDER ( height_in_cm );

関連項目:

DOMAIN_DISPLAYDOMAIN_ORDERなどのドメイン関数の詳細は、「ユースケース・ドメイン用のSQL関数」を参照してください。

出力は次のとおりです。

FULL_NAME            AGE                  HEIGHT_IN_CM  WEIGHT_IN_KG
-------------------- -------------------- ------------- ------------
Sally Squirell       42 years 5 months    180 cm                  61
Brian Badger         6 years 5 months     120 cm              27.181

例10-22 ユースケース・ドメインの注釈の変更

次のコードでは、heightユースケース・ドメインの注釈を追加します。

ALTER DOMAIN height
  ANNOTATIONS ( 
    operations '["insert", "update", "sort"]', 
    sensitive 'Private data');

例10-23 注釈の変更についてのディクショナリ・ビューの問合せ


COLUMN annotation_value FORMAT A40

SELECT column_name, annotation_name, annotation_value 
  FROM user_annotations_usage
  WHERE object_name = 'PEOPLE';

出力は次のとおりです。


COLUMN_NAME          ANNOTATION_NAME      ANNOTATION_VALUE                        
-------------------- -------------------- ----------------------------------------
PERSON_ID            PRIMARY_KEY          <null>                                  
PERSON_ID            MANDATORY            <null>                                  
PERSON_ID            OPERATIONS           ["insert", "delete"]                    
DATE_OF_BIRTH        SENSITIVE            PII Data                                
DATE_OF_BIRTH        OPERATIONS           ["insert", "update"]                    
HEIGHT_IN_CM         OPERATIONS           ["insert", "update"]                    
HEIGHT_IN_CM         OPERATIONS           ["insert", "update", "sort"]            
HEIGHT_IN_CM         SENSITIVE            Private data                            
WEIGHT_IN_KG         OPERATIONS           ["insert", "update"]                    

ガイドライン

  • ドメインの表示式は、そのドメインがフレキシブル・ドメインの構成要素でない場合にのみ変更できます。

  • ドメインの順序式は、そのドメインがフレキシブル・ドメインの構成要素でない場合にのみ変更できます。

  • ドメイン・レベルの注釈のみを変更できます。

関連項目:

  • ユースケース・ドメインの変更に関する構文とセマンティックの詳細は、『Oracle Database SQL言語リファレンス』: ALTER DOMAINを参照してください。

  • ユースケース・ドメインのディクショナリ・ビューについては、「ドメイン情報の表示」を参照してください

10.1.4.5 列からのユースケース・ドメインの関連付け解除

ALTER TABLE DDLは、DROP句とともに使用することで、列からユースケース・ドメインの関連付けを解除できます。

例10-24 列からのユースケース・ドメインの関連付け解除

customers表のcust_email列から関連付けられたドメインを削除するには:

ALTER TABLE customers
  MODIFY ( cust_email ) DROP DOMAIN;

ドメインを削除するが、ドメインの制約を維持するには:

ALTER TABLE customers
  MODIFY ( cust_email ) DROP DOMAIN PRESERVE CONSTRAINTS;

例10-25 列からのユースケース・ドメインの関連付け解除

次のコードは、制約を維持しながら、people表のheight_in_cm列からheightドメインのドメイン関連付けを削除します。

ALTER TABLE people
  MODIFY ( height_in_cm ) DROP DOMAIN PRESERVE CONSTRAINTS;

例10-26 ユースケース・ドメインの関連付けが解除された列の問合せ

user_constraintsディクショナリ表に対するSELECT問合せによって、変更内容が表示されます。

SELECT constraint_name, search_condition_vc, domain_constraint_name
  FROM user_constraints
  JOIN user_cons_columns
  USING ( constraint_name, table_name )
  WHERE table_name = 'PEOPLE'
    AND constraint_type = 'C';

出力は次のとおりです。


CONSTRAINT_NAME      SEARCH_CONDITION_VC                      DOMAIN_CONSTRAINT_NAME       
-------------------- ---------------------------------------- ------------------------------
SYS_C009491          "DATE_OF_BIRTH"=TRUNC("DATE_OF_BIRTH")   BIRTH_DATE_ONLY_C            
SYS_C009494          "WEIGHT_IN_KG">0                         POSITIVE_WEIGHT_C            
SYS_C009489          "PERSON_ID" IS NOT NULL                  <null>                       
SYS_C009490          "HEIGHT_IN_CM">0                         <null>                       

例10-27 削除したheightドメインの再追加

次のコードでは、削除したheightドメインをpeople表のheight_in_cm列に再追加します。

ALTER TABLE people
  MODIFY ( height_in_cm ) ADD DOMAIN height;

例10-28 再追加したドメインの問合せ

再追加したheightドメインによって、重複するheight_in_cm > 0制約が作成されます。

SELECT constraint_name, search_condition_vc, domain_constraint_name
  FROM user_constraints
  JOIN user_cons_columns
  USING ( constraint_name, table_name )
  WHERE table_name = 'PEOPLE'
    AND constraint_type = 'C'
  ORDER BY search_condition_vc;

出力は次のとおりです。


CONSTRAINT_NAME      SEARCH_CONDITION_VC                      DOMAIN_CONSTRAINT_NAME       
-------------------- ---------------------------------------- ------------------------------
SYS_C009491          "DATE_OF_BIRTH"=TRUNC("DATE_OF_BIRTH")   BIRTH_DATE_ONLY_C            
SYS_C009495          "HEIGHT_IN_CM">0                         POSITIVE_HEIGHT_C            
SYS_C009490          "HEIGHT_IN_CM">0                         <null>                       
SYS_C009489          "PERSON_ID" IS NOT NULL                  <null>                       
SYS_C009494          "WEIGHT_IN_KG">0                         POSITIVE_WEIGHT_C 

ガイドライン

列のドメインを削除すると、デフォルトで次の項目が保持されます。

  • ドメインの照合。

  • 列に追加されているドメイン以外の制約。

ドメインのデフォルト値は保持されません。デフォルトが明示的に列に適用されている場合にのみ保持されます。

関連項目:

  • ユースケース・ドメインの変更に関する構文とセマンティックの詳細は、『Oracle Database SQL言語リファレンス』: ALTER DOMAINを参照してください。

  • ユースケース・ドメインのディクショナリ・ビューについては、「ドメイン情報の表示」を参照してください

10.1.4.6 ユースケース・ドメインの削除

ユースケース・ドメインを削除できます。ドメインの削除の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例10-29 ユースケース・ドメインの削除

次のcustomers表には、emailドメインに関連付けられている列が1つあります。

CREATE TABLE customers (
  cust_id NUMBER,
  cust_email VARCHAR2(100) DOMAIN email);

次のDROPコマンドは、customers表のcust_email列にemailドメインが関連付けられているため、エラーを返します。

DROP DOMAIN email;

次のDROPコマンドは成功します:

DROP DOMAIN email FORCE;

cust_email列はemailドメインからの関連付けが解除され、emailドメインにかかわる文のすべてが無効になります。

例10-30 制約が保持されるドメインの削除

次のDROPコマンドは成功しますが、デフォルト式と制約式は保持されます。

DROP DOMAIN email FORCE PRESERVE;

cust_email列にはON NULL email_seq.NEXTVAL || '@domain.com'が維持され、制約は制約内のドメイン名を列名に置き換えた後に保持されます: CONSTRAINT email_c CHECK (REGEXP_LIKE (cust_email, '^(\S+)\@(\S+)\.(\S+)$'))

ガイドライン

  • フレキシブル・ドメインで参照されているドメインを削除する場合は、FORCEオプションを指定したDROP DOMAINを使用します。

  • ドメインが表列に関連付けられていないときに、ドメインがフレキシブル・ドメインの構成要素でない場合、ドメインは削除されます。ユースケース・ドメインが使用中の場合、DROP文は失敗します。

  • ドメインがいずれかの表列に関連付けられている場合は、ドメインの削除にFORCEオプションを使用する必要があります。FORCEオプションを使用すると、次の作用が伴われます:

    • ドメインのデフォルトのみが設定されている場合は、デフォルトの式が削除されます。

    • ドメインと列の両方にデフォルトが設定されている場合は、列のデフォルト式が保持されます。

    • すべての関連付けられた列からドメインの注釈が削除されます。

    • ドメインに関連付けられた列の照合が保持されます。

    • カーソル・キャッシュ内のすべてのSQL依存文が無効になります。

    • FORCE PRESERVEが使用されている場合は、ドメインに関連付けられている列の制約が保持されます。

関連項目:

10.1.4.6.1 ドメインの削除とごみ箱について

削除された表は、ごみ箱に配置されます。ごみ箱内の表に関連付けられているドメインを削除するには、DROPコマンドにFORCEオプションを指定する必要があります。

ごみ箱内にある削除した表は、FLASHBACK TABLEコマンドを使用すると削除前の配置にリストアできます。関連付けられたドメインの削除後に、表が削除前の配置にリストア(FLASHBACK TABLE TO BEFORE DROP)されると、その表には削除前のものと同じデフォルト、照合、NULL値可能性および制約が保持されています。ただし、そうした属性はいずれもドメインから継承されたものとしてのマークがありません。

例10-31 削除した表に関連付けられているユースケース・ドメインの削除

次のDROPコマンドでは、people表のweight_in_kg列に関連付けられているweightドメインの削除を試行します。


DROP DOMAIN weight;

このコマンドは次のエラー出力を返します:

ORA-11502: The domain WEIGHT to be dropped has dependent objects.

people表を削除してからweightドメインを削除すると、その表がごみ箱に残っているため、エラーが返されます。

DROP TABLE people;
DROP DOMAIN weight;

このコマンドは次のエラー出力を返します:

ORA-11502: The domain WEIGHT to be dropped has dependent objects.

ごみ箱からpeople表を完全に削除してから、weightドメインに対してDROPコマンドを実行すると、weightドメインが削除されます。


PURGE TABLE people;
DROP DOMAIN weight;

ガイドライン

削除した表(ごみ箱内の表)に関連付けられているドメインを削除する際には、次の点に注意してください。

  • 表がごみ箱にある間は、その表に対するALTERコマンドは許可されません。

  • ごみ箱にドメインに関連付けられている表がある場合は、関連付けられたドメインは削除できず、DROP DOMAINコマンドは失敗します。

  • DROP DOMAIN FORCEコマンドとDROP DOMAIN FORCE PRESERVEコマンドを使用すると、ごみ箱内の表のドメインからの関連付けが解除されます。データベースでは、FORCEのみを指定した場合でも、ごみ箱内の表に対してはFORCE PRESERVEセマンティクスが使用されます。

  • ごみ箱内の表に関連付けられているドメインを削除する場合は、ごみ箱から表を削除するためにPURGE TABLEコマンドを使用し、ドメインを削除するためにDROP DOMAINコマンドを実行します。

10.1.5 複数列ユースケース・ドメインの使用

この項では、複数列ユースケース・ドメインを作成、関連付け、変更、関連付け解除および削除する方法について説明します。

10.1.5.1 複数列ユースケース・ドメインの作成

複数列ユースケース・ドメインを使用して、表の列にまたがる住所などの論理エンティティをグループ化できます。

例10-32 住所用の複数列ユースケース・ドメインの作成

住所エントリ用に3つの列が含まれている「US_city」という複数列ユースケース・ドメインは、次のように作成できます:

CREATE DOMAIN US_city AS (
    name  AS VARCHAR2(30) ANNOTATIONS (Address),
    state AS VARCHAR2(2) ANNOTATIONS (Address),
    zip AS NUMBER ANNOTATIONS (Address)
  )
  CONSTRAINT City_CK CHECK(state in ('CA','AZ','TX') and zip < 100000)
  DISPLAY name||', '|| state ||', '||TO_CHAR(zip)
  ORDER state||', '||TO_CHAR(zip)||', '||name
  ANNOTATIONS (Title 'Domain Annotation');

例10-33 通貨用の複数列ユースケース・ドメインの作成

次のコードでは、貨幣価値を特定の通貨の金額として通貨コードと表示する、currencyという複数列ユースケース・ドメインを作成します。表示は値でソートされ(低から高)、その後で通貨コードでソートされます。

CREATE DOMAIN currency AS (
    amount  AS NUMBER,
    iso_currency_code  AS CHAR(3 CHAR)
  )
  DISPLAY iso_currency_code || TO_CHAR ( amount, '999,999,990.00' )
  ORDER TO_CHAR ( amount, '999,999,990.00' ) || iso_currency_code;

ガイドライン

  • 複数列ユースケース・ドメインの個々の列に、単一列ユースケース・ドメインと同じデータ型を設定できます。

  • 複数列ユースケース・ドメインの場合、異なるドメイン間での列の重複は許容されません。たとえば、表T(TC1、TC2、TC3、TC4)、ドメインD1(C1、C2)およびD2(C1、C2)の場合は、D1(TC1、TC2)とD2(TC2、TC3)のような関連付けはできません。

  • 同じ表内の列の複数の順序付きサブセットは、同じドメインに関連付けできます。たとえば、ドメインD1は、D1(TC1、TC2)とD1(TC3、TC4)のような関連付けができます。

  • 表には最大で1つのLONG列を含めることができますが、ドメインには複数のLONGデータ型の列を含めることができます。そのようなドメインは、DOMAIN_CHECK演算子を使用して複数のLONG列が関与するチェック条件を評価する場合に役立ちます。

関連項目:

10.1.5.2 表作成時の複数列ユースケース・ドメインの関連付け

CREATE TABLE DDL文を使用すると、新しく作成した列に複数列ユースケース・ドメインを関連付けることができます。

例10-34 US_cityドメインと複数の列の関連付け

customer表を作成して、その表の3つの列にUS_cityドメインを関連付けることができます。

CREATE TABLE customer(
  cust_id  NUMBER, 
  cust_name  VARCHAR2(30), 
  city_name  VARCHAR2(30), 
  state  VARCHAR2(2), 
  zip  NUMBER, 
  DOMAIN US_city(city_name, state, zip));

次の例では、ドメイン間でCITY列とSTATE列が重複しているため、エラーが返されます。

CREATE TABLE customer(
  cust_id  NUMBER, 
  cust_name  VARCHAR2(30), 
  city_name  VARCHAR2(30), 
  state  VARCHAR2(2), 
  zip  NUMBER, 
  DOMAIN US_city(city_name, state, zip),
  DOMAIN US_city(cust_name, state, zip));

次の例では、CITY_NAME列が繰り返されるため、同様にエラーが返されます。

CREATE TABLE customer(
  cust_id  NUMBER, 
  cust_name  VARCHAR2(30), 
  city_name  VARCHAR2(30), 
  state  VARCHAR2(2), 
  zip  NUMBER, 
  DOMAIN US_city(city_name, city_name, zip));

例10-35 currencyドメインと複数の列の関連付け

currencyドメインに関連付けられたtotal_paid列とcurrency_code列を保持するorder_items表を作成できます。

CREATE TABLE order_items (
  order_id INTEGER, product_id INTEGER,
  total_paid NUMBER(10, 2), currency_code char (3 CHAR ),
  DOMAIN currency ( total_paid, currency_code ));

ガイドライン

  • 実際のパラメータとしてドメインに渡される列名は一意であることが必要です。

  • ドメイン列は、名前が異なる表列に関連付けできます。

  • DOMAINキーワードは必須です。

10.1.5.2.1 複数列ドメインに関連付けられた列に対するDMLの使用

次に、複数列ユースケース・ドメインが関連付けられた新しく作成する表列に使用できるDML文の例をいくつか示します。

例10-36 関連付けられた列に対するDMLコマンドの使用

値を挿入して表を問い合せると、currencyドメインの表示式と順序式に基づいた結果が表示されます。

INSERT INTO order_items
VALUES (1, 1,    9.99, 'USD'),
       (2, 2,    8.99, 'GBP'),
       (3, 3,    8.99, 'EUR'),
       (4, 4, 1399,    'JPY'),
       (5, 5,  825,    'INR');
        
SELECT order_id, product_id, 
  DOMAIN_DISPLAY ( total_paid, currency_code ) amount_paid
  FROM order_items
  ORDER BY DOMAIN_ORDER ( total_paid, currency_code );

関連項目:

DOMAIN_DISPLAYDOMAIN_ORDERなどのドメイン関数の詳細は、「ユースケース・ドメイン用のSQL関数」を参照してください。

出力は次のとおりです。


  ORDER_ID PRODUCT_ID AMOUNT_PAID       
---------- ---------- ------------------
         3          3 EUR           8.99
         2          2 GBP           8.99
         1          1 USD           9.99
         5          5 INR         825.00
         4          4 JPY       1,399.00
10.1.5.3 複数列ユースケース・ドメインの既存の列との関連付け

ALTER TABLE DDL文は、MODIFY句またはADD句とともに使用することで、既存の列または既存の表に新しく追加された列に複数列ユースケース・ドメインを関連付けることができます。

例10-37 複数列ユースケース・ドメインの既存の列との関連付け

次の例では、US_cityドメインをcustomer表の3つの列に適用します。

ALTER TABLE customer
  MODIFY (city_name, state, zip) ADD DOMAIN US_city;

ノート:

ALTER TABLE .. MODIFY文には、DOMAINキーワードが必須になります。

10.1.5.4 複数列ユースケース・ドメインの変更

単一列ユースケース・ドメインの変更と同様に、複数列ユースケース・ドメインも変更できます。複数列ユースケース・ドメインでは、DISPLAYプロパティとORDERプロパティを変更できます。複数列ドメインの場合、現在時点では列レベルでの注釈の変更はサポートされていませんが、オブジェクト・レベルの注釈は変更できます。

例10-38 複数列ユースケース・ドメインの表示式と順序式の変更

次のALTER文では、currencyドメインの表示式を変更します。現在の表示式では、通貨コードと通貨値が表示されます。変更した表示式では、通貨値の後に通貨コードが表示されます。

ALTER DOMAIN currency
  MODIFY DISPLAY TO_CHAR ( amount, '999,990.00' ) || '-' || iso_currency_code;

次のALTER文では、currencyドメインの順序式を変更します。現在の順序式では、通貨値でソートされた後に通貨コードでソートされます。変更した順序式では、通貨コードでソートされた後に通貨値でソートされます。

ALTER DOMAIN currency
  MODIFY ORDER iso_currency_code || TO_CHAR ( amount, '999,990.00' );

例10-39 変更した複数列ドメインに関連付けられた表の問合せ

SELECT order_id, product_id,
  DOMAIN_DISPLAY ( total_paid, currency_code ) amount_paid
  FROM order_items
  ORDER BY DOMAIN_ORDER ( total_paid, currency_code );

出力は次のとおりです。


ORDER_ID    PRODUCT_ID    AMOUNT_PAID   
----------- ------------- ---------------
          3             3        8.99-EUR   
          2             2        8.99-GBP   
          5             5      825.00-INR   
          4             4    1,399.00-JPY   
          1             1        9.99-USD

関連項目:

10.1.5.5 列からの複数列ユースケース・ドメインの関連付け解除

ALTER TABLE DDL文は、DROP句とともに使用することで、列から複数列ユースケース・ドメインの関連付けを解除できます。

例10-40 複数列ユースケース・ドメインの関連付け解除の例

次のALTER TABLEコマンドは、customer表のcity_name列、state列およびzip列からUS_Cityドメインを削除します。

ALTER TABLE customer
  MODIFY(city_name, state, zip) DROP DOMAIN;

表Tの列(c1、c2、c3)がドメインDに関連付けられていて、その他の列セット(c4、c5、c6)もドメインDに関連付けられている場合は、すべての列のドメインを削除できます。

ALTER TABLE T
  MODIFY (c1, c2, c6, c5, c4, c3) DROP DOMAIN;

複数列ドメインに関連付けられている列のサブセットのみを削除することはできません。たとえば、表Tの場合は、c1列とc2列のみを削除すると、エラーが返されます:

ALTER TABLE T
  MODIFY (c1, c2) DROP DOMAIN;

例10-41 複数列ユースケース・ドメインの関連付け解除のその他の例

次のコードでは、order_items表のtotal_paid列とcurrency_code列からcurrencyドメインを削除します。


ALTER TABLE order_items
  MODIFY ( total_paid, currency_code ) DROP DOMAIN;

ガイドライン

  • 同じドメインに関連付けられている、同じ表内の列の複数の順序付きサブセットが存在していることがあります。複数列ドメインを削除する構文では、関連付けられた列のうち関連付けを解除する列のリストを指定する必要があります。

  • ドメイン名は指定できません。

  • ALTER TABLE ..DROP DOMAINALTER TABLE ..MODIFYには、その他のオプションを指定できません。

10.1.5.6 複数列ユースケース・ドメインの削除

複数列ユースケース・ドメインを削除する場合は、単一列ユースケース・ドメインに使用したものと同じ構文を使用します。

ガイドライン

  • フレキシブル・ドメインで参照されているドメインを削除する場合は、FORCEオプションを指定したDROP DOMAINを使用します。

関連項目:

  • ユースケース・ドメインの削除に関する構文とセマンティックの詳細は、『Oracle Database SQL言語リファレンス』: DROP DOMAINを参照してください

  • ユースケース・ドメインの削除の詳細は、「ユースケース・ドメインの削除」を参照してください。

10.1.6 フレキシブル・ユースケース・ドメインの使用

この項では、フレキシブル・ユースケース・ドメインを作成、関連付け、関連付け解除および削除する方法について説明します。

ノート:

フレキシブル・ユースケース・ドメインは変更できません。そのかわりに、表からフレキシブル・ドメインの関連付けを解除し、ドメインをDROPし、ドメインを再作成して、表との関連付けを再実行することはできます。

10.1.6.1 フレキシブル・ユースケース・ドメインの作成

フレキシブルでない別のドメイン(単一列および複数列ユースケース・ドメイン)を参照するフレキシブル・ユースケース・ドメインを作成し、それらのいずれかのドメインをデータのコンテキストに応じて表列に適用できます。たとえば、各国の住所の書式を検証するための複数列ドメインを作成できます。表列は1つのドメインにのみ属することが可能です。そのため、データベースで行ごとの各国に対応する住所ドメインを使用できるようにするには、国ドメインにわたるフレキシブル・ドメインを作成します。判別式の列として国を使用して、フレキシブル・ドメインに列を関連付けます。各行には、対応する国ドメインの住所ルールを適用できます。

例10-42 温度測定用のフレキシブル・ユースケース・ドメインの作成

次のコードでは、3つのcelciusfahrenheitkelvinというドメインから、temperatureというフレキシブル・ユースケース・ドメインを作成します。それぞれの温度スケールに応じて作成されたドメインには、適切な絶対零度のチェックと表示式があります。フレキシブル・ドメインにはELSE句がないため、別の温度単位の値の挿入が可能ですが、そうした温度単位の温度値は制約されません。


CREATE DOMAIN celcius AS NUMBER
  CONSTRAINT abs_zero_c_c CHECK ( celcius >= -273.15 )
  DISPLAY celcius || ' °C';
   
CREATE DOMAIN fahrenheit AS NUMBER
  CONSTRAINT abs_zero_f_c CHECK ( fahrenheit >= -459.67 )
  DISPLAY fahrenheit || ' °F';
   
CREATE DOMAIN kelvin AS NUMBER
  CONSTRAINT abs_zero_k_c CHECK ( kelvin >= 0 )
  DISPLAY kelvin || ' K';

次のコードでは、温度単位に基づいて使用するドメインを選択するフレキシブル・ドメインを作成します。


CREATE FLEXIBLE DOMAIN temperature (
  temp
 ) CHOOSE DOMAIN USING ( units char(1) ) 
 FROM (
  CASE units
    WHEN 'C' THEN celcius ( temp )
    WHEN 'F' THEN fahrenheit ( temp )
    WHEN 'K' THEN kelvin ( temp )
  END);

例10-43 住所用のフレキシブル・ユースケース・ドメインの作成

次のコードでは、米国とイギリス(英国)のアドレスを表す複数列ユースケース・ドメインと、その他の国に向けたデフォルトの住所ドメインを作成します。

/* US addresses */
CREATE DOMAIN us_address AS (
  line_1  AS VARCHAR2(255 CHAR) NOT NULL,
  town    AS VARCHAR2(255 CHAR) NOT NULL,
  state   AS VARCHAR2(255 CHAR) NOT NULL,
  zipcode AS VARCHAR2(10 CHAR) NOT NULL
 ) CONSTRAINT us_address_c check ( 
   REGEXP_LIKE ( zipcode, '^[0-9]{5}(-[0-9]{4}){0,1}$' ));
 
/* British addresses */
CREATE DOMAIN gb_address AS ( 
  street   AS VARCHAR2(255 CHAR) NOT NULL,
  locality AS VARCHAR2(255 CHAR),
  town     AS VARCHAR2(255 CHAR) NOT NULL,
  postcode AS VARCHAR2(10 CHAR) NOT NULL
 ) CONSTRAINT gb_postcode_c check (
   REGEXP_LIKE ( 
    postcode, '^[A-Z]{1,2}[0-9][A-Z]{0,1} [0-9][A-Z]{2}$' ));
   
/* Default address */
CREATE DOMAIN global_address AS ( 
  line_1   AS VARCHAR2(255) NOT NULL,
  line_2   AS VARCHAR2(255),
  line_3   AS VARCHAR2(255),
  line_4   AS VARCHAR2(255),
  postcode AS VARCHAR2(10)); 

次のコードでは、国コードに基づいて使用する複数列住所ドメインを選択するフレキシブル・ドメインを作成します。

CREATE FLEXIBLE DOMAIN address (
  line_1, line_2, line_3, line_4,
  postal_code      
 )
 CHOOSE DOMAIN USING ( country_code VARCHAR2(2 char) )
 FROM (
  CASE country_code
    WHEN 'GB' THEN gb_address ( line_1, line_2, line_3, postal_code )
    WHEN 'US' THEN us_address ( line_1, line_2, line_3, postal_code )
    ELSE global_address ( line_1, line_2, line_3, line_4, postal_code )
  END);

ノート:

フレキシブル・ドメインを作成するには、構成要素ドメインごとにEXECUTE権限が必要です。

関連項目:

ユースケース・ドメインの作成に対する構文とセマンティックの詳細は、『Oracle Database SQL言語リファレンス』: CREATE DOMAINを参照してください

10.1.6.2 表作成時のフレキシブル・ユースケース・ドメインの関連付け

CREATE TABLE DDLを使用すると、新しい表に新しく作成した列のセットにフレキシブル・ユースケース・ドメインを関連付けできます。列のセットにフレキシブル・ドメインを追加するには、ドメインに関連付ける列のリストを(ドメインの列順序で)指定し、判別式として使用する列のリストを(フレキシブル・ドメインの判別式の列順序で)指定します。

例10-44 temperatureフレキシブル・ドメインと新しい表列の関連付け

temperatureフレキシブル・ドメインを使用するsensor_readings表を作成し、USINGキーワードで判別式の列を指定します。


CREATE TABLE sensor_readings (
  sensor_id integer, reading_timestamp TIMESTAMP,
  temperature_reading NUMBER,
  temperature_units   CHAR(1 CHAR),
  DOMAIN temperature ( temperature_reading )
    USING ( temperature_units ));

例10-45 addressフレキシブル・ドメインと新しい表列の関連付け

次のコードでは、addressesという新しい表を作成し、その表の列をaddressフレキシブル・ドメインに関連付けます。

CREATE TABLE addresses (
  line_1 VARCHAR2(255) NOT NULL,
  line_2 VARCHAR2(255),
  line_3 VARCHAR2(255),
  line_4 VARCHAR2(255),
  country_code   VARCHAR2(2 CHAR) NOT NULL,
  postal_code    VARCHAR2(10 CHAR), 
  DOMAIN address ( 
    line_1, line_2, line_3, line_4, postal_code)
    USING ( country_code ));

ノート:

キーワードのDOMAINUSINGは、フレキシブル・ドメインを関連付けするときには必須です。

10.1.6.2.1 フレキシブル・ドメインに関連付けられた列に対するDMLの使用

次に、フレキシブル・ユースケース・ドメインが関連付けられた新しく作成する表列に対するDML文の例を示します。

例10-46 temperatureフレキシブル・ドメインに関連付けられた列に対するDMLコマンドの使用

INSERT INTO sensor_readings 
VALUES ( 1, timestamp'2023-06-08 12:00:00', 21.1, 'C' ),
       ( 1, timestamp'2023-06-08 12:05:00', 21.2, 'C' ),
       ( 1, timestamp'2023-06-08 12:10:00', 20.9, 'C' ),
       ( 2, timestamp'2023-06-08 12:00:00', 68.5, 'F' ),
       ( 2, timestamp'2023-06-08 12:05:00', 68.1, 'F' ),
       ( 2, timestamp'2023-06-08 12:10:00', 68.9, 'F' ),
       ( 3, timestamp'2023-06-08 12:00:00', 290.23, 'K' ),
       ( 3, timestamp'2023-06-08 12:05:00', 289.96, 'K' ),
       ( 3, timestamp'2023-06-08 12:10:00', 289.65, 'K' ),
       ( 4, timestamp'2023-06-08 12:00:00', 528.15, 'R' ),
       ( 4, timestamp'2023-06-08 12:05:00', 528.42, 'R' ),
       ( 4, timestamp'2023-06-08 12:10:00', 527.99, 'R' );

SELECT sensor_id, reading_timestamp,
  DOMAIN_DISPLAY ( temperature_reading, temperature_units ) temp
  FROM  sensor_readings;

関連項目:

DOMAIN_DISPLAYDOMAIN_ORDERなどのドメイン関数の詳細は、「ユースケース・ドメイン用のSQL関数」を参照してください。

出力は次のとおりです。

 SENSOR_ID READING_TIMESTAMP              TEMP                                       
---------- ------------------------------ -------------------------------------------
         1 08-JUN-2023 12.00.00.000000000 21.1 °C                                    
         1 08-JUN-2023 12.05.00.000000000 21.2 °C                                    
         1 08-JUN-2023 12.10.00.000000000 20.9 °C                                    
         2 08-JUN-2023 12.00.00.000000000 68.5 °F                                    
         2 08-JUN-2023 12.05.00.000000000 68.1 °F                                    
         2 08-JUN-2023 12.10.00.000000000 68.9 °F                                    
         3 08-JUN-2023 12.00.00.000000000 290.23 K                                   
         3 08-JUN-2023 12.05.00.000000000 289.96 K                                   
         3 08-JUN-2023 12.10.00.000000000 289.65 K 
         4 08-JUN-2023 12.00.00.000000000 <null>                                    
         4 08-JUN-2023 12.05.00.000000000 <null>                                    
         4 08-JUN-2023 12.10.00.000000000 <null> 

例10-47 範囲外制約エラー

次の値は、それぞれの温度スケールに対して範囲外制約エラーになります。


INSERT INTO sensor_readings 
  VALUES ( 1, timestamp'2023-06-08 12:15:00', -400, 'C' );

INSERT INTO sensor_readings 
  VALUES ( 2, timestamp'2023-06-08 12:15:00', -999, 'F' );

INSERT INTO sensor_readings 
  VALUES ( 3, timestamp'2023-06-08 12:15:00',   -1, 'K' );

例10-48 addressフレキシブル・ドメインに関連付けられた列に対するDMLの使用

-- Great Britian
INSERT INTO addresses ( line_1, line_3, country_code, postal_code ) 
  VALUES ( '10 Big street', 'London', 'GB', 'N1 2LA' );
 
-- United States
INSERT INTO addresses ( line_1, line_2, line_3, country_code, postal_code ) 
  VALUES ( '10 another road', 'Las Vegas', 'NV', 'US', '87654-3210' );  
 
-- Tuvalu
INSERT INTO addresses ( line_1, country_code ) 
  VALUES ( '10 Main street', 'TV' );  
 
SELECT * FROM addresses;

出力は次のとおりです。


LINE_1             LINE_2       LINE_3    LINE_4    COUNTRY_CODE    POSTAL_CODE  
------------------ ------------ --------- --------- --------------- -----------
10 Big street      <null>       London    <null>    GB              N1 2LA         
10 another road    Las Vegas    NV        <null>    US              87654-3210     
10 Main street     <null>       <null>    <null>    TV              <null> 

次のINSERTコマンドは、US郵便番号が含まれたUK住所を挿入しようとしているため、エラーを返します。

INSERT INTO addresses ( line_1, line_3, country_code, postal_code ) 
  VALUES ( '10 Big street', 'London', 'GB', '12345-6789' );
ORA-11534: check constraint (schema.SYS_C0010286) due to domain constraint schema.SYS_DOMAIN_C00639 of domain schema.ADDRESS violated

次のINSERTコマンドは、州の値のないUS住所を挿入しようとしているため、エラーを返します。

INSERT INTO addresses ( line_1, line_2, country_code, postal_code ) 
  VALUES ( '10 another road', 'Las Vegas', 'US', '87654-3210' ); 
ORA-11534: check constraint (schema.SYS_C0010289) due to domain constraint schema.SYS_DOMAIN_C00636 of domain schema.ADDRESS violated
10.1.6.3 フレキシブル・ドメインの既存の列との関連付け

ALTER TABLE DDLは、MODIFY句またはADD句とともに使用することで、既存の列または既存の表に新しく追加された列にフレキシブル・ユースケース・ドメインを関連付けることができます。

例10-49

次のコードでは、temp_sensor_readingsという新しい表を作成します。

CREATE TABLE temp_sensor_readings (
  sensor_id integer, reading_timestamp TIMESTAMP,
  temperature_reading NUMBER,
  temperature_units   CHAR(1 CHAR));

次のコードでは、temperatureフレキシブル・ドメインをtemperature_readingという既存の列に関連付けます。

ALTER TABLE temp_sensor_readings
  MODIFY (temperature_reading, temperature_units)
  ADD DOMAIN temperature;

ガイドライン

  • DOMAINキーワードは、フレキシブル・ドメインを関連付けるときには必須です。

  • ALTER TABLE .. ADD文には、USINGキーワードが必須になります。

  • 複数のフレキシブル・ドメインには、ドメイン列としても判別式の列としても、同じ列を関連付けることはできません。

  • 同一のドメインに列を関連付けることはできませんが、別の列位置を関連付けできます。

10.1.6.4 列からのフレキシブル・ユースケース・ドメインの関連付け解除

ALTER TABLE DDLは、DROP句とともに使用することで、列からフレキシブル・ユースケース・ドメインの関連付けを解除できます。

例10-50

次のコードでは、temp_sensor_readings表からtemperatureドメインを削除します。

ALTER TABLE temp_sensor_readings
  MODIFY (temperature_reading, temperature_units) DROP DOMAIN;

ガイドライン

  • ドメイン名は不要です。これは、どの列がどのドメインに関連付けられているかをデータベースが認識していて、1つの列は1つのドメインにのみ関連付けできるためです。

  • ALTER TABLE ..DROP DOMAINALTER TABLE ..MODIFYには、その他のオプションを指定できません。

10.1.6.5 フレキシブル・ユースケース・ドメインの削除

フレキシブル・ユースケース・ドメインを削除する場合は、単一列使用状況ドメインに使用したものと同じ構文を使用します。

ガイドライン

  • フレキシブル・ドメインで参照されているドメインを削除する場合は、FORCEオプションを指定したDROP DOMAINを使用します。この操作により、フレキシブル・ドメインも削除されます。

  • フレキシブル・ドメインをFORCEモードで削除するには、構成要素のフレキシブル・ドメインを削除する権限が必要です。

関連項目:

  • ユースケース・ドメインの削除に関する構文とセマンティックの詳細は、『Oracle Database SQL言語リファレンス』: DROP DOMAINを参照してください。

  • ユースケース・ドメインの削除の詳細は、「ユースケース・ドメインの削除」を参照してください。

10.1.7 列挙ユースケース・ドメインの使用

この項では、列挙ユースケース・ドメイン(列挙ドメイン)を作成および使用する方法について説明します。

10.1.7.1 列挙型について

列挙型(ENUMまたは列挙とも呼ばれる)は、順序付けられた値セットで構成されるデータ型です。言語構成として、データ入力フィールドで許容されるリテラル(名前付き値)の固定セットの定義にENUMを使用できます。アプリケーション要件に基づいて、表の作成時に列指定で有効な値を明示的に定義できます。列挙のよくある例としては、日や月、または北、南、東、西などの方向があります。

10.1.7.2 列挙ドメインの概要

Oracle Databaseでは、リリース23ai (バージョン23.4)以降、ドメインの列挙タイプを使用できるようになりました。

列挙型として作成されるドメインは、列挙ドメインと呼ばれます。そのため、列挙ドメインでは、顧客のオーダーについて想定される状態(オープン、保留中、出荷済および搬送済)のリストなど、列に格納できる事前定義済の値のリストが定義されます。列挙ドメインを作成したら、そのドメインを表列のデータ型として使用できます。列挙ドメインは、Oracle SQLの表への列挙型列の追加を簡略化します。

次に、列挙ドメインを作成および使用するための一般的なルールとガイドラインを示します。

  • 列挙ドメインには名前セット、およびオプションで名前に対応する値が含まれます。

  • 列挙内の名前は有効なSQL識別子である必要があります。

  • 名前は通常のOracle SQL識別子であるため、Oracle SQLの有効な識別子に適用されるすべての制限に従う必要があります。

  • 指定する値はすべてリテラルである必要があります。

  • 値は、ユースケース・ドメインに対応している任意のデータ型にできますが、ドメインで使用される値はすべて同じデータ型である必要があります。

  • 値が指定されていない場合、名の値は1です。後続のそれぞれの名前の値は、前の名前の値より1つ大きくなります。

  • それぞれの値に複数の名前を関連付けることができます。

  • 名前を二重引用符で囲むと、キーワードの制限を回避したり、大文字と小文字を区別したりできます。

  • 列挙ドメイン内の名前は、スカラーSQL式でリテラルが許可されている任意の場所で使用できます。

  • 列挙ドメインは、他の単一列ドメインと同様に使用できます。ただし、正規表現ドメインとは異なり、列挙ドメインにはデフォルトのチェック制約と表示式があります。

  • 列挙ドメインは、SELECT文のFROM句で表のように使用できます。

10.1.7.3 列挙ドメインの作成

列挙ドメインを作成するには、CREATE DOMAIN AS ENUMコマンドを使用します。

関連項目:

ユースケース・ドメインの作成に対する構文とセマンティックの詳細は、『Oracle Database SQL言語リファレンス』: CREATE DOMAINを参照してください

次の例は、様々なユースケースの列挙ドメインを作成する方法を示しています。

オーダー・ステータスの列挙ドメインの作成

次のコードは、名前セットのみを含むorder_statusドメインを作成します。ドメイン内のそれぞれの名前の値は、New = 1、Open = 2、Shipped = 3、Closed = 4、Canceled = 5です。

CREATE DOMAIN order_status AS
 ENUM (
   New,
   Open,
   Shipped,
   Closed,
   Canceled
 );

二重引用符で囲まれた名前を持つ列挙ドメインの作成

通常の識別子と同様に、列挙名を二重引用符で囲むと、キーワードの制限を回避したり、大文字と小文字を区別したりできます。次の例では、CRUD関数を名前とするCRUDという列挙ドメインを作成しますが、二重引用符を使用すると、キーワード制限を回避できます。

CREATE DOMAIN CRUD AS
 ENUM ( "Create",
        "Read",
        "Update",
        "Delete"
 );

ステータス・コードの列挙ドメインの作成

名前に割り当てられた値を含む列挙ドメインを作成することもできます。Status_Codeという次のドメインには、それぞれの状態に割り当てられたステータス・コード値があります。

CREATE DOMAIN Status_Code AS
 ENUM (
   OK = 200,
   Not_Found = 404,
   Internal_Error = 500
 );

曜日用の列挙ドメインの作成

次のコードでは、週のすべての曜日にDays_Of_Weekという列挙ドメインを作成します。ドメイン内のそれぞれの名前の値は、SundayとSuが0、MondayとMoが1、TuesdayとTuが2、WednesdayとWeが3、ThursdayとThが4、FridayとFrが5、SaturdayとSaが6です。したがって、それぞれの値は2つの名前に関連付けられます。

CREATE DOMAIN Days_Of_Week AS
 ENUM (
   Sunday = Su = 0,
   Monday = Mo,
   Tuesday = Tu,
   Wednesday = We,
   Thursday = Th,
   Friday = Fr,
   Saturday = Sa
 );

肩書の列挙ドメインの作成

次のコードでは、組織内で想定される肩書きの列挙ドメインを作成します。

CREATE DOMAIN Job_Title AS
 ENUM (
   Clerk = 'CLERK',
   Salesclerk = Salesperson = 'SALESCLERK',
   Manager = 'MANAGER',
   Analyst = 'ANALYST',
   President = 'PRESIDENT'
 );

米国祝日の列挙ドメインの作成

値は、リテラル式または定数式でもかまいません(CREATE DOMAIN DDLの一部として評価できます)。次の例では、評価された式を使用して米国祝日の列挙ドメインを作成します。

CREATE DOMAIN US_Holidays_2023 AS
 ENUM (
   "New Years Day" = to_date('Jan  2, 2023', 'Mon DD, YYYY'),
   "MLK Jr. Day" = to_date('Jan 16, 2023', 'Mon DD, YYYY'),
   "Presidents Day" = to_date('Feb 20, 2023', 'Mon DD, YYYY'),
   "Memorial Day" = to_date('May 29, 2023', 'Mon DD, YYYY'),
   "Juneteenth" = to_date('Jun 19, 2023', 'Mon DD, YYYY'),
   "Independence Day" = to_date('Jul  4, 2023', 'Mon DD, YYYY'),
   "Labor Day" = to_date('Sep  4, 2023', 'Mon DD, YYYY'),
   "Columbus Day" = to_date('Sep  4, 2023', 'Mon DD, YYYY'),
   "Veterans Day" = to_date('Nov 11, 2023', 'Mon DD, YYYY'),
   "Thanksgiving Day" = to_date('Nov 23, 2023', 'Mon DD, YYYY'),
   "Christmas Day" = to_date('Dec 25, 2023', 'Mon DD, YYYY')
 );

Healthcareアプリケーションの列挙ドメインの作成

次に、Healthcareアプリケーションで使用する列挙ドメインの例を示します:

CREATE DOMAIN Blood_Group AS
 ENUM (
   A_Positive = A_Pos = 'A +',
   A_Negative = A_Neg = 'A -',
   B_Positive = B_Pos = 'B +',
   B_Negative = B_Neg = 'B -',
   AB_Positive = AB_Pos = 'AB +',
   AB_Negative = AB_Neg = 'AB -',
   O_Positive = O_Pos = 'O +',
   O_Negative = O_Neg = 'O -'
 );

次に、Healthcareアプリケーションの列挙ドメインに関するその他のユースケースを示します。

  • イメージング・モダリティ: X線、MRI、CT、超音波。

  • 処方頻度: 日に1回、日に2回、日に3回、必要に応じて。

  • 患者の状態: 安定、重体、回復中、末期。

  • アレルギーの種類: 食品、医薬品、環境、昆虫、動物、その他。

  • BMIカテゴリ: 低体重、適正、軽度肥満、肥満

10.1.7.4 表作成時の列挙ドメインの関連付け

単一列ユースケース・ドメインと同様に、表の作成時に列挙ドメインを表列のデータ型として使用できます。次の例では、orders表を作成し、order_status列挙ドメイン(前に作成)をstatus列に関連付けます。

CREATE TABLE orders(
 id NUMBER,
 cust VARCHAR2(100),
 status order_status
);

orders表の説明では、status列が実際には単一列ドメインを持つ数値列であることを示しています。実際の値は、オーダー・ステータスを表す数値としてstatus列に格納されます。

DESCRIBE orders;

出力は次のとおりです。


Name              Null?           Type
- - - - - - - -   - - - - - - -   - - - - - - - - - - - - - - - 
ID                                NUMBER
CUST                              VARCHAR2(100)
STATUS                            NUMBER SCOTT.ORDER_STATUS
10.1.7.4.1 列挙ドメインに関連付けられた列に対するDMLの使用

列挙ドメインに関連付けられている表列に対して発行されたDML文の例を次に示します。

orders表でのINSERTコマンドの使用

orders表にデータを挿入するには、適切なオーダー・ステータスを使用して各行を構成します。

INSERT INTO orders VALUES
  (1, 'Costco', order_status.open),
  (2, 'BMW', order_status.closed),
  (3, 'Nestle', order_status.open);

出力は次のとおりです。

3 rows created.

これらの行はリストアップできますが、対応する列挙名を使用して列挙値を表示するには、ドメインによって提供される標準のメカニズム(DOMAIN_DISPLAY()ファンクション)を使用できます:

SELECT id, DOMAIN_DISPLAY(status) status FROM orders;

出力は次のとおりです。


               ID  STATUS
- - - - - - - - -  - - - - - - - - -
                1  OPEN
                2  CLOSED
                3  OPEN

次のSELECT文は、status列に格納されている実際の値が数値であることを示しています。

SELECT id, status FROM orders;

出力は次のとおりです。


               ID   STATUS
- - - - - - - - -  - - - - 
                1        2
                2        4
                3        2

orders表でのUPDATEコマンドの使用

挿入と同様に、列挙名は、UPDATE文などの他のDML文でも使用できます。

次の例では、orders表の行を更新して、ステータスを「Closed」から「Canceled」に、「Open」から「Closed」に変更します。

UPDATE orders  
  SET status = CASE status
                WHEN order_status.closed
                  THEN order_status.cancelled
                WHEN order_status.open
                  THEN order_status.closed
               END
  WHERE status IN(order_status.closed, order_status.open);

出力は次のとおりです。

2 rows updated.

更新が想定どおりに行われたことを確認するには、DOMAIN_DISPLAYファンクションを指定してSELECTコマンドを再度使用します。

SELECT id, DOMAIN_DISPLAY(status) status FROM orders;

出力は次のとおりです。


               ID  STATUS
- - - - - - - - -  - - - - - - - - -
                1  CLOSED
                2  CANCELLED
                3  CLOSED

status列の基礎となるデータ型は単なる数値であるため、任意の数値でステータスを直接更新することもできます。

UPDATE orders SET status = 2 WHERE status = 5;

出力は次のとおりです。

1 row updated.

ドメイン・チェック制約は、それが有効なドメイン値であることを検証します:

UPDATE orders SET status = -7;

出力は次のとおりです。

ORA -11534: check constraint ... violated

列挙名はリテラル値のプレースホルダにすぎないため、SQLでリテラルが許可される任意の場所で使用できます:

SELECT 2*order_status.cancelled;

出力は次のとおりです。


2*ORDER_STATUS.CANCELLED
-  - - - - - - - - - - - 
                      10

列挙ドメインでのSELECTコマンドの使用

通常のドメインとは異なり、列挙ドメインは表として扱い、SELECT文を使用して問い合せることができます。

SELECT * FROM order_status;

出力は次のとおりです。


ENUM_NAME         ENUM_VALUE
- - - - - - -    - - - - - -
NEW                        1
OPEN                       2
SHIPPED                    3
CLOSED                     4
CANCELLED                  5

ただし、通常のドメインと同様に、列挙ドメインをDML文のターゲットにすることはできません。

UPDATE order_status SET value = 4;

出力は次のとおりです。

ORA -04044: procedure , function , ... not allowed here
10.1.7.5 列挙ドメインの既存の列との関連付け

通常のドメインと同様に、ALTER-TABLE-MODIFYコマンドを使用して、既存の表の列に列挙ドメインを追加できます。次のコードでは、empjobdeptnoおよびcomm列を含む既存の表であると想定します。

ALTER TABLE emp
 MODIFY(job)
  ADD DOMAIN Job_Title;

次のように、標準のSQL文を引き続き使用できます:

UPDATE emp
 SET job = 'MANAGER'
  WHERE deptno = 20;

また、次のように、SQL文で列挙を明示的に使用することもできます:

UPDATE emp
 SET job = Job_Title.Salesperson
  WHERE comm IS NOT NULL;

10.1.8 ドメインのデータ型の指定

ドメイン・データ型は、Oracleデータ型のいずれかになります。修飾ドメイン名は、修飾されたユーザー定義データ型やOracle組込み型と競合しないようにする必要があります。

列がドメインに関連付けられていて、列のデータ型が指定されていない場合は、ドメインのデータ型が、関連付けられた列のデフォルトのデータ型として使用されます。関連付けられた列にすでにデータ型がある場合は、その列のデータ型が使用されます。

ドメイン・データ型がSTRICT以外として定義されている場合、関連付けられた列のデータ型はドメイン・データ型との互換性のみが必要です。つまり、データ型は同じであることが必要ですが、長さ、精度およびスケールは異なっていてもかまいません。たとえば、strict以外のドメインの場合、VARCHAR2(10)のドメインは、どのVARCHAR2列にも関連付けできます。

ドメイン・データ型がSTRICTとして定義されている場合、関連付けられた列のデータ型はドメイン・データ型と互換性があり、ドメイン・データ型の長さ、精度およびスケールも一致している必要があります。

例10-51 列とドメイン・データ型の関連付け

次の例では、year_of_birthドメインとemail_domドメインを作成し、ドメインを列に関連付けて、ドメインと列のデータ型の互換性を示します。


DROP DOMAIN IF EXISTS year_of_birth;

CREATE DOMAIN year_of_birth AS NUMBER(4)
    CONSTRAINT CHECK ( (TRUNC(year_of_birth) = year_of_birth) AND (year_of_birth >= 1900) );


DROP DOMAIN IF EXISTS email_dom;

CREATE DOMAIN email_dom AS VARCHAR2(100)
    CONSTRAINT email_chk check (REGEXP_LIKE (email_dom, '^(\S+)\@(\S+)\.(\S+)$'));

DROP TABLE IF EXISTS newcustomers PURGE;
CREATE TABLE newcustomers (
  cust_Id NUMBER,
  cust_year_of_birth NUMBER(6) DOMAIN year_of_birth,
  cust_hq_email VARCHAR2(50),
  cust_office_email VARCHAR2(100),
  cust_rep_email VARCHAR2(100));

DESC newcustomers;

出力は次のとおりです。


 Name                          Null?    Type
 ----------------------------- -------- ----------------------------
 CUST_ID                                NUMBER
 CUST_YEAR_OF_BIRTH                     NUMBER(6) SH.YEAR_OF_BIRTH
 CUST_HQ_EMAIL                          VARCHAR2(50)
 CUST_OFFICE_EMAIL                      VARCHAR2(100)
 CUST_REP_EMAIL                         VARCHAR2(200)

cust_year_of_birth列は、Oracleデータ型のNumberとして定義されていて、year_of_birthドメインにも関連付けられるため、その列のデータ型が列に割り当てられます。cust_year_of_birth列は、year_of_birthドメインで定義されているすべてのプロパティ(制約、表示、順序付けのプロパティなど)を継承します。

次の例では、year_of_birthドメインに関連付けられた列があるukcustomers表を作成しますが、その列にはデータ型がありません:

CREATE TABLE ukcustomers (
  cust_Id NUMBER,
  cust_year_of_birth DOMAIN year_of_birth);

DESC ukcustomers;

出力は次のとおりです。


 Name                           Null?    Type
 ------------------------------ -------- ----------------------------
 CUST_ID                                 NUMBER
 CUST_YEAR_OF_BIRTH                      NUMBER(4) SH.YEAR_OF_BIRTH

ここでは、cust_year_of_birth列に、ドメインのデータ型NUMBER(4)が割り当てられています。

次の例では、DOMAINキーワードが省略されています。

CREATE TABLE incustomers (
  cust_id NUMBER,
  cust_year_of_birth year_of_birth);

DESC incustomers;

出力は次のとおりです。


 Name                          Null?    Type
 ----------------------------- -------- ----------------------------
 CUST_ID                                NUMBER
 CUST_YEAR_OF_BIRTH                     NUMBER(4) SH.YEAR_OF_BIRTH

列定義句では、ドメイン句はデータ型句を置き換えるか、その直後に続ける必要があります。

ドメイン列データ型がSTRICTとして定義されていない場合は、列の長さに関係なく、同じデータ型の列にドメインを関連付けできます。

次のALTERコマンドは成功します。これは、ドメインと列のデータ型が同じで、列の長さがSTRICT以外のドメインではチェックされないためです。

ALTER TABLE newcustomers
  MODIFY cust_hq_email DOMAIN email_dom;

ALTER TABLE newcustomers
  MODIFY cust_office_email DOMAIN email_dom;

ALTER TABLE newcustomers
  MODIFY cust_rep_email DOMAIN email_dom;

ドメイン列データ型がSTRICTとして定義されている場合、ドメイン関連付けは、列とドメインのデータ型が同じで長さも一致している場合にのみ機能します。


DROP DOMAIN IF EXISTS email_dom;

CREATE DOMAIN email_dom AS VARCHAR2(100) STRICT
  CONSTRAINT email_chk check (REGEXP_LIKE (email_dom, '^(\S+)\@(\S+)\.(\S+)$'));

次のALTERコマンドは成功します。

ALTER TABLE newcustomers
  MODIFY cust_office_email DOMAIN email_dom;

次のALTERコマンドは、列長とドメイン長が一致しないために失敗します。

ALTER TABLE newcustomers
  MODIFY cust_hq_email DOMAIN email_dom;

ALTER TABLE newcustomers
  MODIFY cust_rep_email DOMAIN email_dom;

表列データ型からSTRICT以外のドメイン列データ型への互換性

次の各項目は、互換性のある型を示します。ドメイン列の型に互換性があれば、任意の表列を関連付けできます。STRICT以外のドメインでは、表列とドメイン列に異なる長さ、精度およびスケールを設定できます。
  • NUMBERNUMER(p)NUMBER(p, s)NUMERICNUMERIC(p)NUMERIC(p, s)DECIMALDECIMAL(p)DECDEC(p)INTEGERINTSMALLINTFLOATFLOAT(p)REALDOUBLE_PRECISION

  • CHAR(L)CHAR(L CHAR)CHAR(L BYTE)CHARACTER(L CHAR)CHARACTER(L BYTE)CHARACTER(L)

  • NCHAR(L)NATIONAL CHARACTER(L)NATIONAL CHAR (L)

  • VARCHAR2(L)VARCHAR2(L CHAR)VARCHAR2(L BYTE)、CHAR VARYING(L CHAR)CHAR VARYING(L BYTE)CHAR VARYING(L)、CHARACTER VARYING(L CHAR)CHARACTER VARYING(L BYTE)CHARACTER VARYING(L)

  • NVARCHAR2(L)NATIONAL CHAR VARYING (L)NATIONAL CHARACTER VARYING (L)

  • TIMESTAMPTIMESTAMP(p)

  • TIMESTAMP WITH TIME ZONETIMESTAMP(p) WITH TIME ZONE

  • TIMESTAMP WITH LOCAL TIME ZONETIMESTAMP(p) WITH LOCAL TIME ZONE

  • INTERVAL YEAR TO MONTHINTERVAL YEAR(p) TO MONTH

  • INTERVAL DAY TO SECONDINTERVAL DAY(p) TO SECONDINTERVAL DAY TO SECOND(s)INTERVAL DAY(p) TO SECOND(s)

  • ROWIDUROWIDUROWID(p)

  • RAW(p)RAW(p)

表列データ型からSTRICTドメイン列データ型への互換性

次の各項目は、互換性のある型を示します。ドメイン列の型に互換性があれば、任意の表列を関連付けできます。STRICTドメインの場合、表列とドメイン列は、長さ、精度およびスケールについて完全に一致する必要があります。

  • NUMBER(*)NUMBER

  • 表列データ型とドメイン列データ型の精度が同じ場合、NUMBER(p, 0)NUMERIC(p)NUMERIC(p, 0)DECIMAL(p)DEC(p)

  • 表列データ型とドメイン列データ型の精度とスケールが同じ場合、NUMBER(p, s)NUMERIC(p, s)DECIMAL(p, s)DEC(p, s)

  • NUMBER(*,0)NUMERIC(*)NUMERIC(*,0)DEC(*)DEC(*,0)DECIMAL(*)DECIMAL(*,0)INTEGERINTSMALLINT

  • FLOAT(63)REAL

  • FLOATFLOAT(126)DOUBLE PRECISION

  • 列データ型とドメイン列データ型のサイズ(バイト単位)が同じ場合、CHAR(L CHAR)CHAR(L BYTE)CHARACTER (L)。たとえば、1文字が4バイトの場合、CHAR (4 BYTE)CHAR(1 CHAR)STRICTドメイン列に関連付けできます。

  • 列データ型とドメイン列データ型のサイズ(バイト単位)が同じ場合、NCHAR(L)NATIONAL CHARACTER(L)NATIONAL CHAR (L)

  • 列データ型とドメイン列データ型のサイズ(バイト単位)が同じ場合、VARCHAR2(L CHAR)VARCHAR2(L BYTE)CHARACTER VARYING (L)CHAR VARYING(L)

  • 列データ型とドメイン列データ型のサイズ(バイト単位)が同じ場合、NVARCHAR2(L)NATIONAL CHAR VARYING (L)NATIONAL CHARACTER VARYING (L)

  • TIMESTAMPTIMESTAMP(6)

  • TIMESTAMP WITH TIME ZONETIMESTAMP(6) WITH TIME ZONE

  • TIMESTAMP WITH LOCAL TIME ZONETIMESTAMP(6) WITH LOCAL TIME ZONE

  • INTERVAL YEAR TO MONTHINTERVAL YEAR(2) TO MONTH

  • INTERVAL DAY TO SECONDINTERVAL DAY(2) TO SECONDINTERVAL DAY TO SECOND(6)INTERVAL DAY(2) TO SECOND(6)

  • ROWIDUROWID(10)

  • UROWIDUROWID(4000)ROWID(4000)

表列データ型からドメイン列データ型への互換性

次の列データ型は、同等のドメイン列データ型とのみ互換性があります。たとえば、DATE列型は、DATEドメイン列型にのみ関連付けできます。

  • BINARY_FLOAT

  • BINARY_DOUBLE

  • DATE

  • BLOB

  • CLOB

  • NCLOB

  • BFILE

  • LONG

  • LONG RAW

  • JSON

データ型に基づいた表列とユースケース・ドメインの関連付けのルール

ドメインのデータ型がVARCHAR2(L [CHAR|BYTE])の場合、各国語サポート(NLS)設定のセッション・レベルの長さセマンティクス値がNLS_LENGTH_SEMANTICSBYTEとして設定されているときには、Lのバイト数をLに対応する最大長(バイト単位)にします。

ドメインに列を関連付ける場合は、次のルールが適用されます:

  • ドメインがSTRICT以外として定義されている場合、そのドメインは任意のxバイトのデータ型VARCHAR2(x)の列に関連付けできます。STRICT以外のドメインの場合は、Lとxが異なっていてもかまいません。

  • ドメインがSTRICTとして定義されている場合、そのドメインは任意のxバイト = Lバイトのデータ型VARCHAR2(x)の列に関連付けできます。STRICTドメインの場合、L|x CHARを必要に応じてBYTESに変換した後でも、Lとxのバイト数は同じであることが必要です。

たとえば、ドメイン・データ型の指定がVARCHAR2 STRICTのときに、MAX_STRING_SIZESTANDARDの場合、そのドメインはL = 4000のVARCHAR2(L BYTE)データ型の列と関連付けできます。セッションの現在のNLS設定が、文字を表すために最大2バイトを必要とする場合、ドメインにはVARCHAR2(2000 CHAR)データ型の列を関連付けることができます。MAX_STRING_SEMANTICSEXTENDEDに変更されると、L = 32767のVARCHAR2(L BYTE)またはVARCHAR2(16383 CHAR)のデータ型の列をドメインに関連付けできます。

同様のルールはNVARCHAR2(L)CHAR(L [CHAR|BYTE])およびNCHAR(L)にも適用されます。

10.1.9 ユースケース・ドメインのプロパティの変更

アプリケーションの進化につれて、列定義の変更が必要になることがあり、それに伴って関連するユースケース・ドメインのプロパティの変更も必要になります。ドメインの変更時には、ドメインの注釈、表示式および順序式のみを変更できます。次に、ドメインのその他のプロパティを変更する方法を示します。

これらの例は、開始手段として利用することも、特定のデータとビジネスの要件にあわせて構築して適応させることもできます。最初の例では手動の方法を示し、その次の例ではdbms_redefinitionパッケージを使用したオンラインの方法を示します。

例10-52 ドメイン・プロパティの手動変更

電子メール・ドメイン・フィールドの文字列長を100から200に変更するとします。この変更を実施するには、次のステップを完了する必要があります。

  • 関連付けられた列の文字列長を200に変更します。

  • 列に関連付けられている現在のドメインを削除します。

  • 電子メールの文字列長が200の新しいドメインを作成します。

  • 現在のドメインに関連付けられていた列を新しいドメインに再関連付けします。

現在のドメイン定義と列の関連付けが次の場合:

CREATE DOMAIN email_dom AS VARCHAR2(100)
  CONSTRAINT email_chk CHECK (regexp_like (email_dom, '^(\S+)\@(\S+)\.(\S+)$'));

CREATE TABLE t1 (
  id NUMBER,
  email DOMAIN email_dom
);

ドメインに関連付けられている列のリストを表示するには:

SELECT table_name, column_name
  FROM user_tab_columns
  WHERE domain_name = 'EMAIL_DOM';

TABLE_NAME              COLUMN_NAME
---------------------- -------------------
T1                      EMAIL

t1表を変更して、電子メール列の文字列サイズを200に変更します。

ALTER TABLE t1 modify email varchar2(200);

FORCE PRESERVEオプションを指定してドメインを削除します:

DROP DOMAIN email_dom FORCE PRESERVE;

その後で、電子メールの文字列サイズが200の新しいドメインを作成します。

CREATE DOMAIN email_dom AS VARCHAR2(200)
  CONSTRAINT email_chk CHECK (regexp_like (email_dom, '^(\S+)\@(\S+)\.(\S+)$'));

さらに、新しいドメインを電子メール列に再関連付けします:

ALTER TABLE t1
  MODIFY email DOMAIN email_dom;

例10-53 オンラインのdbms_redefinitionパッケージを使用したドメイン・プロパティの変更

Oracleオンライン表再編成パッケージのdbms_redefinitionを使用すると、サポートされている通貨の更新などの許可された値を変更できます。たとえば、通貨ドメインでサポートされている通貨を変更するために必要なステップは次のとおりです:

  • 新しいドメインの作成

  • 新しいドメインを使用するように、現在のドメインに関連付けられていた列を移行します。

次の例には、基本的なエラー処理のみが含まれています。新しい制約に一部のデータが違反している場合など、複数の表の移行後にエラーが発生することがあります。完全なソリューションでは、このようなシナリオを考慮する必要があります。

次のコードでは、USD、GBPおよびEURの通貨を許容する制約があるドメインを作成します。

CREATE DOMAIN currency AS (
  amount AS NUMBER,
  iso_currency_code AS CHAR ( 3 CHAR )
 ) CONSTRAINT supported_currencies_c 
    CHECK ( iso_currency_code in ( 'USD', 'GBP', 'EUR' ) );

次の表には、currencyドメインに関連付けられた列があるとします。

CREATE TABLE order_items (
  order_id   INTEGER, product_id INTEGER,
  total_paid NUMBER(10, 2), currency_code CHAR ( 3 CHAR ),
  DOMAIN currency ( total_paid, currency_code ),
  PRIMARY KEY ( order_id, product_id )
);
        
CREATE TABLE product_prices (
  product_id    INTEGER,
  unit_price    NUMBER(10, 2), 
  currency_code CHAR( 3 char ),
  DOMAIN currency ( unit_price, currency_code ),
  PRIMARY KEY ( product_id, currency_code )
);

INSERTコマンドを使用して、product_prices表とorder_items表に、いくつかの値を格納します。

INSERT INTO product_prices
VALUES (1, 9.99, 'USD'),
       (1, 8.99, 'GBP'),
       (1, 8.99, 'EUR');
 
INSERT INTO order_items
VALUES (1, 1, 9.99, 'USD'),
       (2, 1, 8.99, 'GBP'),
       (3, 1, 8.99, 'EUR');
        
COMMIT;

ビジネスが拡大していて、さらに多くの通貨のサポートが必要になったとします。制約の直接的な変更はできないため、次のような代替方法が必要です。

  • 新しいドメインの作成。

  • 制約を保持しながら関連付けられている列から既存のドメインを削除するための、product_prices表とorder_items表の変更。

  • 新しいドメインを追加するための表の変更。

  • 表からの保持した制約の削除。

ただし、これらはオンラインで実行すると、DDL文をブロックします。そのかわりに、dbms_redefinitionパッケージを使用すると、オンラインで制約を変更できます。

新しくサポートされた通貨が含まれている制約によって新規ドメインを作成し、そのドメインを一時表に関連付ける必要があります。新しいドメインで元のドメインを置き換えます。


CREATE DOMAIN currency_d as (
  amount            AS NUMBER,
  iso_currency_code AS CHAR ( 3 CHAR )
 ) CONSTRAINT supported_currencies_d_c 
  CHECK ( iso_currency_code in ( 'USD', 'GBP', 'EUR', 'CAD', 'MXP', 'INR', 'JPY' ) );
   
CREATE TABLE order_items_tmp (
  order_id   INTEGER, product_id INTEGER,
  total_paid NUMBER(10, 2), currency_code CHAR ( 3 CHAR ),
  DOMAIN currency_d ( total_paid, currency_code ) ,
  PRIMARY KEY ( order_id, product_id )
);
        
CREATE TABLE product_prices_tmp (
  product_id    INTEGER,
  unit_price    NUMBER(10, 2), 
  currency_code CHAR (3 CHAR),
  DOMAIN currency_d ( unit_price, currency_code ),
  PRIMARY KEY ( product_id, currency_code )
);

このコードの再利用性を高めるために、redefine_tableプロシージャを作成します。このプロシージャでは、dbms_redefinitionプロシージャをコールすることで、一時表の列のプロパティを現在の表列にコピーして、現在の表列を新しいドメインにスワップします。

 
DECLARE
   
  PROCEDURE redefine_table ( current_table VARCHAR2, staging_table VARCHAR2 ) AS
    num_errors pls_integer;
  BEGIN
    DBMS_REDEFINITION.CAN_REDEF_TABLE(user, current_table);    
    DBMS_REDEFINITION.START_REDEF_TABLE(user, current_table, staging_table);
   
    DBMS_REDEFINITION.copy_table_dependents(
      uname               => user,
      orig_table          => current_table,
      int_table           => staging_table,
      copy_constraints    => false,
      num_errors          => num_errors);
     
    IF num_errors > 0 THEN
      dbms_redefinition.abort_redef_table(user, current_table, staging_table);
      raise_application_error ( -20001, num_errors || ' errors copying dependents from ' || current_table || ' to ' || staging_table );
    ELSE 
      dbms_redefinition.finish_redef_table(user, current_table, staging_table);
    END IF;
  END redefine_table;
 
BEGIN 
   
  FOR tabs IN ( 
    SELECT distinct table_name from user_tab_cols
    WHERE  domain_name = 'CURRENCY'
  ) LOOP
    redefine_table(tabs.table_name, tabs.table_name || '_TMP');
  END LOOP;
 
END;
/

product_prices表にDMLを使用して、新しい通貨が現在サポートされているかどうかを確認します。

-- New currencies now supported
INSERT INTO product_prices
  VALUES (1, 9.99, 'CAD');
 
-- Invalid currencies raise exception
INSERT INTO product_prices
  VALUES (1, 9.99, 'N/A');
 
SELECT * FROM product_prices;

出力は次のとおりです。

PRODUCT_ID UNIT_PRICE CUR
---------- ---------- ---
         1       9.99 USD
         1       8.99 GBP
         1       8.99 EUR
         1       9.99 CAD
 

一時オブジェクトと古いドメインcurrencyをクリーン・アップします。

DROP TABLE order_items_tmp PURGE;
DROP TABLE product_prices_tmp PURGE;
DROP DOMAIN currency;

関連項目:

『PL/SQLパッケージおよびタイプ・リファレンス』ガイドの「DBMS_REDEFINITION

10.1.10 ユースケース・ドメイン用のSQL関数

ドメイン関数を使用すると、より効率的にユースケース・ドメインを操作できます。

ユースケース・ドメインには、次のSQL関数を使用できます:

  • DOMAIN_DISPLAYは、引数が関連付けられているドメインのドメイン表示式を返します。

  • DOMAIN_NAMEは、引数が関連付けられているドメインの修飾ドメイン名を返します。ドメインに対するパブリック・シノニムがある場合は、そのシノニムが返されます。それ以外の場合は、domain_owner.domain_nameの形式でドメイン名が返されます。

  • DOMAIN_ORDERは、引数が関連付けられているドメインのドメイン順序式を返します。

  • DOMAIN_CHECK(domain_name, value1, value2, ...)は、domain_nameの制約条件(NOT NULLまたはCHECK制約)をvalue式に適用します。さらに、値の型互換性もチェックします。値は多数になる可能性があります。値式の数はドメイン内の列の数と一致する必要があります。一致していないと文でエラーが発生します。

  • DOMAIN_CHECK_TYPE(domain_name, value1, value2, ...)では、入力式がドメインのデータ型と互換性があるかどうかを検証します。値は多数になる可能性があります。値式の数はドメイン内の列の数と一致する必要があります。一致していないと文でエラーが発生します。

関連項目:

ユースケース・ドメインでのSQL関数の使用の詳細は、『Oracle Database SQL言語リファレンス』ドメイン関数を参照してください

10.1.11 ドメイン情報の表示

ディクショナリ・ビューを使用すると、ドメインに関する情報を取得できます。ディクショナリ・ビューは、関連付けられたドメインと比較したときに、制約やデフォルト式などのプロパティが異なる列の識別にも役立ちます。

10.1.11.1 ユースケース・ドメインのディクショナリ・ビュー

ディクショナリ・ビューの[USER|DBA|ALL]_DOMAINS[USER|DBA|ALL]_DOMAIN_COLSはドメインを表し、ドメイン列に関する次の情報を提供します。フレキシブル・ドメインの場合は、ドメイン・セレクタ式もビューに含まれます。

  • ドメイン名

  • ドメイン所有者

  • 表示式と順序式

  • デフォルト値

  • ドメインのデータ型

  • 照合

ユースケース・ドメインには、次のディクショナリ・ビューを使用できます:

  • ALL_DOMAINSは、現行のユーザーがアクセスできるドメインを示します。

  • DBA_DOMAINSは、データベース内のすべてのドメインを示します。

  • USER_DOMAINSは、現行のユーザーが所有するドメインを示します。

  • ALL_DOMAIN_COLSは、現行のユーザーがアクセスできるドメインの列を示します。

  • DBA_DOMAIN_COLSは、データベース内のすべてのドメインの列を示します。

  • USER_DOMAIN_COLSは、現行のユーザーが所有するドメインの列を示します。

  • ALL_DOMAIN_CONSTRAINTSは、現行のユーザーがアクセスできるドメインの制約定義を示します。

  • DBA_DOMAIN_CONSTRAINTSは、データベース内のすべてのドメインの制約定義を示します。

  • USER_DOMAIN_CONSTRAINTSは、現行のユーザーが所有するドメインの制約定義を示します。

関連項目:

ユースケース・ドメインに使用されるビューの詳細は、『Oracle Databaseリファレンス』のビューALL_DOMAINSDBA_DOMAINSUSER_DOMAINSALL_DOMAIN_COLSDBA_DOMAIN_COLSUSER_DOMAIN_COLSALL_DOMAIN_CONSTRAINTSDBA_DOMAIN_CONSTRAINTSUSER_DOMAIN_CONSTRAINTSを参照してください

10.1.12 組込みのユースケース・ドメイン

Oracle Databaseには、表列に直接使用できる組込みのユースケース・ドメイン(email_dssn_dcredit_card_number_dなど)が用意されています。組込みのユースケース・ドメインは、すべてのPDBに存在しています。新しいPDBがCDBに追加されると、組込みのユースケース・ドメインが自動的に作成されてPDBに追加されます。

Oracle Databaseでは、次の組込みドメインがサポートされています。これらは、次のように分類されます:

  • 識別子の組込みドメイン

  • 技術の組込みドメイン

  • 数値の組込みドメイン

  • その他の組込みドメイン

表10-1 識別子の組込みドメイン

# ドメイン名 説明: データ型 注釈 制約 ドメイン順序 ドメイン表示

1

city_d

都市部または自治体

"San Francisco", "Mumbai", "Tokyo"

VARCHAR2(100)

address

-

-

-

2

country_code_d

各国または地域に割り当てられた、標準化された2文字または3文字のコード。通常はISO 3166などの国際規格によって定義されます。

"USA", "IND", "AUS"

VARCHAR2(3)

address

-

-

-

3

country_d

自国の政府、法律、国際的承認を特徴とする、独立した国家として認識される明確な領土と主権団体。

"USA", "India", "Mexico"

VARCHAR2(100)

address

-

-

-

4

credit_card_number_d

識別およびトランザクションのためにクレジット・カードに割り当てられた一意の連続する数。

"12345678901234" "123456789012345" "1234567890123456" "12345678901234567" "123456789012345678" "1234567890123456789"

VARCHAR2(20)

-

REGEX - ^[0-9]{12,19}$

-

WHEN length(credit_card_number_d)=15
      THEN SUBSTR(credit_card_number_d,1,4) || ' ' ||
           SUBSTR(credit_card_number_d,5,6) || ' ' ||
           SUBSTR(credit_card_number_d,11,5)
WHEN length(credit_card_number_d)=16
      THEN SUBSTR(credit_card_number_d,1,4) || ' ' ||
           SUBSTR(credit_card_number_d,5,4) || ' ' ||
           SUBSTR(credit_card_number_d,9,4) || ' ' ||
           SUBSTR(credit_card_number_d,13,4)
WHEN length(credit_card_number_d)=14
      THEN SUBSTR(credit_card_number_d,1,4) || ' ' ||
           SUBSTR(credit_card_number_d,5,6) || ' ' ||
           SUBSTR(credit_card_number_d,11,4)

5

date_of_birth_d

生年月日を表す、個人が生まれた特定の日、月および年。身分証明、年齢確認、記録保持に使用される個人情報の基本的な部分です。表示される形式は、セッションで使用される日付形式によって異なります。

01-JAN-91, 02/28/2023, 2023/54

DATE

person_info

-

-

-

6

district_d

市区町村または国内で定義されたエリアまたはリージョン。ほとんどの場合、個別の行政、ソーシャルまたは地理の単位で特徴付けられます。

"Manhattan", "Brooklyn"

VARCHAR2(100)

address

-

-

-

7

floor_d

特定のユニットまたは住居がある建物内の階数。通常はその住所に示されます。

"1", "1A", "Ground", "First"

VARCHAR2(20)

address

-

-

-

8

house_number_d

番地または地域内の建物または住居に割り当てられた数値識別子。通常は郵便の住所およびナビゲーションのために使用されます。

"1-A", "10", "C1-H123"

VARCHAR2(50)

address

-

-

-

9

license_plate_d

車両のライセンス・プレートに表示される文字、数字または記号の一意の組合せで、その車両の一意の識別子として機能します。

"ABC123", "1234 XYZ", "DEF-456", "789 GHI", "JKL 987", "MNO-654", "PQR1234", "STU 5678", "VWX-9012", "YZA 3456"

VARCHAR2(100)

person_info

-

-

-

10

marital_status_d

個人の婚姻に関する法律上の関係ステータスを示す人口統計属性。一般的なカテゴリとしては、「未婚」、「既婚」、「離婚」、「死別」、「別居」などがあります。

"single", "married", "widowed"

VARCHAR2(50)

person_info

-

-

-

11

national_id_d

政府が市民または居住者に対して身分証明および管理のために発行する一意の識別子。国民IDは、行政サービスへのアクセスや身元確認、および投票、出張、金融活動などのトランザクションの円滑化に使用されます。

"123-45-6789", "AB123456C", "1234 5678 9012", "123.456.789-01"

VARCHAR2(50)

person_info

-

-

-

12

passport_d

保有者の身元と国籍を証明する政府発行の旅行証明書であり、国際的な移動を許可します。

"AB123456", "123456789", "ABC123456", "E1234567", "AB1234567", "123456789AB"

VARCHAR2(100)

person_info

-

-

-

13

payment_card_id_d

クレジット・カード、デビット・カード、プリペイド・カードなど、支払カードに関連付けられた一意の識別子。この識別子は、金融機関のシステム内で各カードを区別するものであり、トランザクションの承認、処理および追跡に使用されます。

"4012 8888 8888 1881","6011 1111 1111 1117","3714 4963 5398 431","5555 5555 5555 4444","5105 1051 0510 5100"

VARCHAR2(200)

person_info, payment_info

-

-

-

14

phone_d

個人が音声コールまたはテキスト・メッセージを介して接続できるようにする、通信に使用される数値シーケンス。

"1-555-555-5555", "44-20-1234-5678", "61-2-1234-5678", "49-30-12345678"

VARCHAR2(20)

person_info

-

-

-

15

phone_number_d

個人が音声コールまたはテキスト・メッセージを介して接続できるようにする、通信に使用される数値シーケンス。

"+1234567890123456" "123456789012345" "+987654321098765" "987654321098765" "+123" "123"

VARCHAR2(17)

-

REGEX - ^[+]{0,1}[0-9]{1,16}$

-

-

16

postal_code_d

郵便の配達や仕分けで特定の地域を識別するため、郵便業務で使用される数値または英数字のコード。

"SW1A 1AA", "M5H 2N2", "2000", "10117", "75001", "100-0001", "22010-000", "100000", "110001", "2000"

VARCHAR2(20)

address

-

-

-

17

province_d

国内の行政区画であり、通常は、特に道州制または分権制における独自の政府当局および行政当局があります。

"Alberta", "Ontario"

VARCHAR2(100)

address

-

-

-

18

social_media_id_d

特定のソーシャル・メディア・プラットフォーム上の個人またはエンティティのアカウントに関連付けられた一意の識別子。これは、プラットフォームのシステム内で個別のラベルまたは参照ポイントとして機能し、特定のユーザーまたはプロファイルでの識別および対話を可能にします。

このドメインは通常、ソーシャル・メディア・プラットフォームを表すsocial_media_type_dドメインとともに使用されます。

"user123", "nyname@email.com", "myaccount11", "203"

VARCHAR2(100)

person_info

-

-

-

19

social_media_type_d

Facebook、Twitter、Instagram、LinkedInなどのソーシャル・メディア・プラットフォームの分類またはカテゴリを指します。

このドメインは通常、ソーシャル・メディア・プラットフォームのユーザーIDを表すsocial_media_id_dドメインとともに使用されます。

"facebook", "x", "instagram"

VARCHAR2(100)

-

-

-

-

20

ssn_d

社会保障局によって米国内の個人に割り当てられた一意の9桁の識別子。

"123-45-6789", "987-65-4321", "456-78-9012", "876-54-3210", "234-56-7890"

VARCHAR2(11)

-

REGEX - ^[0-9]{3}[-][0-9]{2}[-][0-9]{4}$

-

-

21

state_d

国内の行政および管理区画であり、多くの場合、独自の政府と法制度があります。

"California", "Texas"

VARCHAR2(100)

address

-

-

-

22

street_d

建物または住居があり、住所の一部を形成する道路または主要道路の名称。

"4th Main Road", "Purple Street 104"

VARCHAR2(200)

address

-

-

-

23

us_license_plate_d

米国の車両のライセンス・プレートに表示される一意の英数字の組合せで、その車両固有の識別子として機能します。

"ABC-XY-1234", "DEF-GH-567", "JKL-MN-890", "OPQ-RS-4567", "TUV-WX-8901"

VARCHAR2(20)

person_info

REGEX - ^[A-Za-z]{1,3}-[A-Za-z]{1,2}-[0-9]{1,4}$

-

-

24

us_passport_d

国外旅行のために米国政府が市民に発行する旅行証明書。

"ABC123456", "XYZ789012", "DEF456789", "GHI012345", "12345678"

VARCHAR2(100)

person_info

-

-

-

25

us_phone_d

米国における通信に使用される数値の桁。

"123-456-7890", "1234567890", "(123) 456-7890", "(123)456-7890", "123.456.7890", "1234567890"

VARCHAR2(20)

person_info

REGEX - ^\D?(\d{3})\D?\D?(\d{3})\D?(\d{4})$

-

-

26

us_postal_code_d

米国の郵便番号。通常はZipコードを指します。

"10001-1234", "90210-5678", "60601-9876", "02110-5432", "33109-8765"

VARCHAR2(20)

address

REGEX - ^\d{5}([ \-]\d{4})?$

-

-

27

us_ssn_d

社会保障局によって米国内の個人に割り当てられた一意の9桁の識別子。

"123-45-6789", "123456789"

VARCHAR2(15)

person_info

-

-

-

28

us_state_d

米国内の行政区域。

"CA", "NY", "TX", "FL", "WA", "OH", "PA", "IL", "GA", "MI", "VA", "NC", "NJ", "MD", "AZ", "CO", "MA", "TN", "IN", "MO"

VARCHAR2(2)

address

REGEX - ^(AE|AL|AK|AP|AS|AZ|AR|CA|CO|CT|DE|DC| FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD| MA|MI|MN|MS|MO|MP|MT|NE|NV|NH|NJ|NM|NY|NC|ND| OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY)$

-

-

29

us_vehicle_id_d

米国で車両に割り当てられた一意の識別子で、通常は車両識別番号(VIN)と呼ばれます。

"1G1JC1441Y7167030", "5XYZ1234567890123", "WBAFA53541LM82357", "2G1WG5EK5B1160036", "3N1AB7AP2JY320999"

VARCHAR2(20)

person_info

REGEX - ^[A-HJ-NPR-Z0-9]{17}$

-

-

30

us_zip_d

米国郵政公社(USPS)が郵送および仕分けを容易にするための英数字コード。

"10001-1234", "90210-5678", "60601-9876", "02110-5432", "33109-8765"

VARCHAR2(15)

address

REGEX - ^\d{5}(-\d{4})?$

-

-

31

vehicle_id_d

車両に割り当てられた一意の識別子。通常、政府当局および輸送機関による登録、追跡および識別に使用されます。

"UK11AP999"

VARCHAR2(100)

person_info

-

-

-

32

zip_d

特定の地域への郵便の効率的なルーティングのために郵便業務で使用される郵便番号。

"SW1A 1AA", "M5H 2N2", "2000", "10117", "75001", "100-0001", "22010-000", "100000", "110001", "2000"

VARCHAR2(20)

address

-

-

-

表10-2 技術の組込みドメイン

# ドメイン名 説明: データ型 注釈 制約 ドメイン順序 ドメイン表示

1

cidr_d

CIDR: クラスレス・ドメイン間ルーティングの略で、IPネットワークのサイズ指定に使用されます。

"192.168.1.0/24", "10.0.0.0/8"

VARCHAR2(18)

tech_info

REGEX - ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\/([1-9]|[1-2][0-9]|3[0-2])$

-

-

2

created_on_d

ファイル、レコードまたはエンティティが作成された日時。

'1960-01-01 23:03:20'

TIMESTAMP

tech_info, timestamp

-

-

-

3

description_d

何かの詳細または特性を提供するテキスト情報。

"Vintage red bicycle", "Cozy wooden cabin", "Sparkling crystal chandelier", "Rustic farmhouse kitchen", "Gentle ocean breeze"

VARCHAR2(4000)

-

-

-

-

4

email_d

デジタル通信に使用される電子メール・アドレス。

"example@example.com", "user123@gmail.com"

VARCHAR2(4000)

person_info

REGEX - ^([a-zA-Z0-9!#$%&*+=?^_`{|}~-]+(\.[A-Za-z0-9!#$%&*+=?^_`{|}~-]+)*)@(([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)$

-

-

5

encryption_function_d

セキュアな送信または格納のためにデータのエンコードに使用されるアルゴリズム。

"AES", "DES", "RSA", "Blowfish", "Twofish", "RC4"

VARCHAR2(1000)

tech_info, encryption

-

-

-

6

encryption_value_d

その意味を隠すため、暗号化アルゴリズムを使用して変換されたデータ。

通常、このドメインは、使用された暗号化関数を表すencryption_function_dドメインとともに使用されます。

"5d41402abc4b2a76b9719d911017c592"

VARCHAR2(1000)

tech_info, encryption

-

-

-

7

file_extension_d

コンピュータ・ファイルの形式または使用方法を示すため、その名前に追加されたサフィックス。

.txt", ".jpg", ".pdf", ".mp3"

VARCHAR2(10)

tech_info

-

-

-

8

file_size_d

任意の単位で測定されるコンピュータファイル内のデータの大きさ。ただし通常はバイト単位で測定されます。

100, 500, 1000, 2000, 5000

NUMBER

tech_info

CHECK >=0

-

-

9

hash_function_d

任意のサイズのデータを固定サイズ値にマップするために使用されるアルゴリズム。

"MD5", "SHA-1", "SHA-256", "SHA-512", "CRC32"

VARCHAR2(1000)

tech_info, hash

-

-

-

10

hash_value_d

データ・セットにハッシュ関数を適用した結果。通常はデータ整合性検証に使用されます。

通常、このドメインは、使用されたハッシュ関数を表すhash_function_dドメインとともに使用されます。

"5d41402abc4b2a76b9719d911017c592"

VARCHAR2(1000)

tech_info, hash

-

-

-

11

hostname_d

ネットワーク内のデバイスに割り当てられた一意のラベル。

"example.com" "subdomain.example.com" "mail.example.com" "123example456.com"

VARCHAR2(255)

tech_info

REGEX - ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$

-

-

12

id_number_d

個人、エンティティまたはオブジェクトに割り当てられた一意の識別子。同等のドメイン: 識別子が数値でない場合は、id_string_dを使用できます。

9876543210, 2468135790, 1357924680, 5555555555

NUMBER

-

-

-

-

13

id_string_d

エンティティを一意に識別するために使用される文字の順序。同等のドメイン: 識別子が数値の場合は、id_number_dを使用できます。

"abc123DEF456"

VARCHAR2(4000)

-

-

-

-

14

ip_address_d

コンピュータ・ネットワークに参加しているデバイスに割り当てられた一意の数値ラベル。

"172.16.0.1", "255.255.255.0", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"

VARCHAR2(46)

tech_info

REGEX - ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$または^([0-9a-fA-F]{4}[:]){7}[0-9a-fA-F]{4}$または^([0-9a-fA-F]{4}[:]){6}(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

-

-

15

ipv4_address_d

インターネット・プロトコル・バージョン4を使用して、コンピュータ・ネットワークに参加しているデバイスに割り当てられた数値ラベル。

"192.168.0.1", "10.0.0.1", "172.16.0.1", "255.255.255.0", "127.0.0.1", "8.8.8.8", "172.31.255.255", "198.51.100.1"

VARCHAR2(15)

tech_info

REGEX - ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

-

-

16

ipv6_address_d

インターネット・プロトコル・バージョン6を使用して、コンピュータ・ネットワークに参加しているデバイスに割り当てられた数値ラベル。

"2001:0db8:85a3:0000:0000:8a2e:0370:7334"

VARCHAR2(46)

tech_info

REGEX - ^([0-9a-fA-F]{4}[:]){7}[0-9a-fA-F]{4}$ or ^([0-9a-fA-F]{4}[:]){6}(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

-

-

17

last_modified_on_d

ファイルまたはリソースが最後に変更された日時。

'1960-01-01 23:03:20'

TIMESTAMP

tech_info, timestamp

-

-

-

18

last_opened_on_d

データまたは情報が最後にアクセスされた日時。

'1960-01-01 23:03:20'

TIMESTAMP

tech_info, timestamp

-

-

-

19

last_updated_on_d

ファイルまたはリソースが最後にオープンされた日時。

'1960-01-01 23:03:20'

TIMESTAMP

tech_info, timestamp

-

-

-

20

mac_address_d

ネットワーク内の通信用ネットワーク・インタフェース・コントローラに割り当てられた一意の識別子。

"00-1A-2B-3C-4D", "FF-A1-B2-C3-D4", "ab-cd-ef-12-34"

"00:1A:2B:3C:4D", "FF:A1:B2:C3:D4", "ab:cd:ef:12:34"

"001A.2B3C.4D5E", "FFA1.B2C3.D4E5", "abcd.ef12.3456"

VARCHAR2(17)

tech_info

REGEX - ^([a-fA-F0-9]{2}[-]){5}[a-fA-F0-9]{2}$または^([a-fA-F0-9]{2}[:]){5}[a-fA-F0-9]{2}$または^([a-fA-F0-9]{4}[.]){2}[a-fA-F0-9]{4}$

-

-

21

mime_type_d

インターネット・メッセージで送信されるデータ型の識別子。

"text/plain", "application/json", "image/jpeg", "application/pdf", "audio/mpeg", "video/mp4", "application/xml", "application/octet-stream", "application/vnd.ms-excel", "text/html"

VARCHAR2(100)

tech_info

-

-

-

22

sha1_d

暗号ハッシュ関数

"2fd4e1c67a2d28fced849ee1bb76e7391b93eb12"

CHAR(40)

tech_info, hash

REGEX - ^[0-9a-fA-F]{40}$

-

-

23

sha256_d

暗号ハッシュ関数

"5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9"

CHAR(64)

tech_info, hash

REGEX - ^[0-9a-fA-F]{64}$

-

-

24

sha512_d

暗号ハッシュ関数

"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d3 6ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327"

CHAR(128)

tech_info, hash

REGEX - ^[0-9a-fA-F]{128}$

-

-

25

short_name_d

長い名前またはタイトルの省略形式または切り捨て形式。

"Ben", "Amy", "Max", "Mia", "Sam", "Zoe", "Leo", "Ava", "Eli", "Liv"

VARCHAR2(500)

-

-

-

-

26

subnet_mask_d

ネットワークおよびホスト部分を定義するためにIPアドレスと組み合せて使用する数値。

"255.255.255.0", "255.255.0.0", "255.255.255.128", "255.0.0.0", "255.255.255.252"

VARCHAR2(15)

tech_info

REGEX - ^(((255\.){3}(255|254|252|248|240|224|192|128|0))| ((255\.){2}(255|254|252|248|240|224|192|128|0)\.0)|((255\.) (255|254|252|248|240|224|192|128|0)(\.0+){2})|((255|254|252|248|240|224|192|128|0)(\.0){3}))$

-

-

27

uri_d

リソースの識別に使用される文字列、Uniform Resource Identifier。

"https://www.example.com", "ftp://ftp.example.org", "mailto:user@example.net", "tel:+1234567890", "file:///path/to/file.txt"

VARCHAR2(4000)

tech_info

-

-

-

28

uuid4_d

ランダムに生成された識別子である汎用一意識別子(UUID)バージョン4。

"550e8400-e29b-41d4-a716-446655440000", "123e4567-e89b-12d3-a456-426655440000", "a0a0a0a0-b0b0-cccc-1234-567890abcdef"

CHAR(36)

tech_info

REGEX - ^[0-9a-fA-F]{8}([-][0-9a-fA-F]{4}){3}[-][0-9a-fA-F]{12}$

-

-

29

website_d

World Wide Webを介してアクセス可能な関連Webページのコレクション。

"www.example.com", "blog.example.org", "shop.example.net", "www.google.com", "www.facebook.com", "www.twitter.com", "www.github.com", "www.wikipedia.org", "www.nytimes.com", "www.amazon.com"

VARCHAR2(4000))

tech_info

-

-

-

表10-3 数値の組込みドメイン

# ドメイン名 説明: データ型 注釈 制約 ドメイン順序 ドメイン表示

1

count_d

セットまたはグループ内のアイテム、オカレンスまたはエンティティの数値集計または合計数量を表します。存在する要素の数を表し、何かの豊富さ、頻度、または範囲を定量化および追跡するために使用されます。

5, 12, 100, 1000

NUMBER

-

-

-

-

2

counter_d

一定期間にのみ増加する累積値を表すメトリック・タイプ。カウンタは通常、受信したHTTPリクエストの数や転送された合計バイト数など、イベントまたはオカレンスの合計数を測定するために使用されます。

1000, 50000, 8, 128, 56.4,

NUMBER

prometheus

-

-

-

3

duration_d

開始点からエンドポイントまで、何かが継続または存在している時間を測定した長さ。期間は、2つのイベント間または特定の期間内の経過時間を定量化し、時間、間隔または期間の尺度を提供します。

100, 1000, 250, 5000

NUMBER

-

-

-

-

4

gauge_d

時間の経過とともに増加または減少する可能性がある単一の数値を表し、CPU使用率、メモリー消費量、ネットワーク・トラフィックなどの様々なメトリックを監視できます。

1000, 50000, 8, 128, -22.78

NUMBER

prometheus

-

-

-

5

histogram_count_d

ヒストグラムに関連付けられたメトリック。特定の時間ウィンドウの中で、ヒストグラムのバケット内に記録された観測またはイベントの合計数を表します。この数は、観測されたメトリックが各バケット範囲内に何回あるかを示し、複数の値範囲における発生の分布を把握することができます。

このドメインは通常、histogram_sum_dhistogram_name_dおよびhistogram_upper_inclusive_bound_dドメインとともに使用されます。

10, 100, 45, 123

NUMBER

prometheus, histogram

-

-

-

6

histogram_name_d

指定された値の範囲にわたる観測またはイベントの分布を測定するためのメトリック・タイプ。各ヒストグラムには、メトリック・データの参照および問合せに使用される一意の識別子である名前があります。

このドメインは通常、histogram_sum_dhistogram_count_dおよびhistogram_upper_inclusive_bound_dドメインとともに使用されます。

"data_sent", "data_received", "request_timed_out"

VARCHAR2(1000)

prometheus, histogram

-

-

-

7

histogram_sum_d

ヒストグラムに関連付けられたメトリック。特定の時間ウィンドウにおけるヒストグラムのバケット内のすべての観測値の合計を表します。この合計は、HTTPリクエストの合計期間や特定の期間内のリソース消費の合計量など、観測されたメトリックの累積値合計に関するインサイトを提供できます。

このドメインは通常、histogram_name_dhistogram_count_dおよびhistogram_upper_inclusive_bound_dドメインとともに使用されます。

10, 100, 45, 123

NUMBER

prometheus, histogram

-

-

-

8

histogram_upper_inclusive_bound_d

バケット範囲の上限。この範囲内の値は、そのバケットに含まれるとみなされます。この境界は、バケットに含めることができる最大値を示します。たとえば、バケットの上限が100の場合、そのバケット内には100までの値がカウントされます。

このドメインは通常、histogram_sum_dhistogram_count_dおよびhistogram_name_d domainsドメインとともに使用されます。

100, 500, 10, -20

NUMBER

prometheus, histogram

-

-

-

9

histogram_upper_inclusive_bound_string_d

バケット範囲の上限を含む境界のテキスト表現。この文字列は通常、バケットに含めることができる最大値を示します。たとえば、バケット上限の文字列が100の場合、そのバケット内には100までの値がカウントされます。

"100", "500", "10", "-20"

VARCHAR2(1000)

prometheus, histogram

-

-

-

10

mean_d

すべての値を合計し、カウント合計で除算して計算される、数値セットの平均値。

10, -2345, 4.67, 0

NUMBER

statistics

-

-

-

11

median_d

ソートされた数値リストの中間値。上半分と下半分を区切ります。

54, 20, 10, 1.45, -123

NUMBER

statistics

-

-

-

12

mode_d

データセットで最も頻繁に出現する値。

4, 234, 100, -100, 0

NUMBER

statistics

-

-

-

13

negative_number_d

ゼロより小さい数値を示します。数値行のゼロのマークを下回る数量または値を表します。

-1, -123, -1.456

NUMBER

-

CHECK <0

-

-

14

non_negative_number_d

ゼロ以上の数値を示します。ゼロとすべての正の数値が含まれます。

1, 123, 1.456, 0

NUMBER

-

CHECK >=0

-

-

15

non_positive_number_d

ゼロ以下の数値を示します。ゼロと負の両方の数値が含まれます。

-1, -123, -1.456, 0

NUMBER

-

CHECK <=0

-

-

16

non_zero_number_d

ゼロと等しくない数値を示します。ゼロを除く正の数と負の数の両方が含まれます

-1, -123, -1.456, 1, 123, 1.456

NUMBER

-

CHECK >0または<0

-

-

17

percent_change_d

パーセントとして表される2つの値の相対的な差異を計算する尺度で、通常は一定期間における変化を表します。100からの比率を表します。

5, -5, 10, -10, -66.4

NUMBER

-

-

-

-

18

percent_d

100の小数で表される、全体の一部または小数を示す測定単位。これは100からの比率を表し、通常は相対数量、レート、または増加率、減少率、分布率などの比較を示すために使用されます。パーセントはマイナスにできます。

100, 98, 0.50, 75, -300

NUMBER

-

-

-

-

19

percentile_d

指定した値以下の分布におけるデータ・ポイントの割合を示す統計の尺度。

0, 10, 50 , 99, 33.33

NUMBER

-

CHECK >=0

-

-

20

positive_number_d

0より大きい数値を示します。これは、数値行のゼロのマークを上回る数量、測定または値を表します。

1, 123, 1.456

NUMBER

-

CHECK >0

-

-

21

ratio_d

2つの数量の大きさの比較であり、通常は一方をもう一方で割った商で表されます。

0.5, 0.33, 1.5, 1

NUMBER

-

-

-

-

22

standard_deviation_d

一連のデータにおける変動または分散の量の尺度。

0, 1, 10, 34, 56.56

NUMBER

statistics

CHECK >= 0

-

-

23

unit_count_d

特定の品目またはエンティティの個々の単位での数を表す数量または集計。存在する単位での数量を示し、セットまたはグループ内の品目の豊富さまたは数量の測定に使用されます。

このドメインは通常、IDと単位当たりの価格(任意の通貨での金額)を表すunit_id_dおよびunit_price_dとともに使用されます。

5, 10, 1, 0, 1000

NUMBER

unit

-

-

-

24

unit_id_d

製品、品目またはエンティティの特定の単位に割り当てられた一意の識別子またはコード。1つの単位を別の単位と区別し、追跡、在庫管理および参照目的に使用されます。

このドメインは通常、単位のカウントと価格(任意の通貨での金額)を表すunit_count_dおよびunit_price_dとともに使用されます。

50061, 50062, 123, 100001

NUMBER

unit

-

-

-

25

unit_price_d

製品、品目またはエンティティの単一の単位に関連付けられた金額またはコスト。単位ごとに請求済または支払済の価格を表し、販売または購入の単位から生成された原価または収益の合計を計算するために使用されます。

このドメインは通常、単位のカウントとIDを表すunit_count_dおよびunit_id_dとともに使用されます。

1, 15, 3.99, 500.67

NUMBER

unit

-

-

-

26

variance_d

一連のデータ・ポイントにおける平均の分散の尺度。

0, 1, 10, 34, 56.56

NUMBER

statistics

CHECK >= 0

-

-

表10-4 その他の組込みドメイン

# ドメイン名 説明: データ型 注釈 制約 ドメイン順序 ドメイン表示

1

binary_d

2つの記号(通常は0と1)のみを使用した数値を表すBase-2記数法。各桁は2の累乗を表します。たとえば、2進数の1010は10進数の10を表します。

"01010001111", "0", "1", "00001111"

VARCHAR2(4000)

-

REGEX - ^[01]*$

-

-

2

currency_amount_d

金融取引または通貨換算で特定の通貨単位に割り当てられた数値を示します。取引される通貨の数量または金額を表します。

通常、このドメインは、取引される通貨を表すcurrency_code_dドメインとともに使用されます。

10, 1000, 5000.67, 100000

NUMBER

currency

-

-

-

3

currency_code_d

通常は3文字のコードで、アメリカ・ドルはUSD、ユーロはEURなど、国際取引の特定の通貨を表します。

通常、このドメインは、金融取引の数値を表すcurrency_amount_dドメインとともに使用されます。

"USD", "INR", "EUR", "GBP"

VARCHAR2(3)

currency

-

-

-

4

day_d

曜日の名称。

"SUNDAY", "MONDAY", ..., "SATURDAY"

CHAR(9)

-

List - ["SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"]

NLSプロパティに基づく

  1. SUNDAY
  2. MONDAY
  3. TUEDAY
  4. WEDDAY
  5. THUDAY
  6. FRIDAY
  7. SATDAY

OR

  1. MONDAY
  2. TUEDAY
  3. WEDDAY
  4. THUDAY
  5. FRIDAY
  6. SATDAY
  7. SUNDAY

-

5

day_short_d

曜日の名称の省略表現。

"SUN" ,"MON", ..., "SAT"

CHAR(3)

-

List - ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]

NLSプロパティに基づく

  1. SUN
  2. MON
  3. TUE
  4. WED
  5. THU
  6. FRI
  7. SAT

または

  1. MON
  2. TUE
  3. WED
  4. THU
  5. FRI
  6. SAT
  7. SUN

-

6

day_enum_d

週の7日を表す列挙を表します。ドメインでは、長い曜日名(MONDAY)と短い曜日名(MON)がサポートされています

day_enum_d.MONDAY,day_enum_d.MON,day_enum_d.TUESDAY,day_enum_d.TUE

ENUM

calendar_info

ENUM - day_enum_d.MONDAY,day_enum_d.MON,day_enum_d.TUESDAY,day_enum_d.TUE

-

-

7

hexadecimal_d

0-9、および10から15までの値を表すA-Fを含む16個のシンボルを利用したBase-16記数法。各桁は16の累乗を表します。たとえば、16進数のA8は10進数の168を表します。

"001122AAFFF", "fffff", "00ffaa"

VARCHAR2(4000)

-

REGEX - ^[0-9a-fA-F]*$

-

-

8

latitude_d

赤道に対して地球表面上の点で南北の位置を指定する地理座標。これは、北緯90度(北極)から南緯90度(南極)までの度数で測定されます。

37.773972

NUMBER

latlong, geographic

CHECK -90<=latitude<=90

-

-

9

longitude_d

グリニッジ子午線に対して地球表面上の点で東西の位置を指定する地理座標。これは、西経180度から東経180度までの度数で測定されます。

-122.431297

NUMBER

latlong, geographic

CHECK -180<=longitude<=180

-

-

10

measure_d

オブジェクト、現象またはシステムの特定の属性、特性、数量の定量化または評価を指します。

500, 1000, 1500, -22.3

NUMBER

-

-

-

-

11

measure_type_d

これは、特定の測定のカテゴリまたは分類を参照します。重量、温度、時間、数量など、測定される対象の性質またはタイプを定義します。

このドメインは、測定の数値を表すmeasure_value_dドメインとともに使用されます。

“kg/cm^3”, “m”, “meters”, “celsius”

VARCHAR2(100)

measure

-

-

-

12

measure_value_d

特定の測定タイプでの測定の数値または定量表現。観測される現象の大きさまたは量を示します。

通常、このドメインは、測定の単位を表すmeasure_type_dドメインとともに使用されます。

1000, 45.67, -300, 0

NUMBER

measure

-

-

-

13

month_d

月の名称。

"JANUARY", "FEBRUARY", ..., "DECEMBER"

CHAR(10)

-

List - ["JANUARY", "FEBRUARY", ..., "DECEMBER"]

  1. JANUARY
  2. FEBRUARY
  3. MARCH
  4. APRIL
  5. MAY
  6. JUNE
  7. JULY
  8. AUGUST
  9. SEPTEMBER
  10. OCTOBER
  11. NOVEMBER
  12. DECEMBER

-

14

month_short_d

年における月の名称の省略表現。

"JAN", "FEB", ..., "DEC"

CHAR(3)

-

List - ["JAN", "FEB", ..., "DEC"]

  1. 1月
  2. FEB
  3. MAR
  4. APR
  5. MAY
  6. JUN
  7. JUL
  8. AUG
  9. SEP
  10. OCT
  11. NOV
  12. DEC

-

15

month_enum_d

年の12か月を表す列挙を表します。ドメインでは、長い月名(JANUARY)と短い月名(JAN)がサポートされています。

month_enum_d.JANUARY,month_enum_d.JAN,month_enum_d.FEBRUARY,month_enum_d.FEB

ENUM

calendar_info

ENUM -month_enum_d.JANUARY,month_enum_d.JAN,month_enum_d.FEBRUARY,month_enum_d.FEB, and so on.

-

-

16

octal_d

8つのシンボル(通常は0 - 7)を利用したBase-8記数法。各桁は8の累乗を表します。たとえば、8進数の12は10進数の10を表します。

"12345", "7777", "01010"

VARCHAR2(4000)

-

REGEX - ^[0-7]*$

-

-

17

rank_d

特定の標準に基づいて他のものと比較した位置。その位置を順序で示します。ランクは通常、正の整数です。

1, 2,3, 10, 100, 5000

INTEGER

assessment

CHECK >= 1

-

-

18

rating_d

事前定義された基準に基づいて何かの品質、値またはパフォーマンスを評価するために与えられた数値または定性評価を示します。評価によって満足度、有効性または関連性を示すため、ユーザーが情報に基づいた意思決定を行うのに役立ちます。

-100, 0, 1, 45, 300

NUMBER

assessment

-

-

-

19

score_d

様々なコンテキストでパフォーマンス、品質または成功を測定するために割り当てられた数値評価または評点を表します。スコアは、様々な状況でパフォーマンス・レベルまたは結果を評価および比較するための標準化された方法を提供します。

-100, 0, 1, 45, 300

NUMBER

assessment

-

-

-

20

time_zone_abbreviation_d

特定のタイムゾーンの名前を表す短縮形または頭字語。通常は文字で構成され、地域の標準時を迅速に識別するために使用されます。たとえば、東部標準時の「EST」、中央ヨーロッパ時間の「CET」などです。

このドメインは、数値形式のタイムゾーンを表すtime_zone_utc_offset_dのかわりに使用できます。

"PST", "IST", "EST"

VARCHAR2(3)

timezone

-

-

-

21

time_zone_utc_offset_d

特定のタイム・ゾーンのローカル時間と協定世界時(UTC)との差異(時分単位)。これは、UTCの標準時間からの偏差を表し、時間をグローバルに調整するための参照点として機能します。正のオフセットはUTCより先の時間の場所を示し、負のオフセットはUTCより後の時間の場所を示します。

このドメインは、タイムゾーンの頭字語を表すtime_zone_abbreviation_dのかわりに使用できます。

"UTC+04:00", "UTC-03:30"

VARCHAR2(20)

timezone

-

-

-

22

year_d

数値形式の年。紀元前1年は0、紀元前2年は-1、そして一般には紀元前n年には「-(n - 1)」 (1 - nと等しい負の数)という番号が付けられます。この番号付けシステムは、「天文学的紀年法」とも呼ばれます。

-22, 1996, 2000, 1800

NUMBER(4)

-

-

-

-

10.2 スキーマ注釈

この項では、データベース・オブジェクトにスキーマ注釈(以降は、「注釈」と表記)を使用する方法について説明します。

多くのアプリケーションでは、表、ビュー、表の列、索引、ドメインなどのデータベース・オブジェクトに関する追加のプロパティ・メタデータを保持することが重要です。注釈を使用すると、アプリケーションで、データベース・オブジェクトおよび表の列に関するユーザー固有のメタデータをさらに格納および取得できます。アプリケーションでは、このようなメタデータを使用して、効果的なユーザー・インタフェースをレンダリングしたり、アプリケーション・ロジックをカスタマイズできます。

10.2.1 注釈の概要

注釈とは何ですか。また、どこで使用できますか。

注釈は、開発者がデータベース・スキーマ・オブジェクトの使用状況プロパティを一元的に登録するための軽量な宣言機能です。注釈はディクショナリ表に格納され、関連アプリケーションの共通データ全体にわたって動作の標準化を求めるアプリケーションで使用できます。注釈はデータベースによって解釈されません。これらはデータベース・メタデータのカスタム・データ・プロパティであり、表の列、表および索引に含まれており、アプリケーションは追加のプロパティ・メタデータとして使用してユーザー・インタフェースをレンダリングしたり、アプリケーション・ロジックをカスタマイズできます。

アプリケーション・メタデータをデータベースに一元的に定義および格納するメカニズムである注釈を使用すると、アプリケーション、モジュールおよびマイクロサービス間でメタデータ情報を共有できます。新しいオブジェクトを(CREATE文を使用して)作成したり、既存のオブジェクトを(ALTER文を使用して)変更するときに、注釈をスキーマ・オブジェクトに追加できます。

メタデータを使用してデータ・モデルに注釈を付けると、データの整合性と一貫性が向上し、データ・モデルのドキュメンテーションのメリットが高まります。アプリケーションでは、他のアプリケーションまたはユーザーが取得および使用できるデータベース・オブジェクトと表の列に関するユーザー定義のメタデータを格納できます。データとともにメタデータを格納すると、データを使用するユーザーまたはアプリケーションに対する一貫性と汎用的なアクセシビリティが保証されます。

個々の注釈には名前とオプションの値があります。名前とオプションの値は自由形式のテキスト・フィールドです。たとえば、名前と値のペアを持つ注釈(Display_Label 'Employee Salary'など)を保持したり、名前のみを持つ(名前が説明なしでわかるため値が不要の)スタンドアロンの注釈(UI_Hiddenなど)を保持できます。

次に、注釈の詳細を示します。

  • CREATE DDL文を使用してスキーマ・オブジェクトに注釈名を指定すると、注釈が自動的に作成されます。

  • 注釈は付加的です。つまり、同じスキーマ・オブジェクトに複数の注釈を指定できます。

  • 1つのDDL文を使用して、一度に複数の注釈をスキーマ・オブジェクトに追加できます。同様に、1つのDDL文で複数の注釈をスキーマ・オブジェクトから削除できます。

  • 注釈は、注釈を追加するデータベース・オブジェクトに対する下位要素として表されます。注釈は、データベース内に新しいオブジェクト・タイプを作成しません。

  • 自分が所有しているか、スキーマ・オブジェクトに対する変更権限あれば、注釈をサポートする任意のスキーマ・オブジェクトに注釈を追加できます。注釈名をスキーマ修飾する必要はありません。

  • ディクショナリ・ビューに対してSQL問合せを発行して、名前と値およびスキーマ・オブジェクトでの使用を含め、すべての注釈を取得できます。

10.2.2 注釈とコメント

COMMENTコマンドを使用して、表や表の列などのデータベース・オブジェクトに注釈を付けることもできます。スキーマ・オブジェクトに関連付けられたコメントは、オブジェクトのメタデータとともにデータ・ディクショナリに格納されます。

注釈は、コメントよりも使用しやすく、範囲が広くなります。コメントと注釈の主な違いは次のとおりです。

  • コメントは、表や列などの特定のスキーマ・オブジェクトにのみメタデータを追加するために使用されるコメント・メカニズムです。索引、プロシージャ、トリガー、ドメインなど、他のスキーマ・オブジェクトではコメントを使用できません。

  • コメントには名前がなく、自由形式の値しかありません。

  • コメントは付加的ではありません。つまり、同じオブジェクトに複数のコメントを追加することはできません。新しいコメントを指定すると、対応する表または列に関する前のコメントが上書きされます。

  • コメントには別々のDDL文が必要であるのに対し、複数の注釈を結合して1つのDDL文にできます。

  • エンティティごとに個別のディクショナリ・ビュー・セットが存在します。たとえば、表コメント用のビューと列コメント用の別のビューがあります。一方、注釈は、すべてのオブジェクト・タイプで統一されているため、問合せおよび使用が簡単になります。

関連項目:

COMMENTSの使用方法の詳細は、コメントを参照してください。

10.2.3 サポートされているデータベース・オブジェクト

注釈は、次のデータベース・オブジェクトでサポートされています。

  • 表および表の列

  • ビューおよびビューの列

  • マテリアライズド・ビューおよびマテリアライズド・ビューの列

  • 索引

  • ドメインおよび複数列ドメインの列

10.2.4 注釈の使用に必要な権限

注釈を追加または削除するには、CREATEまたはALTER DDL文で注釈が指定されているスキーマ・オブジェクトに対するCREATEまたはALTER権限が必要です。

注釈を明示的に作成または削除することはできません。注釈は、初回使用時に自動的に作成されます。注釈は、注釈が定義されているデータベース・オブジェクト内の下位要素として格納されるため、注釈を追加してもデータベース内に新しいオブジェクト・タイプは作成されません。

10.2.5 注釈のDDL文

この項では、注釈の構文について説明し、表、表の列、ビュー、マテリアライズド・ビュー、索引およびドメインの注釈を定義または変更するためのDDL文を示します。

トピック:

10.2.5.1 注釈の構文

次のスニペットは、表、表の列、ビュー、マテリアライズド・ビュー、索引およびドメインの注釈を定義するためにDDL文で使用される注釈の構文を示しています。

annotations
         ::= 'ANNOTATIONS' '(' annotations_list ')'

annotations_list
         ::= ( 'ADD' ('IF NOT EXISTS' | 'OR REPLACE' )? | 'DROP' 'IF EXISTS'? | REPLACE)?
 annotation ( ',' ( 'ADD' ('IF NOT EXISTS' | 'OR REPLACE' )? | 'DROP' 'IF EXISTS'? | REPLACE)?
 annotation )*

annotation
         ::= annotation_name annotation_value?

annotation_name
         ::= identifier

annotation_value
         ::= character_string_literal

<annotation_value>は、最大4000文字を保持できる文字列リテラルです。

<annotation_name>は識別子であり、次の要件があります。

  • 識別子は1024文字まで指定できます。

  • 識別子が予約語である場合は、注釈名を二重引用符で囲む必要があります。

  • 二重引用符で囲まれた識別子には、空白文字を含めることができます。

  • 空白文字のみが含まれる識別子は使用できません。

10.2.5.2 表に注釈を付けるDDL文

次のDDL文を使用して、表を作成または変更するときに表に注釈を付けることができます。

CREATE TABLE文の使用方法

次に、注釈を指定したCREATE TABLE文の例を示します。

次の例では、JSON値の注釈Operationと、もう1つのスタンドアロンで値のない注釈Hiddenを追加します。

CREATE TABLE Table1 (
  T NUMBER)
  ANNOTATIONS(Operations '["Sort", "Group"]', Hidden);

注釈をするときには、その前にADDキーワードを使用できます。すべての指定を省略すると、ADDキーワードがデフォルトの操作とみなされます。

次の例では、オプションのADDキーワードを使用して、Hidden注釈(同様にスタンドアロン)をTable2に追加します。

CREATE TABLE Table2 (
  T NUMBER)
  ANNOTATIONS (ADD Hidden);

ADDキーワードは、注釈を定義するときの暗黙的な操作であり、省略できます。

ALTER TABLE文の使用方法

次の例では、ALTER TABLEコマンドによって、注釈名OperationsおよびHiddenのすべての注釈値が削除されます。

ALTER TABLE Table1
  ANNOTATIONS(DROP Operations, DROP Hidden);

次の例のALTER TABLEコマンドでは、Join値の注釈JoinOperationsを追加して、注釈名Hiddenを削除します。注釈を削除するときには、DROPコマンドに注釈名のみを含める必要があります。

ALTER TABLE Table1
  ANNOTATIONS(ADD JoinOperations 'Join', DROP Hidden);

1つのDDL文に複数のADDおよびDROPキーワードを指定できます。

同じオブジェクト(オブジェクト・レベルの注釈の場合)または同じ列(列レベルの注釈の場合)に、値が異なる注釈を再追加しようとするとエラーが発生します。たとえば、次の文は失敗します:
ALTER TABLE Table1
  ANNOTATIONS(ADD JoinOperations 'Join Ops');

出力は次のとおりです。

ORA-11552: Annotation name 'JOINOPERATIONS' already exists.
そのかわりとして、注釈構文では、REPLACEキーワードを使用して注釈値を置換できます。次の文では、JoinOperationsの値を'Join Ops'に置き換えます:
ALTER TABLE Table1
  ANNOTATIONS(REPLACE JoinOperations 'Join Ops');

出力は次のとおりです

Table altered.
また、すでに注釈が存在しているときのエラーを回避するために、IF NOT EXISTS句を使用することもできます。次の文では、JoinOperations注釈が存在しない場合にのみ、その注釈を追加します。その注釈が存在する場合、注釈値は変更されず、エラーは発生しません。
ALTER TABLE Table1
  ANNOTATIONS(ADD IF NOT EXISTS JoinOperations 'Join Ops');
同様に、存在しない注釈を削除するとエラーが発生します:
ALTER TABLE Table1 ANNOTATIONS(DROP Title);

出力は次のとおりです。

ORA-11553: Annotation name 'TITLE' does not exist.
このエラーを回避するために、次のようにIF EXISTS句を使用できます。
ALTER TABLE Table1
  ANNOTATIONS(DROP IF EXISTS Title);

出力は次のとおりです。

Table altered.

関連項目:

句の完全な変更および定義については、『SQL言語リファレンス』のCREATE TABLEおよびALTER TABLE

10.2.5.3 表の列に注釈を付けるDDL文

次のDDL文を使用して、表を作成または変更するときに表の列に注釈を付けることができます。

CREATE TABLE文の使用方法

CREATE TABLE文を使用して列レベルの注釈を追加するには、column_definition句の一部として注釈を指定します。注釈は、末尾のインライン制約の後に指定されます。

次の例では、表作成時に列の注釈を指定します。

CREATE TABLE Table1
  (T NUMBER ANNOTATIONS(Operations 'Sort', Hidden));

CREATE TABLE Table2
  (T NUMBER ANNOTATIONS (Hidden));
 

次の例では、Employee表に表レベルと列レベルの注釈を指定します。

CREATE TABLE Employee (
  Id NUMBER(5) ANNOTATIONS(Identity, Display 'Employee ID', "Group" 'Emp_Info'),
  Ename VARCHAR2(50) ANNOTATIONS(Display 'Employee Name', "Group" 'Emp_Info'),
  Sal NUMBER ANNOTATIONS(Display 'Employee Salary', UI_Hidden)
)
 ANNOTATIONS (Display 'Employee Table');

前の例のEmployee表には、列レベルとオブジェクト・レベルの注釈Displayがあります。この注釈は、列レベルとオブジェクト・レベルで定義されています。新しい注釈は、それに対応するオブジェクトと列のペアが異なっていれば同じ名前で定義できます。たとえば、Employee表にはDisplay名が付いた別の注釈を定義することはできませんが、Sal列に新しい注釈"Group"を定義することはできます。注釈"Group"は予約語であるため、二重引用符で囲む必要があります。

ALTER TABLE文の使用方法

ALTER TABLE文を使用して列レベルの注釈を追加するには、modify_col_properties句の一部として注釈を指定します。注釈は、末尾のインライン制約の後に指定されます。

次の例では、Table1表の列Tに、新しいIdentity注釈を追加します。

ALTER TABLE Table1
  MODIFY T ANNOTATIONS(Identity 'ID');

次の例では、Label注釈を追加して、Identity注釈を削除します。

ALTER TABLE Table1
  MODIFY T ANNOTATIONS(ADD Label, DROP Identity);

関連項目:

句の完全な変更および定義については、『SQL言語リファレンス』のCREATE TABLEおよびALTER TABLE

10.2.5.4 ビューおよびマテリアライズド・ビューに注釈を付けるDDL文

次のDDL文を使用して、ビューおよびマテリアライズド・ビューに注釈を付けることができます。

ビューおよびマテリアライズド・ビューは、ビュー・レベルおよび列レベルで注釈をサポートしています。列レベルの注釈は、列別名定義句の一部として表のビューでのみサポートされています。

CREATE VIEW文の使用方法

次の例では、ビュー・レベルおよび列レベルの注釈を示します。

CREATE OR REPLACE VIEW HighWageEmp  
(
  Id ANNOTATIONS(Identity, Display 'Employee ID', "Group" 'Emp_Info'),
  Ename ANNOTATIONS (Display 'Employee Name',  "Group" 'Emp_Info'),
  Sal  ANNOTATIONS (Display 'Emp Salary')  
)
ANNOTATIONS (Title 'High Wage Employee View')
AS SELECT * FROM EMPLOYEE WHERE Sal > 100000;

CREATE MATERIALIZED VIEW文の使用方法

次の例では、Materialized View文でビュー・レベルの注釈を追加します:

CREATE MATERIALIZED VIEW MView1
  ANNOTATIONS (Title 'Tab1 MV1', ADD Snapshot)
  AS SELECT * FROM Table1;

次の例では、Materialized View文でビュー・レベルおよび列レベルの注釈を追加します:

CREATE MATERIALIZED VIEW MView1(
  T ANNOTATIONS (Hidden)) 
 ANNOTATIONS (Title 'Tab1 MV1', ADD Snapshot)
 AS SELECT * FROM Table1;

ALTER VIEW文の使用方法

注釈をサポートするために、ALTER VIEW文に新しい副句が追加され、ビュー・レベルで注釈を変更できます。ALTER VIEW文でサポートされている他の副句には、ビューの制約の変更、再コンパイルの有効化およびEDITIONABLEプロパティの変更があります。

ビューの列レベルの注釈は変更できません。以前に追加された列レベルの注釈は、ビューを削除し、新しいものを再作成することによってのみ削除できます。

次の例は、Title注釈を削除して、ビュー・レベルでIdentity注釈を追加するALTER VIEW文です。

ALTER VIEW HighWageEmp
  ANNOTATIONS(DROP Title, ADD Identity);

ALTER MATERIALIZED VIEW文の使用方法

ALTER MATERIALIZED VIEW文には、マテリアライズド・ビュー・レベルで注釈をグローバルに変更するために追加された新しい副句があります。列レベルの注釈は、マテリアライズド・ビューを削除して再作成することによってのみ削除できます。

次のALTER MATERIALIZED VIEW文では、MView1からSnapshot注釈を削除します。

ALTER MATERIALIZED VIEW MView1
  ANNOTATIONS(DROP Snapshot);

関連項目:

句の完全な変更および定義については、『SQL言語リファレンス』のCREATE VIEWALTER VIEWCREATE MATERIALIZED VIEWおよびALTER MATERIALIZED VIEW

10.2.5.5 索引に注釈を付けるDDL文

次のDDL文を使用して、索引に注釈を付けることができます。

CREATE INDEX文の使用方法

次に、索引レベルの注釈の作成例を示します。

CREATE TABLE DEPARTMENT(
  DEPT_ID NUMBER,
  UNIT NUMBER);

CREATE INDEX I_DEPT_ID ON DEPARTMENT(DEPT_ID)
  ANNOTATIONS(Display 'Department Index');

CREATE UNIQUE INDEX UI_UNIT ON DEPARTMENT(UNIT)
  ANNOTATIONS(Display 'Department Unique Index');

ALTER INDEX文の使用方法

次に、索引レベルの注釈の変更例を示します。

ALTER INDEX I_DEPT_ID
  ANNOTATIONS(DROP Display, ADD ColumnGroup 'Group1');

関連項目:

句の完全な変更および定義については、『SQL言語リファレンス』のCREATE INDEXおよびALTER INDEX

10.2.5.6 ドメインに注釈を付けるDDL文

次のDDL文を使用して、ドメインに注釈を付けることができます。

ドメインの注釈は、ドメイン・レベルまたは列レベルで指定できます。ドメインで定義された注釈は、そのドメインを参照するオブジェクトに継承されます。注釈は、通常のドメインにのみ使用できます。フレキシブル・ドメインには使用できません。

単一列ドメインのドメイン・レベルの注釈を指定するには、列レベルの注釈とオブジェクト・レベルの注釈を区別するために、カッコ付きの構文(複数列ドメインに使用)が必要です。それ以外の場合、単一列ドメインの注釈は列レベルとみなされます。

CREATE DOMAIN文の使用方法

次の例では、単一列ドメインに列レベルの注釈を指定することで、ドメイン注釈を作成します。

CREATE DOMAIN dept_codes_1 AS NUMBER(3) 
  CONSTRAINT dept_chk_1 CHECK (dept_codes_1 > 99 AND dept_codes_1 != 200) 
  ANNOTATIONS (Title 'Column level annotation');

次の例では、単一列ドメインにドメイン・レベルの注釈を指定します。これには、複数列ドメインに対応するドメイン構文を使用する必要があります(列にカッコを使用します)。

CREATE DOMAIN dept_codes_2 AS (
  code AS NUMBER(3) 
  CONSTRAINT dept_chk_2 CHECK (code > 99 AND code != 200)) 
  ANNOTATIONS (Title 'Domain Annotation');
CREATE DOMAIN HourlyWages AS Number(10) 
  DEFAULT ON NULL 15
  CONSTRAINT MinimalWage CHECK (HourlyWages > = 7 and HourlyWages <=1000) ENABLE
  DISPLAY TO_CHAR(HourlyWages, '$999.99')
  ORDER ( -1*HourlyWages )
  ANNOTATIONS (Title 'Column level annotation');

次の例では、列レベルとドメイン・レベルの注釈がある複数列ドメインを作成します。

CREATE DOMAIN US_City AS (
    name  AS VARCHAR2(50) ANNOTATIONS (Address),
    state AS VARCHAR2(50) ANNOTATIONS (Address),
    zip AS NUMBER ANNOTATIONS (Address)
  )
  CONSTRAINT City_CK CHECK(state in ('CA','AZ','TX') and zip < 100000) 
  DISPLAY name || ', ' || state || ' , ' || TO_CHAR(zip)
  ORDER state || ', ' || TO_CHAR(zip) || ', ' || name
  ANNOTATIONS (Title 'Domain Annotation');

ALTER DOMAIN文の使用方法

オブジェクト・レベルの注釈は、ALTER文で変更できます。ドメインの列レベルの注釈は変更できません。以前に追加された列レベルの注釈は、ドメインを削除し、新しいものを再作成することによってのみ削除できます。

次の例では、dept_codes_2ドメインのドメイン・レベルの注釈を変更します。

ALTER DOMAIN dept_codes_2
  ANNOTATIONS(DROP Title, ADD Name 'Domain');

関連項目:

句の完全な変更および定義については、『SQL言語リファレンス』のCREATE DOMAINおよびALTER DOMAIN

10.2.5.7 ディクショナリ表およびディクショナリ・ビュー

ANNOTATIONS_USAGE$というディクショナリ表には、表やビューなどのスキーマ・オブジェクトでの注釈の使用がすべて含まれます。スキーマ・オブジェクトに新しい注釈名、値あるいはその両方を指定すると、ANNOTATIONS_USAGE$表に新しいエントリが作成されます。同様に、スキーマ・オブジェクトで注釈が削除されると、対応するエントリがANNOTATIONS_USAGE$表から削除されます。

次のディクショナリ・ビューでは、すべてのスキーマ・オブジェクトにわたって注釈とその使用のリストが追跡されます。

  • {DBA|USER|ALL|CDB}_ANNOTATIONS

  • {DBA|USER|ALL|CDB}_ANNOTATIONS_USAGE

  • {DBA|USER|ALL|CDB}_ANNOTATIONS_VALUES

10.2.5.7.1 ディクショナリ・ビューの問合せ

ディクショナリ・ビューに対して問合せを実行し、特定のスキーマ・オブジェクトに使用される注釈のリストを取得できます。

'EMP'表に対して発行された問合せ文の例を次に示します。

'EMP'表の表レベルの注釈を取得する場合:
SELECT * FROM USER_ANNOTATIONS_USAGE
  WHERE Object_Name = 'EMPLOYEE'
   AND Object_Type = 'TABLE'
   AND Column_Name IS NULL;
'EMP'表の列レベルの注釈を取得する場合:
SELECT * FROM USER_ANNOTATIONS_USAGE
  WHERE Object_Name = 'EMPLOYEE'
   AND Object_Type = 'TABLE'
   AND Column_Name IS NOT NULL;
列ごとに単一のJSONコレクションとして'EMP'表の列レベルの注釈を取得する場合:
SELECT  U.Column_Name, JSON_ARRAYAGG(JSON_OBJECT(U.Annotation_Name, U.Annotation_Value))
  FROM USER_ANNOTATIONS_USAGE U
  WHERE Object_Name = 'EMPLOYEE' AND Object_Type = 'TABLE' AND Column_Name IS NOT NULL
  GROUP BY Column_Name;