ストアドプロシージャ言語 (SPL) の次の 2 つの構成要素を使用して、オブジェクト型を作成し、データベースに格納することができます。

  • オブジェクト型の仕様は、オブジェクト型の属性と方法シグネチャを指定するパブリックインターフェイスです。
  • オブジェクト型本体には、オブジェクト型仕様で指定された方法の実装が含まれます。

次のセクションでは、オブジェクト型の仕様とオブジェクト型の本体の作成に使用される文について説明します。

オブジェクト型仕様の構文

オブジェクト型仕様の構文は次のとおりです。

CREATE [ OR REPLACE ] TYPE name
  [ AUTHID { DEFINER | CURRENT_USER } ]
  { IS | AS } OBJECT
( { attribute { datatype | objtype | collecttype } }
    [, ...]
  [ method_spec ] [, ...]
  [ constructor ] [, ...]
) [ [ NOT ] { FINAL | INSTANTIABLE } ] ... ;

method_spec は次のとおりです。

[ [ NOT ] { FINAL | INSTANTIABLE } ] ...
[ OVERRIDING ]
  subprogram_spec

subprogram_spec は次のとおりです。

{ MEMBER | STATIC }
{ PROCEDURE proc_name
    [ ( [  SELF [ IN | IN OUT ] name ]
        [, parm1 [ IN | IN OUT | OUT ] datatype1
                 [ DEFAULT value1 ] ]
        [, parm2 [ IN | IN OUT | OUT ] datatype2
                 [ DEFAULT value2 ]
        ] ...)
    ]
|
  FUNCTION func_name
    [ ( [  SELF [ IN | IN OUT ] name ]
        [, parm1 [ IN | IN OUT | OUT ] datatype1
                 [ DEFAULT value1 ] ]
        [, parm2 [ IN | IN OUT | OUT ] datatype2
                 [ DEFAULT value2 ]
        ] ...)
    ]
  RETURN return_type
}

コンストラクターは次のとおりです。

  CONSTRUCTOR func_name
    [ ( [  SELF [ IN | IN OUT ] name ]
        [, parm1 [ IN | IN OUT | OUT ] datatype1
                 [ DEFAULT value1 ] ]
        [, parm2 [ IN | IN OUT | OUT ] datatype2
                 [ DEFAULT value2 ]
        ] ...)
    ]
  RETURN self AS RESULT
現在、OR REPLACE オプションを使用して、既存のオブジェクト型の属性を追加、削除、または変更することはできません。 このオプションを使用する前に、DROP TYPE 文を使用して、最初に既存のオブジェクト型を削除する必要があります。 ただし、OR REPLACE オプションを使用して、既存のオブジェクト型のメソッドを追加、削除、または変更することができます。

PostgreSQL 形式の ALTER TYPE ALTER ATTRIBUTE 文を使用して、既存のオブジェクト型の属性のデータ型を変更することができます。 ただし、ALTER TYPE 文を使用して、オブジェクト型の属性を追加または削除することはできません。

name は、オブジェクト型に割り当てられた識別子です。 オプションでスキーマ修飾されます。

AUTHID 句が省略されているか、DEFINER が指定されている場合、オブジェクト型所有者の権限を使用して、データベースオブジェクトへのアクセス権限が決定されます。 CURRENT_USER が指定されている場合には、オブジェクトのメソッドを実行している現在のユーザーの権限を使用して、アクセス権限が決定されます。

attribute は、オブジェクト型の属性に割り当てられた識別子です。

datatype は基本データ型です。

objtype は、以前に定義されたオブジェクト型です。

collecttype は、以前に定義されたコレクション型です。

CREATE TYPE 定義の閉じ括弧に続く[NOT] FINAL は、このオブジェクト型からサブタイプを派生できるかどうかを指定します。 FINAL がデフォルト値です。 つまり、このオブジェクト型からサブタイプを派生させることはできません。 このオブジェクト型でサブタイプを定義できるようにする場合は、NOT FINAL を指定します。

NOT FINAL の指定は CREATE TYPE 文で受け入れられますが、SPL はサブタイプの作成をサポートしていません。

