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_d
、ssn_d
およびcredit_card_number_d
が挙げられます。
関連項目:
-
データ・ユースケース・ドメインのタイプの詳細は、『Oracle Database概要』を参照してください。
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 |
任意のスキーマ内のドメインを使用および参照できます。 ユーザーに任意のスキーマ内のドメイン対する実行権限を明示的に付与するには、次のコードを使用します。
|
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
}' );
関連項目:
-
ユースケース・ドメインの作成に対する構文とセマンティックの詳細は、『Oracle Database SQL言語リファレンス』: CREATE DOMAINを参照してください
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_id
、birth_date
、height
および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_DISPLAY
やDOMAIN_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_date
、height
および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_DISPLAY
やDOMAIN_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
が使用されている場合は、ドメインに関連付けられている列の制約が保持されます。
-
関連項目:
-
ユースケース・ドメインの削除に関する構文とセマンティックの詳細は、『Oracle Database SQL言語リファレンス』: DROP DOMAINを参照してください。
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
列が関与するチェック条件を評価する場合に役立ちます。
関連項目:
-
ユースケース・ドメインの作成に対する構文とセマンティックの詳細は、『Oracle Database SQL言語リファレンス』: CREATE DOMAINを参照してください
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_DISPLAY
やDOMAIN_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
関連項目:
-
ユースケース・ドメインの変更に関する構文とセマンティックの詳細は、『Oracle Database SQL言語リファレンス』: ALTER DOMAINを参照してください。
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 DOMAIN
のALTER 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つのcelcius
、fahrenheit
、kelvin
というドメインから、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 ));
ノート:
キーワードのDOMAIN
とUSING
は、フレキシブル・ドメインを関連付けするときには必須です。
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_DISPLAY
やDOMAIN_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 DOMAIN
のALTER 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
コマンドを使用して、既存の表の列に列挙ドメインを追加できます。次のコードでは、emp
がjob
、deptno
および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
以外のドメインでは、表列とドメイン列に異なる長さ、精度およびスケールを設定できます。
-
NUMBER
、NUMER(p)
、NUMBER(p, s)
、NUMERIC
、NUMERIC(p)
、NUMERIC(p, s)
、DECIMAL
、DECIMAL(p)
、DEC
、DEC(p)
、INTEGER
、INT
、SMALLINT
、FLOAT
、FLOAT(p)
、REAL
、DOUBLE_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)
-
TIMESTAMP
、TIMESTAMP(p)
-
TIMESTAMP WITH TIME ZONE
、TIMESTAMP(p) WITH TIME ZONE
-
TIMESTAMP WITH LOCAL TIME ZONE
、TIMESTAMP(p) WITH LOCAL TIME ZONE
-
INTERVAL YEAR TO MONTH
、INTERVAL YEAR(p) TO MONTH
-
INTERVAL DAY TO SECOND
、INTERVAL DAY(p) TO SECOND
、INTERVAL DAY TO SECOND(s)
、INTERVAL DAY(p) TO SECOND(s)
-
ROWID
、UROWID
、UROWID(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)
、INTEGER
、INT
、SMALLINT
-
FLOAT(63)
、REAL
-
FLOAT
、FLOAT(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)
。 -
TIMESTAMP
、TIMESTAMP(6)
-
TIMESTAMP WITH TIME ZONE
、TIMESTAMP(6) WITH TIME ZONE
-
TIMESTAMP WITH LOCAL TIME ZONE
、TIMESTAMP(6) WITH LOCAL TIME ZONE
-
INTERVAL YEAR TO MONTH
、INTERVAL YEAR(2) TO MONTH
-
INTERVAL DAY TO SECOND
、INTERVAL DAY(2) TO SECOND
、INTERVAL DAY TO SECOND(6)
、INTERVAL DAY(2) TO SECOND(6)
-
ROWID
、UROWID(10)
-
UROWID
、UROWID(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_SEMANTICS
でBYTE
として設定されているときには、Lのバイト数をLに対応する最大長(バイト単位)にします。
ドメインに列を関連付ける場合は、次のルールが適用されます:
-
ドメインが
STRICT
以外として定義されている場合、そのドメインは任意のxバイトのデータ型VARCHAR2(x)
の列に関連付けできます。STRICT
以外のドメインの場合は、Lとxが異なっていてもかまいません。 -
ドメインが
STRICT
として定義されている場合、そのドメインは任意のxバイト = Lバイトのデータ型VARCHAR2(x)
の列に関連付けできます。STRICT
ドメインの場合、L|xCHAR
を必要に応じてBYTES
に変換した後でも、Lとxのバイト数は同じであることが必要です。
たとえば、ドメイン・データ型の指定がVARCHAR2 STRICT
のときに、MAX_STRING_SIZE
がSTANDARD
の場合、そのドメインはL = 4000のVARCHAR2(L BYTE)
データ型の列と関連付けできます。セッションの現在のNLS設定が、文字を表すために最大2バイトを必要とする場合、ドメインにはVARCHAR2(2000 CHAR)
データ型の列を関連付けることができます。MAX_STRING_SEMANTICS
がEXTENDED
に変更されると、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_DOMAINS、DBA_DOMAINS、USER_DOMAINS、ALL_DOMAIN_COLS、DBA_DOMAIN_COLS、USER_DOMAIN_COLS、ALL_DOMAIN_CONSTRAINTS、DBA_DOMAIN_CONSTRAINTS、USER_DOMAIN_CONSTRAINTSを参照してください
10.1.12 組込みのユースケース・ドメイン
Oracle Databaseには、表列に直接使用できる組込みのユースケース・ドメイン(email_d
、ssn_d
、credit_card_number_d
など)が用意されています。組込みのユースケース・ドメインは、すべてのPDBに存在しています。新しいPDBがCDBに追加されると、組込みのユースケース・ドメインが自動的に作成されてPDBに追加されます。
Oracle Databaseでは、次の組込みドメインがサポートされています。これらは、次のように分類されます:
-
識別子の組込みドメイン
-
技術の組込みドメイン
-
数値の組込みドメイン
-
その他の組込みドメイン
表10-1 識別子の組込みドメイン
# | ドメイン名 | 説明: | 例 | データ型 | 注釈 | 制約 | ドメイン順序 | ドメイン表示 |
---|---|---|---|---|---|---|---|---|
1 |
|
都市部または自治体 |
"San Francisco", "Mumbai", "Tokyo" |
VARCHAR2(100) |
address |
- |
- |
- |
2 |
|
各国または地域に割り当てられた、標準化された2文字または3文字のコード。通常はISO 3166などの国際規格によって定義されます。 |
"USA", "IND", "AUS" |
VARCHAR2(3) |
address |
- |
- |
- |
3 |
|
自国の政府、法律、国際的承認を特徴とする、独立した国家として認識される明確な領土と主権団体。 |
"USA", "India", "Mexico" |
VARCHAR2(100) |
address |
- |
- |
- |
4 |
|
識別およびトランザクションのためにクレジット・カードに割り当てられた一意の連続する数。 |
"12345678901234" "123456789012345" "1234567890123456" "12345678901234567" "123456789012345678" "1234567890123456789" |
VARCHAR2(20) |
- |
REGEX - ^[0-9]{12,19}$ |
- |
|
5 |
|
生年月日を表す、個人が生まれた特定の日、月および年。身分証明、年齢確認、記録保持に使用される個人情報の基本的な部分です。表示される形式は、セッションで使用される日付形式によって異なります。 |
01-JAN-91, 02/28/2023, 2023/54 |
DATE |
person_info |
- |
- |
- |
6 |
|
市区町村または国内で定義されたエリアまたはリージョン。ほとんどの場合、個別の行政、ソーシャルまたは地理の単位で特徴付けられます。 |
"Manhattan", "Brooklyn" |
VARCHAR2(100) |
address |
- |
- |
- |
7 |
|
特定のユニットまたは住居がある建物内の階数。通常はその住所に示されます。 |
"1", "1A", "Ground", "First" |
VARCHAR2(20) |
address |
- |
- |
- |
8 |
|
番地または地域内の建物または住居に割り当てられた数値識別子。通常は郵便の住所およびナビゲーションのために使用されます。 |
"1-A", "10", "C1-H123" |
VARCHAR2(50) |
address |
- |
- |
- |
9 |
|
車両のライセンス・プレートに表示される文字、数字または記号の一意の組合せで、その車両の一意の識別子として機能します。 |
"ABC123", "1234 XYZ", "DEF-456", "789 GHI", "JKL 987", "MNO-654", "PQR1234", "STU 5678", "VWX-9012", "YZA 3456" |
VARCHAR2(100) |
person_info |
- |
- |
- |
10 |
|
個人の婚姻に関する法律上の関係ステータスを示す人口統計属性。一般的なカテゴリとしては、「未婚」、「既婚」、「離婚」、「死別」、「別居」などがあります。 |
"single", "married", "widowed" |
VARCHAR2(50) |
person_info |
- |
- |
- |
11 |
|
政府が市民または居住者に対して身分証明および管理のために発行する一意の識別子。国民IDは、行政サービスへのアクセスや身元確認、および投票、出張、金融活動などのトランザクションの円滑化に使用されます。 |
"123-45-6789", "AB123456C", "1234 5678 9012", "123.456.789-01" |
VARCHAR2(50) |
person_info |
- |
- |
- |
12 |
|
保有者の身元と国籍を証明する政府発行の旅行証明書であり、国際的な移動を許可します。 |
"AB123456", "123456789", "ABC123456", "E1234567", "AB1234567", "123456789AB" |
VARCHAR2(100) |
person_info |
- |
- |
- |
13 |
|
クレジット・カード、デビット・カード、プリペイド・カードなど、支払カードに関連付けられた一意の識別子。この識別子は、金融機関のシステム内で各カードを区別するものであり、トランザクションの承認、処理および追跡に使用されます。 |
"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 |
|
個人が音声コールまたはテキスト・メッセージを介して接続できるようにする、通信に使用される数値シーケンス。 |
"1-555-555-5555", "44-20-1234-5678", "61-2-1234-5678", "49-30-12345678" |
VARCHAR2(20) |
person_info |
- |
- |
- |
15 |
|
個人が音声コールまたはテキスト・メッセージを介して接続できるようにする、通信に使用される数値シーケンス。 |
"+1234567890123456" "123456789012345" "+987654321098765" "987654321098765" "+123" "123" |
VARCHAR2(17) |
- |
REGEX - ^[+]{0,1}[0-9]{1,16}$ |
- |
- |
16 |
|
郵便の配達や仕分けで特定の地域を識別するため、郵便業務で使用される数値または英数字のコード。 |
"SW1A 1AA", "M5H 2N2", "2000", "10117", "75001", "100-0001", "22010-000", "100000", "110001", "2000" |
VARCHAR2(20) |
address |
- |
- |
- |
17 |
|
国内の行政区画であり、通常は、特に道州制または分権制における独自の政府当局および行政当局があります。 |
"Alberta", "Ontario" |
VARCHAR2(100) |
address |
- |
- |
- |
18 |
|
特定のソーシャル・メディア・プラットフォーム上の個人またはエンティティのアカウントに関連付けられた一意の識別子。これは、プラットフォームのシステム内で個別のラベルまたは参照ポイントとして機能し、特定のユーザーまたはプロファイルでの識別および対話を可能にします。 このドメインは通常、ソーシャル・メディア・プラットフォームを表す |
"user123", "nyname@email.com", "myaccount11", "203" |
VARCHAR2(100) |
person_info |
- |
- |
- |
19 |
|
Facebook、Twitter、Instagram、LinkedInなどのソーシャル・メディア・プラットフォームの分類またはカテゴリを指します。 このドメインは通常、ソーシャル・メディア・プラットフォームのユーザーIDを表す |
"facebook", "x", "instagram" |
VARCHAR2(100) |
- |
- |
- |
- |
20 |
|
社会保障局によって米国内の個人に割り当てられた一意の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 |
|
国内の行政および管理区画であり、多くの場合、独自の政府と法制度があります。 |
"California", "Texas" |
VARCHAR2(100) |
address |
- |
- |
- |
22 |
|
建物または住居があり、住所の一部を形成する道路または主要道路の名称。 |
"4th Main Road", "Purple Street 104" |
VARCHAR2(200) |
address |
- |
- |
- |
23 |
|
米国の車両のライセンス・プレートに表示される一意の英数字の組合せで、その車両固有の識別子として機能します。 |
"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 |
|
国外旅行のために米国政府が市民に発行する旅行証明書。 |
"ABC123456", "XYZ789012", "DEF456789", "GHI012345", "12345678" |
VARCHAR2(100) |
person_info |
- |
- |
- |
25 |
|
米国における通信に使用される数値の桁。 |
"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 |
|
米国の郵便番号。通常はZipコードを指します。 |
"10001-1234", "90210-5678", "60601-9876", "02110-5432", "33109-8765" |
VARCHAR2(20) |
address |
REGEX - ^\d{5}([ \-]\d{4})?$ |
- |
- |
27 |
|
社会保障局によって米国内の個人に割り当てられた一意の9桁の識別子。 |
"123-45-6789", "123456789" |
VARCHAR2(15) |
person_info |
- |
- |
- |
28 |
|
米国内の行政区域。 |
"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 |
|
米国で車両に割り当てられた一意の識別子で、通常は車両識別番号(VIN)と呼ばれます。 |
"1G1JC1441Y7167030", "5XYZ1234567890123", "WBAFA53541LM82357", "2G1WG5EK5B1160036", "3N1AB7AP2JY320999" |
VARCHAR2(20) |
person_info |
REGEX - ^[A-HJ-NPR-Z0-9]{17}$ |
- |
- |
30 |
|
米国郵政公社(USPS)が郵送および仕分けを容易にするための英数字コード。 |
"10001-1234", "90210-5678", "60601-9876", "02110-5432", "33109-8765" |
VARCHAR2(15) |
address |
REGEX - ^\d{5}(-\d{4})?$ |
- |
- |
31 |
|
車両に割り当てられた一意の識別子。通常、政府当局および輸送機関による登録、追跡および識別に使用されます。 |
"UK11AP999" |
VARCHAR2(100) |
person_info |
- |
- |
- |
32 |
|
特定の地域への郵便の効率的なルーティングのために郵便業務で使用される郵便番号。 |
"SW1A 1AA", "M5H 2N2", "2000", "10117", "75001", "100-0001", "22010-000", "100000", "110001", "2000" |
VARCHAR2(20) |
address |
- |
- |
- |
表10-2 技術の組込みドメイン
# | ドメイン名 | 説明: | 例 | データ型 | 注釈 | 制約 | ドメイン順序 | ドメイン表示 |
---|---|---|---|---|---|---|---|---|
1 |
|
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 |
|
ファイル、レコードまたはエンティティが作成された日時。 |
'1960-01-01 23:03:20' |
TIMESTAMP |
tech_info, timestamp |
- |
- |
- |
3 |
|
何かの詳細または特性を提供するテキスト情報。 |
"Vintage red bicycle", "Cozy wooden cabin", "Sparkling crystal chandelier", "Rustic farmhouse kitchen", "Gentle ocean breeze" |
VARCHAR2(4000) |
- |
- |
- |
- |
4 |
|
デジタル通信に使用される電子メール・アドレス。 |
"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 |
|
セキュアな送信または格納のためにデータのエンコードに使用されるアルゴリズム。 |
"AES", "DES", "RSA", "Blowfish", "Twofish", "RC4" |
VARCHAR2(1000) |
tech_info, encryption |
- |
- |
- |
6 |
|
その意味を隠すため、暗号化アルゴリズムを使用して変換されたデータ。 通常、このドメインは、使用された暗号化関数を表す |
"5d41402abc4b2a76b9719d911017c592" |
VARCHAR2(1000) |
tech_info, encryption |
- |
- |
- |
7 |
|
コンピュータ・ファイルの形式または使用方法を示すため、その名前に追加されたサフィックス。 |
.txt", ".jpg", ".pdf", ".mp3" |
VARCHAR2(10) |
tech_info |
- |
- |
- |
8 |
|
任意の単位で測定されるコンピュータファイル内のデータの大きさ。ただし通常はバイト単位で測定されます。 |
100, 500, 1000, 2000, 5000 |
NUMBER |
tech_info |
CHECK >=0 |
- |
- |
9 |
|
任意のサイズのデータを固定サイズ値にマップするために使用されるアルゴリズム。 |
"MD5", "SHA-1", "SHA-256", "SHA-512", "CRC32" |
VARCHAR2(1000) |
tech_info, hash |
- |
- |
- |
10 |
|
データ・セットにハッシュ関数を適用した結果。通常はデータ整合性検証に使用されます。 通常、このドメインは、使用されたハッシュ関数を表す |
"5d41402abc4b2a76b9719d911017c592" |
VARCHAR2(1000) |
tech_info, hash |
- |
- |
- |
11 |
|
ネットワーク内のデバイスに割り当てられた一意のラベル。 |
"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 |
|
個人、エンティティまたはオブジェクトに割り当てられた一意の識別子。同等のドメイン: 識別子が数値でない場合は、 |
9876543210, 2468135790, 1357924680, 5555555555 |
NUMBER |
- |
- |
- |
- |
13 |
|
エンティティを一意に識別するために使用される文字の順序。同等のドメイン: 識別子が数値の場合は、 |
"abc123DEF456" |
VARCHAR2(4000) |
- |
- |
- |
- |
14 |
|
コンピュータ・ネットワークに参加しているデバイスに割り当てられた一意の数値ラベル。 |
"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 |
|
インターネット・プロトコル・バージョン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 |
|
インターネット・プロトコル・バージョン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 |
|
ファイルまたはリソースが最後に変更された日時。 |
'1960-01-01 23:03:20' |
TIMESTAMP |
tech_info, timestamp |
- |
- |
- |
18 |
|
データまたは情報が最後にアクセスされた日時。 |
'1960-01-01 23:03:20' |
TIMESTAMP |
tech_info, timestamp |
- |
- |
- |
19 |
|
ファイルまたはリソースが最後にオープンされた日時。 |
'1960-01-01 23:03:20' |
TIMESTAMP |
tech_info, timestamp |
- |
- |
- |
20 |
|
ネットワーク内の通信用ネットワーク・インタフェース・コントローラに割り当てられた一意の識別子。 |
"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 |
|
インターネット・メッセージで送信されるデータ型の識別子。 |
"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 |
|
暗号ハッシュ関数 |
"2fd4e1c67a2d28fced849ee1bb76e7391b93eb12" |
CHAR(40) |
tech_info, hash |
REGEX - ^[0-9a-fA-F]{40}$ |
- |
- |
23 |
|
暗号ハッシュ関数 |
"5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9" |
CHAR(64) |
tech_info, hash |
REGEX - ^[0-9a-fA-F]{64}$ |
- |
- |
24 |
|
暗号ハッシュ関数 |
"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d3 6ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327" |
CHAR(128) |
tech_info, hash |
REGEX - ^[0-9a-fA-F]{128}$ |
- |
- |
25 |
|
長い名前またはタイトルの省略形式または切り捨て形式。 |
"Ben", "Amy", "Max", "Mia", "Sam", "Zoe", "Leo", "Ava", "Eli", "Liv" |
VARCHAR2(500) |
- |
- |
- |
- |
26 |
|
ネットワークおよびホスト部分を定義するために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 |
|
リソースの識別に使用される文字列、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 |
|
ランダムに生成された識別子である汎用一意識別子(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 |
|
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 |
|
セットまたはグループ内のアイテム、オカレンスまたはエンティティの数値集計または合計数量を表します。存在する要素の数を表し、何かの豊富さ、頻度、または範囲を定量化および追跡するために使用されます。 |
5, 12, 100, 1000 |
NUMBER |
- |
- |
- |
- |
2 |
|
一定期間にのみ増加する累積値を表すメトリック・タイプ。カウンタは通常、受信したHTTPリクエストの数や転送された合計バイト数など、イベントまたはオカレンスの合計数を測定するために使用されます。 |
1000, 50000, 8, 128, 56.4, |
NUMBER |
prometheus |
- |
- |
- |
3 |
|
開始点からエンドポイントまで、何かが継続または存在している時間を測定した長さ。期間は、2つのイベント間または特定の期間内の経過時間を定量化し、時間、間隔または期間の尺度を提供します。 |
100, 1000, 250, 5000 |
NUMBER |
- |
- |
- |
- |
4 |
|
時間の経過とともに増加または減少する可能性がある単一の数値を表し、CPU使用率、メモリー消費量、ネットワーク・トラフィックなどの様々なメトリックを監視できます。 |
1000, 50000, 8, 128, -22.78 |
NUMBER |
prometheus |
- |
- |
- |
5 |
|
ヒストグラムに関連付けられたメトリック。特定の時間ウィンドウの中で、ヒストグラムのバケット内に記録された観測またはイベントの合計数を表します。この数は、観測されたメトリックが各バケット範囲内に何回あるかを示し、複数の値範囲における発生の分布を把握することができます。 このドメインは通常、 |
10, 100, 45, 123 |
NUMBER |
prometheus, histogram |
- |
- |
- |
6 |
|
指定された値の範囲にわたる観測またはイベントの分布を測定するためのメトリック・タイプ。各ヒストグラムには、メトリック・データの参照および問合せに使用される一意の識別子である名前があります。 このドメインは通常、 |
"data_sent", "data_received", "request_timed_out" |
VARCHAR2(1000) |
prometheus, histogram |
- |
- |
- |
7 |
|
ヒストグラムに関連付けられたメトリック。特定の時間ウィンドウにおけるヒストグラムのバケット内のすべての観測値の合計を表します。この合計は、HTTPリクエストの合計期間や特定の期間内のリソース消費の合計量など、観測されたメトリックの累積値合計に関するインサイトを提供できます。 このドメインは通常、 |
10, 100, 45, 123 |
NUMBER |
prometheus, histogram |
- |
- |
- |
8 |
|
バケット範囲の上限。この範囲内の値は、そのバケットに含まれるとみなされます。この境界は、バケットに含めることができる最大値を示します。たとえば、バケットの上限が100の場合、そのバケット内には100までの値がカウントされます。 このドメインは通常、 |
100, 500, 10, -20 |
NUMBER |
prometheus, histogram |
- |
- |
- |
9 |
|
バケット範囲の上限を含む境界のテキスト表現。この文字列は通常、バケットに含めることができる最大値を示します。たとえば、バケット上限の文字列が100の場合、そのバケット内には100までの値がカウントされます。 |
"100", "500", "10", "-20" |
VARCHAR2(1000) |
prometheus, histogram |
- |
- |
- |
10 |
|
すべての値を合計し、カウント合計で除算して計算される、数値セットの平均値。 |
10, -2345, 4.67, 0 |
NUMBER |
statistics |
- |
- |
- |
11 |
|
ソートされた数値リストの中間値。上半分と下半分を区切ります。 |
54, 20, 10, 1.45, -123 |
NUMBER |
statistics |
- |
- |
- |
12 |
|
データセットで最も頻繁に出現する値。 |
4, 234, 100, -100, 0 |
NUMBER |
statistics |
- |
- |
- |
13 |
|
ゼロより小さい数値を示します。数値行のゼロのマークを下回る数量または値を表します。 |
-1, -123, -1.456 |
NUMBER |
- |
CHECK <0 |
- |
- |
14 |
|
ゼロ以上の数値を示します。ゼロとすべての正の数値が含まれます。 |
1, 123, 1.456, 0 |
NUMBER |
- |
CHECK >=0 |
- |
- |
15 |
|
ゼロ以下の数値を示します。ゼロと負の両方の数値が含まれます。 |
-1, -123, -1.456, 0 |
NUMBER |
- |
CHECK <=0 |
- |
- |
16 |
|
ゼロと等しくない数値を示します。ゼロを除く正の数と負の数の両方が含まれます |
-1, -123, -1.456, 1, 123, 1.456 |
NUMBER |
- |
CHECK >0または<0 |
- |
- |
17 |
|
パーセントとして表される2つの値の相対的な差異を計算する尺度で、通常は一定期間における変化を表します。100からの比率を表します。 |
5, -5, 10, -10, -66.4 |
NUMBER |
- |
- |
- |
- |
18 |
|
100の小数で表される、全体の一部または小数を示す測定単位。これは100からの比率を表し、通常は相対数量、レート、または増加率、減少率、分布率などの比較を示すために使用されます。パーセントはマイナスにできます。 |
100, 98, 0.50, 75, -300 |
NUMBER |
- |
- |
- |
- |
19 |
|
指定した値以下の分布におけるデータ・ポイントの割合を示す統計の尺度。 |
0, 10, 50 , 99, 33.33 |
NUMBER |
- |
CHECK >=0 |
- |
- |
20 |
|
0より大きい数値を示します。これは、数値行のゼロのマークを上回る数量、測定または値を表します。 |
1, 123, 1.456 |
NUMBER |
- |
CHECK >0 |
- |
- |
21 |
|
2つの数量の大きさの比較であり、通常は一方をもう一方で割った商で表されます。 |
0.5, 0.33, 1.5, 1 |
NUMBER |
- |
- |
- |
- |
22 |
|
一連のデータにおける変動または分散の量の尺度。 |
0, 1, 10, 34, 56.56 |
NUMBER |
statistics |
CHECK >= 0 |
- |
- |
23 |
|
特定の品目またはエンティティの個々の単位での数を表す数量または集計。存在する単位での数量を示し、セットまたはグループ内の品目の豊富さまたは数量の測定に使用されます。 このドメインは通常、IDと単位当たりの価格(任意の通貨での金額)を表す |
5, 10, 1, 0, 1000 |
NUMBER |
unit |
- |
- |
- |
24 |
|
製品、品目またはエンティティの特定の単位に割り当てられた一意の識別子またはコード。1つの単位を別の単位と区別し、追跡、在庫管理および参照目的に使用されます。 このドメインは通常、単位のカウントと価格(任意の通貨での金額)を表す |
50061, 50062, 123, 100001 |
NUMBER |
unit |
- |
- |
- |
25 |
|
製品、品目またはエンティティの単一の単位に関連付けられた金額またはコスト。単位ごとに請求済または支払済の価格を表し、販売または購入の単位から生成された原価または収益の合計を計算するために使用されます。 このドメインは通常、単位のカウントとIDを表す |
1, 15, 3.99, 500.67 |
NUMBER |
unit |
- |
- |
- |
26 |
|
一連のデータ・ポイントにおける平均の分散の尺度。 |
0, 1, 10, 34, 56.56 |
NUMBER |
statistics |
CHECK >= 0 |
- |
- |
表10-4 その他の組込みドメイン
# | ドメイン名 | 説明: | 例 | データ型 | 注釈 | 制約 | ドメイン順序 | ドメイン表示 |
---|---|---|---|---|---|---|---|---|
1 |
|
2つの記号(通常は0と1)のみを使用した数値を表すBase-2記数法。各桁は2の累乗を表します。たとえば、2進数の1010は10進数の10を表します。 |
"01010001111", "0", "1", "00001111" |
VARCHAR2(4000) |
- |
REGEX - ^[01]*$ |
- |
- |
2 |
|
金融取引または通貨換算で特定の通貨単位に割り当てられた数値を示します。取引される通貨の数量または金額を表します。 通常、このドメインは、取引される通貨を表す |
10, 1000, 5000.67, 100000 |
NUMBER |
currency |
- |
- |
- |
3 |
|
通常は3文字のコードで、アメリカ・ドルはUSD、ユーロはEURなど、国際取引の特定の通貨を表します。 通常、このドメインは、金融取引の数値を表す |
"USD", "INR", "EUR", "GBP" |
VARCHAR2(3) |
currency |
- |
- |
- |
4 |
|
曜日の名称。 |
"SUNDAY", "MONDAY", ..., "SATURDAY" |
CHAR(9) |
- |
List - ["SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"] |
NLSプロパティに基づく
OR
|
- |
5 |
|
曜日の名称の省略表現。 |
"SUN" ,"MON", ..., "SAT" |
CHAR(3) |
- |
List - ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"] |
NLSプロパティに基づく
または
|
- |
6 |
|
週の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 |
|
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 |
|
赤道に対して地球表面上の点で南北の位置を指定する地理座標。これは、北緯90度(北極)から南緯90度(南極)までの度数で測定されます。 |
37.773972 |
NUMBER |
latlong, geographic |
CHECK -90<=latitude<=90 |
- |
- |
9 |
|
グリニッジ子午線に対して地球表面上の点で東西の位置を指定する地理座標。これは、西経180度から東経180度までの度数で測定されます。 |
-122.431297 |
NUMBER |
latlong, geographic |
CHECK -180<=longitude<=180 |
- |
- |
10 |
|
オブジェクト、現象またはシステムの特定の属性、特性、数量の定量化または評価を指します。 |
500, 1000, 1500, -22.3 |
NUMBER |
- |
- |
- |
- |
11 |
|
これは、特定の測定のカテゴリまたは分類を参照します。重量、温度、時間、数量など、測定される対象の性質またはタイプを定義します。 このドメインは、測定の数値を表す |
“kg/cm^3”, “m”, “meters”, “celsius” |
VARCHAR2(100) |
measure |
- |
- |
- |
12 |
|
特定の測定タイプでの測定の数値または定量表現。観測される現象の大きさまたは量を示します。 通常、このドメインは、測定の単位を表す |
1000, 45.67, -300, 0 |
NUMBER |
measure |
- |
- |
- |
13 |
|
月の名称。 |
"JANUARY", "FEBRUARY", ..., "DECEMBER" |
CHAR(10) |
- |
List - ["JANUARY", "FEBRUARY", ..., "DECEMBER"] |
|
- |
14 |
|
年における月の名称の省略表現。 |
"JAN", "FEB", ..., "DEC" |
CHAR(3) |
- |
List - ["JAN", "FEB", ..., "DEC"] |
|
- |
15 |
|
年の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 |
|
8つのシンボル(通常は0 - 7)を利用したBase-8記数法。各桁は8の累乗を表します。たとえば、8進数の12は10進数の10を表します。 |
"12345", "7777", "01010" |
VARCHAR2(4000) |
- |
REGEX - ^[0-7]*$ |
- |
- |
17 |
|
特定の標準に基づいて他のものと比較した位置。その位置を順序で示します。ランクは通常、正の整数です。 |
1, 2,3, 10, 100, 5000 |
INTEGER |
assessment |
CHECK >= 1 |
- |
- |
18 |
|
事前定義された基準に基づいて何かの品質、値またはパフォーマンスを評価するために与えられた数値または定性評価を示します。評価によって満足度、有効性または関連性を示すため、ユーザーが情報に基づいた意思決定を行うのに役立ちます。 |
-100, 0, 1, 45, 300 |
NUMBER |
assessment |
- |
- |
- |
19 |
|
様々なコンテキストでパフォーマンス、品質または成功を測定するために割り当てられた数値評価または評点を表します。スコアは、様々な状況でパフォーマンス・レベルまたは結果を評価および比較するための標準化された方法を提供します。 |
-100, 0, 1, 45, 300 |
NUMBER |
assessment |
- |
- |
- |
20 |
|
特定のタイムゾーンの名前を表す短縮形または頭字語。通常は文字で構成され、地域の標準時を迅速に識別するために使用されます。たとえば、東部標準時の「EST」、中央ヨーロッパ時間の「CET」などです。 このドメインは、数値形式のタイムゾーンを表す |
"PST", "IST", "EST" |
VARCHAR2(3) |
timezone |
- |
- |
- |
21 |
|
特定のタイム・ゾーンのローカル時間と協定世界時(UTC)との差異(時分単位)。これは、UTCの標準時間からの偏差を表し、時間をグローバルに調整するための参照点として機能します。正のオフセットはUTCより先の時間の場所を示し、負のオフセットはUTCより後の時間の場所を示します。 このドメインは、タイムゾーンの頭字語を表す |
"UTC+04:00", "UTC-03:30" |
VARCHAR2(20) |
timezone |
- |
- |
- |
22 |
|
数値形式の年。紀元前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 VIEW、ALTER VIEW、CREATE 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'表に対して発行された問合せ文の例を次に示します。
SELECT * FROM USER_ANNOTATIONS_USAGE WHERE Object_Name = 'EMPLOYEE' AND Object_Type = 'TABLE' AND Column_Name IS NULL;
SELECT * FROM USER_ANNOTATIONS_USAGE WHERE Object_Name = 'EMPLOYEE' AND Object_Type = 'TABLE' AND Column_Name IS NOT NULL;
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;