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; /