CREATE TYPEは、型の名前とそのプロパティ、メソッド、およびその他の特性を指定するために使用されます。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
CREATE TYPEは、以下の仕様の作成または置き換えを宣言します:
抽象データ型(ADT)
独立可変配列(VARRAY)型
独立ネスト表型
不完全オブジェクト型
不完全型は、前方型定義によって作成される型です。不完全と呼ばれるのは、名前はあるもののプロパティやメソッドがないからです。これは他の型から参照することができ、相互に参照する型をカスタマイズできるようにします。ただし、型を使用してテーブルの列、オブジェクト列、またはネスト表型の列を作成するには、事前に完全な型を作成しておく必要があります。
CREATE TYPE BODYは、その型の実装コードを持つことを宣言します。
説明
- 作成する型の仕様でプロパティのみを宣言し、メソッドを宣言しない場合は、Bodyを作成する必要はありません。
- CREATE TYPE宣言を使用すると、ネスト表とVARRAY型を作成できますが、関連配列は作成できません。PLブロックやパッケージでは、3種類の集合型を定義できます。
前提条件
スキーマ内に型を作成するには、CREATE TYPE システム権限が必要です。他のユーザーのスキーマ内に型を作成するには、CREATE ANY TYPE システム権限が必要です。これらの権限は直接付与することも、ロールを通じて付与することもできます。
その型の所有者には、定義で参照されているすべての他の型にアクセスするために、EXECUTE オブジェクト権限を明示的に付与するか、EXECUTE ANY TYPE システム権限を付与する必要があります。所有者はロールを通じてこれらの権限を取得することはできません。
型の所有者が他のユーザーに対してその型へのアクセス権限を付与する場合、所有者にその型の EXECUTE オブジェクト権限を GRANT OPTION で付与するか、ADMIN OPTION で EXECUTE ANY TYPE システム権限を付与する必要があります。そうでない場合、型の所有者には他のユーザーにその型へのアクセス権限を付与するための十分な権限がありません。
OceanBaseデータベースの現在のバージョンでは、CREATE TABLE ステートメントで新しいテーブルを作成する際、独自のオブジェクト型(ユーザー定義オブジェクト型 - UDTとも呼ばれる)を定義できますが、これらのカスタム型はデータベーステーブルの列のデータ型として使用することはできません。つまり、これらのUDTをテーブル構造の一部として直接使用することはできません。例えば、カスタムのオブジェクト型を直接指定して列を作成することはできません。
しかし、テーブル作成時にユーザー定義オブジェクト型(UDT)を使用できなくても、PL/SQLプログラムを記述する際には、カスタムオブジェクト型を使用して、プログラム内部で使用する変数、パラメータ、および関数の戻り値の型を定義できます。
構文
説明
この章では、主要な構文ノードの形式のみを記載しています。
create_type_stmtの形式は次のとおりです:
plsql_type_spec_sourceの形式は次のとおりです:
object_type_defの形式は次のとおりです:
attr_and_element_specの形式は次のとおりです:
element_specの形式は次のとおりです:
el_element_spec_list_ccの形式は次のとおりです:
element_spec_longの形式は次のとおりです:
inheritance_final_instantiable_clauseの形式は次のとおりです:
inheritance_overriding_instantiable_clauseの形式は次のとおりです:
subprogram_specの形式は次のとおりです:
proc_or_func_specの形式は次のとおりです:
セマンティクス
構文 |
キーワードまたは構文ノード |
説明 |
|---|---|---|
| create_type_stmt | OR REPLACE | その型を再作成し(既存の場合)、再コンパイルします。型を再定義する前に付与された権限を持つユーザーは、再度権限を取得することなく引き続きその型にアクセスできます。関数ベースのインデックスがその型に依存している場合、データベースはそのインデックスをDISABLEDとマークします。 |
| plsql_type_spec_source | pl_schema_name | 型を含むスキーマ名。デフォルトはご自身のスキーマです。 |
| plsql_type_spec_source | TYPE | ADTの名前、ネスト表型、またはVARRAY型。 |
| plsql_type_spec_source | FORCE | type_name が存在し、型依存関係はあるもののテーブル依存関係がない場合、FORCE はこのステートメントによる型の置換を強制します。(type_name にテーブル依存関係がある場合、FORCE の有無にかかわらず、ステートメントは失敗します。)
注意型 |
| plsql_type_spec_source | varray_type_def | 型を要素の順序付き集合として作成します。各要素は同じデータ型を持ちます。 |
| plsql_type_spec_source | nested_table_type_def | datatype という名前の型のネスト表を作成します。 |
| object_type_def | object_type_def | ADTを作成します。データ構造を形成する変数は属性(Attributes)と呼ばれます。ADTの動作を定義するメンバー・サブプログラムはメソッド(Methods)と呼ばれます。ADTを作成する際には、キーワード AS OBJECT を使用する必要があります。 |
| object_type_def | AS OBJECT | スキーマレベルのADTを作成します。この種のADTは、ルートADTと呼ばれることもあります。 |
| attr_and_element_spec | element_spec | ADTの各属性を指定します。 |
| subprogram_spec | subprogram_spec | サブプログラムを宣言します。 |
| subprogram_spec | member_or_static |
|
| subprogram_spec | proc_or_func_spec | ストアドプロシージャまたは関数のパラメータとデータ型を指定します。このサブプログラムにストアドプロシージャまたは関数の定義が含まれていない場合は、CREATE TYPE BODYコマンドで対応する定義を行う必要があります。サブタイプを作成する場合、ストアドプロシージャまたは関数の名前は、スーパータイプチェーンで宣言された任意のプロパティの名前(継承の有無にかかわらず)と同じにしてはなりません。 |
例
タイプコードの作成例
例1:オブジェクトタイプを作成する
person_typ という名前のオブジェクトタイプを作成します。このタイプには name と age の2つの属性と、オブジェクトの年齢を返すためのメンバー関数 get_age があります。
CREATE TYPE person_typ AS OBJECT (
name VARCHAR2(50),
age NUMBER,
MEMBER FUNCTION get_age RETURN NUMBER);
例2:可変長配列(VARRAY)タイプを作成する
number_list という名前の VARRAY 型を作成します。これは最大10個の数値を格納できます。
CREATE TYPE number_list AS VARRAY(10) OF NUMBER;
全体の使用例
オブジェクトタイプの作成を例に、完全な使用方法を示します。
ステップ1:オブジェクトタイプを作成する
まず、オブジェクトタイプとそのメンバー関数を定義する必要があります。ここでは、メンバー関数 get_age が単純にオブジェクトの年齢を返すものと仮定します。
CREATE OR REPLACE TYPE person_typ AS OBJECT (
name VARCHAR2(50),
age NUMBER,
MEMBER FUNCTION get_age RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY person_typ AS
MEMBER FUNCTION get_age RETURN NUMBER IS
BEGIN
RETURN self.age;
END get_age;
END;
/
ステップ2:PL/SQLからオブジェクトタイプを使用する
テーブル
peopleを作成します。CREATE TABLE people (person_id NUMBER, person_name VARCHAR2(50), person_age NUMBER);PL/SQLプログラム内で、
person_typ型の変数を宣言してこれらのデータを操作できます:DECLARE v_person person_typ := person_typ('Alice', 30); BEGIN -- peopleテーブルにデータを挿入する INSERT INTO people (person_id, person_name, person_age) VALUES (1, v_person.name, v_person.age); COMMIT; END; /