CREATE TYPE 定義の閉じ括弧に続く [NOT] INSTANTIABLE は、このオブジェクト型のオブジェクトインスタンスを作成できるかどうかを指定します。 INSTANTIABLE がデフォルト値です。 これは、このオブジェクト型のインスタンスを作成できることを意味します。 このオブジェクト型を、他の特殊なサブタイプを定義する親テンプレートとしてのみ使用する場合は、NOT INSTANTIABLE を指定します。 NOT INSTANTIABLE が指定されている場合は、NOT FINAL も指定する必要があります。 オブジェクト型のメソッドに NOT INSTANTIABLE 修飾子が含まれている場合、オブジェクト型は NOT INSTANTIABLE および NOT FINAL で定義する必要があります。

NOT INSTANTIABLE の指定は CREATE TYPE 文で受け入れられますが、SPL はサブタイプの作成をサポートしていません。

method_spec は、メンバーメソッドまたは静的メソッドの仕様を示します。

メソッドを定義する前に、[NOT] FINAL は、メソッドをサブタイプで上書きできるかどうかを指定します。 NOT FINAL がデフォルト値です。 これは、メソッドをサブタイプで上書きできることを意味します。

メソッドがスーパータイプの同じ名前のメソッドを上書きする場合は、メソッドの定義の前に OVERRIDING を指定します。 上書きするメソッドは、スーパータイプで定義されているのと同じ数の同じ名前のメソッドパラメーター、同じデータ型とパラメーターモード、同じ順序と同じ戻り値の型 (メソッドが関数の場合) を持っている必要があります。

メソッドの定義の前に、[NOT] INSTANTIABLE は、オブジェクト型定義がメソッドの実装を提供するかどうかを指定します。 INSTANTIABLE が指定されている場合、オブジェクト型の CREATE TYPE BODY 文でメソッドの実装を指定する必要があります。 NOT INSTANTIABLE が指定されている場合、オブジェクト型の CREATE TYPE BODY 文にメソッドの実装が含まれていてはなりません。 後者の場合、サブタイプに、このオブジェクト型のメソッドを上書きするメソッドの実装が含まれていると仮定すると、 オブジェクト型に NOT INSTANTIABLE メソッドがある場合、オブジェクト型の定義では、オブジェクト型仕様の閉じ括弧の後に、 NOT INSTANTIABLE および NOT FINAL を指定する必要があります。 デフォルト値は INSTANTIABLE です。

subprogram_spec は、プロシージャまたは関数の仕様を示し、MEMBER または STATIC の仕様で始まります。 メンバーサブプログラムは、特定のオブジェクトインスタンスに対して呼び出す必要がありますが、静的サブプログラムは、オブジェクトインスタンスに対して呼び出すことはできません。

proc_name は、プロシージャの識別子です。 SELF パラメーターが指定されている場合、name は CREATE TYPE 文で指定されたオブジェクト型名です。 この状況では、parm1、parm2 などがプロシージャの仮パラメーターです。 datatype1、datatype2 などは、それぞれ parm1、parm2 などの データ型です。 IN、IN OUT、および OUT は、各仮パラメーターの可能なパラメーターモードです。 それらのいずれも指定されていない場合、デフォルト値は IN です。 value1、value2 などは、IN パラメーターに指定できるデフォルト値です。

コンストラクターを定義するには、CONSTRUCTOR キーワードと関数定義を含める必要があります。

func_name は関数の識別子です。 SELF パラメーターが指定されている場合、name は CREATE TYPE 文で指定されたオブジェクト型名です。 この状況では、parm1、parm2 などが関数の仮パラメーターです。 datatype1、datatype2 などは、それぞれ parm1、parm2 などのデータ型です。 IN、IN OUT、および OUT は、各仮パラメーターの可能なパラメーターモードです。 それらのいずれも指定されていない場合、デフォルト値は IN です。 value1、value2 などは、IN パラメーターに指定できるデフォルト値です。 return_type は、関数の戻り値のデータ型です。

オブジェクト型の仕様については、次の点にご注意ください。

  • オブジェクト型には、少なくとも 1 つの属性が定義されている必要があります。
  • オブジェクト型で定義さているメソッドがない、1 つまたは複数のメソッドが定義されている場合があります。
  • 各メンバーメソッドには、SELF という名前の暗黙の組み込みパラメーターがあり、そのデータ型は定義されているオブジェクト型のデータ型です。

    SELF は、メソッドを呼び出しているオブジェクトインスタンスを参照します。 SELF は、例えば MEMBER のように、パラメーターリストの IN または IN OUT パラメーターとして明示的に宣言できます。 FUNCTION (SELF IN OUT object_type ...).

    SELF が明示的に宣言されている場合、パラメーターリストの最初のパラメーターである必要があります。 SELF が明示的に宣言されていない場合、そのパラメーターモードは、メンバープロシージャの場合はデフォルトで IN OUT になり、メンバー関数の場合は IN になります。

  • 静的メソッドは上書きできません。 OVERRIDING と STATIC を method_spec で一緒に指定することはできません。
  • 静的メソッドはインスタンス化可能である必要があります。 NOT INSTANTIABLE と STATIC を method_spec で一緒に指定することはできません。

オブジェクト型本体の構文

オブジェクト型本体の構文は次のとおりです。

CREATE [ OR REPLACE ] TYPE BODY name
  { IS | AS }
  method_spec [...]
  [constructor] [...]
END;

method_spec は次のとおりです。

subprogram_spec

subprogram_spec は次のとおりです。

{ MEMBER | STATIC }
{ PROCEDURE proc_name
    [ ( [  SELF [ IN | IN OUT ] name ]
        [, parm1 [ IN | IN OUT | OUT ] datatype1
                 [ DEFAULT value1 ] ]
        [, parm2 [ IN | IN OUT | OUT ] datatype2
                 [ DEFAULT value2 ]
        ] ...)
    ]
{ IS | AS }
  [ PRAGMA AUTONOMOUS_TRANSACTION; ]
  [ declarations ]
  BEGIN
    statement; ...
[ EXCEPTION
    WHEN ... THEN
      statement; ...]
  END;
|
  FUNCTION func_name
    [ ( [  SELF [ IN | IN OUT ] name ]
        [, parm1 [ IN | IN OUT | OUT ] datatype1
                 [ DEFAULT value1 ] ]
        [, parm2 [ IN | IN OUT | OUT ] datatype2
                 [ DEFAULT value2 ]
        ] ...)
    ]
  RETURN return_type
{ IS | AS }
  [ PRAGMA AUTONOMOUS_TRANSACTION; ]
  [ declarations ]
  BEGIN
    statement; ...
[ EXCEPTION
    WHEN ... THEN
      statement; ...]
  END;

コンストラクターは次のとおりです。

  CONSTRUCTOR func_name
    [ ( [  SELF [ IN | IN OUT ] name ]
        [, parm1 [ IN | IN OUT | OUT ] datatype1
                 [ DEFAULT value1 ] ]
        [, parm2 [ IN | IN OUT | OUT ] datatype2
                 [ DEFAULT value2 ]
        ] ...)
    ]
  RETURN self AS RESULT
{ IS | AS }
  [ declarations ]
  BEGIN
    statement; ...
[ EXCEPTION
    WHEN ... THEN
      statement; ...]
  END;

name は、オブジェクト型に割り当てられた識別子です。 オプションでスキーマ修飾されます。

method_spec は、CREATE TYPE 文で指定されたインスタンス化可能なメソッドの実装を示します。

INSTANTIABLE が CREATE TYPE 文の method_spec で指定または省略されている場合には、CREATE TYPE BODY 文にこのメソッドの method_spec が必要です。

CREATE TYPE 文の method_spec に NOT INSTANTIABLE が指定されている場合には、CREATE TYPE BODY 文にこのメソッドの method_spec があってはなりません。

subprogram_spec は、プロシージャまたは関数の仕様を示し、MEMBER または STATIC の仕様で始まります。 CREATE TYPE 文の subprogram_spec で指定されたものと同じ修飾子を使用する必要があります。

proc_name は、CREATE TYPE 文で指定されたプロシージャの識別子です。 パラメーター宣言は CREATE TYPE 文で説明したのと同じ意味を持ち、CREATE TYPE 文で指定したのと同じ方法で CREATE TYPE BODY 文で指定する必要があります。

コンストラクターを定義するには、CONSTRUCTOR キーワードと関数定義を含める必要があります。

func_name は、CREATE TYPE 文で指定された関数の識別子です。 パラメーター宣言は CREATE TYPE 文で説明したのと同じ意味を持ち、 CREATE TYPE 文で指定したのと同じ方法で CREATE TYPE BODY 文で指定する必要があります。 return_type は、関数の戻り値のデータ型であり、CREATE TYPE 文で指定された return_type と一致する必要があります。

PRAGMA AUTONOMOUS_TRANSACTION は、プロシージャまたは関数を自律型トランザクションとして設定するディレクティブです。

宣言は、変数、カーソル、型、またはサブプログラムの宣言です。 サブプログラム宣言が含まれている場合は、他のすべての変数、カーソル、および型宣言の後に宣言する必要があります。

statement は SPL プログラム文です。